1. 程式人生 > >shell中的變數

shell中的變數

一、什麼是shell變數?
變數:變數即在程式執行過程中它的值是允許改變的量。變數是用一串固定的字元來標示不固定的值的一種方法。變數是一種使用方便的佔位符,用於引用計算機記憶體地址,該地址可以儲存 Script 執行時可更改的程式資訊,在 shell 中變數是不能永久儲存在系統中的,必須在檔案中宣告。
二、shell變數的分類
shell變數分為三類,分別為環境級變數,使用者級變數,系統級變數;
(1)環境級變數只在當前shell中生效,shell關閉變數丟失,
(2)使用者級變數寫在使用者的骨檔案中,只針對當前使用者有效,
(3)系統級變數被寫在系統的配置檔案/etc/profile中
變數即在程式執行時儲存在記憶體中。
硬碟永久,記憶體臨時的。

當你登陸 Linux 並取得一個 bash 之後,你的 bash 就是一個獨立的程式,這個程式的識別使用的一個 PID。接下來你在這個 bash 下面所下達的任何指令都是由這個 bash 所衍生出來的,那些被下達的指令就被稱為子程式了。我們在原本的 bash 下面執行另一個 bash,結果操作的環境會跑到第二個 bash 去(就是子程式),那原本的 bash 就會在暫停的情況(就是 sleep)。整個指令執行的環境是實線的部分!若要回到原本的 bash 去,就只有將第二個 bash 結束掉(下達 exit 或 logout) 才行。
因為子程式僅會繼承父程式的環境變數,子程式不會繼承父程式的自訂變數。所以在原本 bash 的自訂變數在進入了子程式後就會消失不見,一直到你離開子程式並回到原本的父程式後,此變數才會又出現。
可通過 export 將自訂變數轉成環境變數。

例子1:環境級變數

[root@localhost mnt]# a=1
#設定a的值為1
[root@localhost mnt]# echo $a
#顯示a的值
1
[root@localhost mnt]# bash
#重新執行bash
[root@localhost mnt]# ps f
#檢視子級程序
  PID TTY      STAT   TIME COMMAND
 3926 pts/1    Ss     0:02 -bash
 8413 pts/1    S      0:00  \_ bash
 8451 pts/1    R+     0:00      \_ ps f
 2065 pts/0
Ss+ 0:00 /bin/bash 578 tty1 Ss+ 0:10 /usr/bin/Xorg :0 -background 8440 pts/1 S 0:00 dbus-launch --autolaunch=946 [root@localhost mnt]# echo $a #顯示a的值

環境級變數

[root@localhost mnt]# export a=1
#臨時修改環境級變數,父級程序做一個宣告,子程序也有值
[root@localhost mnt]# echo $a
#顯示a的值
1
[root@localhost mnt]# bash
#重新執行一次bash
[root@localhost mnt]# echo $a
#顯示a的值
1
然後退出當前使用者,登陸系統時,a值不能顯示
[kiosk@foundation60 Desktop]$ ssh root@172.25.254.218
root@172.25.254.218's password: 
Last login: Thu Jun 21 22:23:46 2018 from 172.25.254.60
[[email protected] ~]# echo $a

例子2:使用者級變數

使用者級變數只對當前使用者有效,對其他使用者沒有效;

[root@localhost ~]# vim .bash_profile 
#編輯.bash_profile檔案
export a=5
[root@localhost ~]# source .bash_profile
#重新執行.bash_profile檔案
[root@localhost ~]# echo $a
#顯示a的值
5
[root@localhost ~]# su - student
#切換到student使用者
[student@localhost ~]$ echo $a
#顯示a的值,此時不能顯示,因為只對當前使用者有效
[kiosk@foundation60 Desktop]$ ssh root@172.25.254.218
root@172.25.254.218's password: 
Last login: Fri Jun 22 01:38:56 2018 from 172.25.254.60
[[email protected] ~]# echo $a
#顯示a的值
5

例子3:系統級變數

[root@localhost ~]# vim /etc/profile
#編輯/etc/profile檔案
export a=5
[root@localhost ~]# source /etc/profile
#重新重新整理配置檔案
[root@localhost ~]# echo $a
#顯示a的值
5
[root@localhost ~]# su - student
#切換到student使用者
Last login: Sun Jun 17 04:56:52 EDT 2018 on pts/1
[student@localhost ~]$ echo $a
#顯示a的值
5 

變數名稱的規範

1.變數名稱中通常包含大小寫字字母,數字,下劃線(不是必須)。
2.變數名稱格式:
WESTOS_LINUX
Westos_Linux
westoS_Linux

三、字元的轉譯及變數的宣告

\      轉譯單個字元
""     弱引用,批量轉譯 "" 中出現的字元,
''     強引用,批量轉譯 '' 中出現的字元
''"" 兩者的區別在於, ""弱引用不能轉譯 "\","`","!","$"
${}    變數宣告
()     等於``   表示先執行

示例
” ” #代表弱引用, hostname#代表先執行hostname
這裡寫圖片描述
” “#代表弱引用,第一個\代表轉義字元,第二格\代表字元
‘ ‘如果是強引用的話,直接輸出\
這裡寫圖片描述
” “#代表強引用
‘‘#代表弱引用
這裡寫圖片描述
變數聲名
這裡寫圖片描述
()代表先執行
echo $a:預設顯示第一個值

echo ${a[0]} :顯示第一個值
這裡寫圖片描述
這裡寫圖片描述

四、 變數值傳遞

$1        指令碼後的第一串字元
$2        指令碼後的第一串字元
$#        指令碼後字串的個數
$*        指令碼後所有字串"1 2 3 4 ..."
[email protected]        指令碼後所有字串"1" "2" "3" "..."

例子

這裡寫圖片描述
這裡寫圖片描述
這裡寫圖片描述

例子2:建立使用者

編輯使用者檔案

這裡寫圖片描述]
這裡寫圖片描述
編輯密碼檔案
這裡寫圖片描述
這裡寫圖片描述
編輯指令碼:首先判斷檔案個數是否不等於2,如果是,執行建立使用者,如果不是,請輸入一個檔名和密碼
這裡寫圖片描述
這裡寫圖片描述
執行指令碼sh user.sh userfile passwdfile
這裡寫圖片描述

read變數引數傳遞

read 實現變數傳遞
read -p " "      變數
read -p " " -s   加密變數

例子:檢查網路是否通暢,如果通暢輸出IPisup,IP is down

編輯westos.sh檔案
這裡寫圖片描述
編寫 的指令碼
這裡寫圖片描述
執行指令碼後我們顯示172.25.254.218這臺主機的網路是通暢的,所以驗證指令碼正確
這裡寫圖片描述

指令碼示例二:

檢測userfile檔案是否存在,如果存在,繼續檢測passwdfile檔案是否存在,如果不存在那麼顯示請輸入使用者檔案;若passwdfile檔案不存在,那麼直接顯示請輸入密碼檔案,如果passwd檔案存在的話,執行建立使用者的操作

[[email protected] mnt]# vim user.sh 
#!/bin/bash
read -p "please input user file: " USERFILE
[ ! -e $USERFILE ]&&{
    echo -e "\033[31mERROR: $USERFILE is not exist!!\033[0m"
    exit 1
}

read -p "please input password file: " PASSWDFILE
[ ! -e $PASSWORD ]&&{
    echo -e "\033[31mERROR: $PASSWDFILE is not exist!!\033[0m"
    exit 1
}
MAX_LINE=`awk 'BEGIN{N=0}{N++}END{print N}' $USERFILE`
for NUM in `seq 1 $MAX_LINE`
do
     USERNAME=`sed -n ${NUM}p $USERFILE`
     PASSWORD=`sed -n ${NUM}p $PASSWDFILE`
     useradd  $USERNAME
     echo $PASSWORD| passwd --stdin $USERNAME
done
[[email protected] mnt]# sh user.sh 
please input user file: userfile
please input password file: passwdfile
Changing password for user user1.
passwd: all authentication tokens updated successfully.
Changing password for user user2.
passwd: all authentication tokens updated successfully.
Changing password for user user3.
passwd: all authentication tokens updated successfully.
[[email protected] mnt]# rm -fr userfile
#如果我們將使用者檔案刪除;
[[email protected] mnt]# sh user.sh 
#執行指令碼,我們可以看到使用者檔案不存在
please input user file: userfile
ERROR: userfile is not exist!!

五、命令別名的設定

alias    # 命令別名設定
unalias  # 撤銷命令別名

alias    # 在當前shell下的定別名(退出後自動消失)
編輯如下:
alias x='vim'

/使用者家目錄下/.bashrc  #別名設定:使用者級 
/etc/bashrc  #別名設定:系統級
編輯完成,執行 source + 檔名進行重新整理。

使用者級別名的設定

編輯使用者家目錄的檔案(.bashrc),設定別名
例子
這裡寫圖片描述
這裡寫圖片描述
這裡寫圖片描述
這裡寫圖片描述
這裡寫圖片描述

系統級別別名的設定

編輯/etc/bashrc檔案設定別名
這裡寫圖片描述
這裡寫圖片描述
重新整理/etc/bashrc檔案
這裡寫圖片描述
切換到student使用者下
這裡寫圖片描述
當我們在student使用者下,執行haha時調出了vim 的介面
這裡寫圖片描述
這裡寫圖片描述

六、函式

function fname() {
程式段
}
fname 是我們的自訂的執行指令名稱,而程式段就是我們要他執行的內容。
要注意的是,因為 shell script 的執行方式是由上而下,由左而右,
因此在 shell script 當中的 function 的設定一定要在程式的最前面,
這樣才能夠在執行時被找到可用的程式段

指令碼示例一:

檢查網路是否通暢,若通暢輸出IPisup;IP is down

[[email protected] mnt]# vim ip_check.sh 
#!/bin/bash
PING()
{       read -p "please input a ipaddress: " IP
        ping -c1 -w1 $IP &>/dev/null

        [ "$?" -eq "0" ] && {
             echo $IP is up
        } || {
             echo $IP is down
        }
}
PING
~  
 [[email protected] mnt]# sh ip_check.sh 
please input a ipaddress: 172.25.254.118
172.25.254.118 is down
[[email protected] mnt]# sh ip_check.sh 
please input a ipaddress: 172.25.254.218
172.25.254.218 is up               

指令碼示例二:

檢查教室裡1到50臺主機中,哪些主機的網路是通暢的,並輸出這些主機
這裡寫圖片描述
這裡寫圖片描述這裡寫圖片描述
這裡寫圖片描述

相關推薦

Shell程式設計-04-Shell變數數值計算

算術運算子     在任何一門形式的語言中均會存在算術運算的情況,Shell常見的運算子如下所示: 運算子 含義 + - * / % 加 減 乘 除 求餘 ** 冪運算 ++

awk引用shell變數的幾種方法

一:"'$var'" 這種寫法大家無需改變用'括起awk程式的習慣,是老外常用的寫法.如: var="test" awk 'BEGIN{print "'$var'"}' 這種寫法其實就是把一對單引號分成了兩段單引號,中間的shell變數直接按照shell變數的引用

Bash Shell變數自增的實現方法

Linux Shell中寫迴圈時,常常要用到變數的自增,現在總結一下整型變數自增的方法。 我所知道的,bash中,目前有五種方法: 1. i=`expr $i + 1`; 2. let i+=1; 3. ((i++)); 4. i=$[$i+1]; 5. i=$(( $i

Linux bash shell變數的設定和使用

給變數賦值直接使用符號=,如name=kylin 使用這個變數時需要在前邊加上$符號,如echo $name, 另外,如果變數中的內容比較複雜,使用大括號是比較安全的辦法,如${name}, 如果變數所賦值中需要有空格則要加上雙引號或者單引號。 雙引號和單引號的區別在於,雙

shell特殊的變數型別---位置引數

linux系統規定: $0:表示當前shell指令碼的名稱 $#:表示指令碼中總共的引數個數 $*:表示指令碼中所有引數的值 $?:表示上一條命令執行後的返回值 $1,$2,$3.....表示指令碼中的第一,第二,第三個引數。。。依此類

Shell程式設計-03-Shell的特殊變數和擴充套件變數

特殊變數     在Shell中的特殊變數主要分別兩種位置引數變數、狀態變數兩種。 位置引數變數     Shell中的位置引數變數主要是指$0、$1、$#等,主要用於從命令列、函式或指令碼執行等地方傳遞引數。詳細說明如下所示: $0:獲取當前執行的Shell指令碼的檔名,如指令碼中包含路徑,則

Linux Shell Bash 變數賦值 的作用

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!        

Shell的多變數動態賦值問題

實際文字處理的時候會碰到多個變數,動態賦值的問題。比如說在遍歷1到100的數字,將其動態賦值給 var_1=1 var_2=2 var_3=3 ...... var_100=100 如果按常規的話,是賦值不成功,這個時候要藉助declare和export來完成 藉助decla

Shell的位置引數變數

Shell中的位置引數變數 位置引數變數 介紹 當我們執行一個 shell 指令碼時,如果希望獲取到命令列的引數資訊,就可以使用到位置引數變數,比如 : ./myshell.sh 666 888 , 這個就是一個執行 shell 的命令列,可以在 myshell 指令碼中獲取到引數資訊

Shell的預定義變數

Shell中的預定義變數 就是 shell 設計者事先已經定義好的變數,可以直接在 shell 指令碼中使用 基本語法 $$ (功能描述:當前程序的程序號(PID)) $! (功能描述:後臺執行的最後一個程序的程序號(PID)) $? (功能描述:最後一次執行的命令的返回狀態。如果這

shell判斷變數是否為空

1.變數通過“ ”引號引起來     如下所示,可以得到結果為 is null      #!/bin/bash para1= if[! -n "$para1"] then echo "is null" else

《鳥哥的Linux私房菜》之shell變數

1、變數的定義   var=value 直接使用key=value的形式,等號中間不能有空格等空白字元 2、變數的輸出 echo ${varName} 通過echo輸出內容 ${xxx}表示引用某個叫xxx的變數 Note:如果echo 後是'',那麼單引號內的內容原

shell區域性變數及local命令

http://blog.csdn.net/wangjianno2/article/details/50200617 感謝 shell中區域性變數及local命令 local一般用於區域性變數宣告,多在在函式內部使用。 (1)shell指令碼中定義的變數是global的,其作用

Linux Shell Bash 變數賦值 的作用

  1 #!/bin/bash  2 # "裸體"變數  3   4 echo  5   6 # 變數什麼時候是"裸體"的, 比如前邊少了$的時候?  7 # 當它被賦值的時候, 而不是被引用的時候.  8   9 # 賦值 10 a=879 11 echo "The value of \"a\" is $a

linuxshell變數的數值計算

1、expr命令 a=123 expr $a + 10 ##加法 expr $a - 10 ##減法 expr $a \*

Shell的特殊位置引數變數全文收錄

一、位置引數變數的作用 一句話概括:我們要從命令列、函式或者指令碼執行等處傳遞引數時,就需要在shell指令碼中使用位置引數變數 二、Shell中的特殊未知引數變數有哪些 1)$0 作用:獲取當前執行的shell指令碼的指令碼名字(如果指令碼中包含了路徑,那獲取的就是指令碼路徑)2)$n

全域性變數在父、子shell起作用

[email protected]:~$ m='hh' [email protected]:~$ export m [email protected]:~$ echo $m hh [email protected]:~$ sh $ echo $m hh

詳細解析Shell的IFS變數

題圖:Photo by Jacob Postuma on Unsplash 本文原創釋出於微信公眾號“洛奇看世界”,一個大齡2b碼農的世界 這裡的Shell主要指bash,學習bash的前前後後在IFS變數上吃了不少苦頭,雖然花了不少時間,

shell變數及函式

############################1.變數###################################################簡介:   (1)什麼是變數?        變數即在程式執行過程中它的值是允許改變的量,變數是用一串固定的字

SHELL一個指令碼如何引用另一個指令碼的定義的變數

建立一個 sh.config的指令碼 #PATH------------------------------------------------------------ bakFile=/ngbboss/mddms/inter/onlineto/bakfile logFil