與Shell變量相關的幾個命令:
變量只在當前Shell中生效.
source 這個命令讓腳本影響他們父Shell的環境(. 可以代替source命令)
export 這個命令可以讓腳本影響其子Shell的環境? ()
unset 從環境中刪除變量
?
其他幾個與變量有關的命令:
declare: 用于顯示或設置變量
let: 用于求整數表達式的值
local: 用于創建不能傳給子Shell的變量, 這個命令僅在過程內部有效
readonly: 用于顯示或者設置只讀變量
set: 用于設置或者重置各種Shell選項(不僅用于變量)
shift: 用于移動位置變量
typeset: 用于顯示或者設置變量(同declare)
?
變量賦值
logfile="stdout.log" echo "$logfil"
1、變量賦值——沒有類型,根據賦值的類型決定變量類型,可以多次隨意賦值。賦值號兩邊不能有空格
1)顯示定義:VAR=value
變量聲明時使用的引號不會被保留,當變量值中有空格時必須使用引號
2)讀取:read VAR
-
一次讀入一行!?可以一次讀入多個變量read。
-
read firstname lastname 輸入:steve Parker Smith 以空格分,最后一個變量兩個 輸入:steve 給的少,后一個變量為空字符串,一直存在于shell中,可以在當前shell中用set | grep name=查看
-
- 從文件讀入
-
read password < /etc/passwd讀入一行 while read passwd doecho $passwd done < /etc/passwd一直循環讀,直到不再輸入
-
- read -p “what file do you want to test?" filename 命令替換:
-
- 命令賦值:VAR=`date`、 VAR=$(date)
- 數值計算:c=`expr $a +4`、c=let $a + 4 ?、$(($a+$b)) 但也有點區別:有的shell不支持,是否有對非數值進行的先驗(expr沒有)
- 將變量值設置為某個給定命令的輸出,其時是第一種賦值方式的變種
-
TODAY=`date +%A`動態賦值
-
?
引用變量
2、引用變量——的格式是${變量名} ? $(variable)bar ? ?echo $variable bar ${variable}bar
訪問不存在的變量只會返回空字符串或0,具體取決與上下文,所以當將某個變量名寫錯時,不會報錯,還能有結果;?
變量名區分大小寫
?
3、支持一維數組變量:
[lixn@localhost ~]$ Users=(zsan lisi wangwu zhangsan lisi) 定義一維數組 [lixn@localhost ~]$ echo $Users 索引 zsan [lixn@localhost ~]$ echo ${Users[0]} zsan [lixn@localhost ~]$ echo ${Users[2]} wangwu [lixn@localhost ~]$ echo ${Users} zsan [lixn@localhost ~]$ echo ${Users[*]} zsan lisi wangwu zhangsan lisi [lixn@localhost ~]$ echo ${#Users[*]} 返回數組長度 5 [lixn@localhost ~]$ echo ${#Users[2]} 返回元素值的長度 6 [lixn@localhost ~]$ Users[1]=wlm 修改值 [lixn@localhost ~]$ Account=(${Users[*]}) 數組之間賦值 [lixn@localhost ~]$ echo ${Account[*]} zsan wlm wangwu zhangsan lisi
?
特殊變量
${#var}?變量的長度
特殊變量由bash自動定義和賦值,用戶不能修改。
$$:當前進程號
$?:前一個命令的退出狀態,0表示執行成功,1標志執行失敗
$0:存儲命令本身——位置參數
$1-$n:依次代表命令行參數,當大于9時,用{}括起來,如${10}——位置參數
$#:命令行參數的個數,不包括命令本身
$*:保存了全部的命令行參數。不包含命令本身 $@
$!:后臺程序的pid
?
其他
basename命令——去掉位置參數的路徑信息,所以./scropt.sh、/usr/local/bin/script.sh等會被轉化為script.sh
Myname is `basename $0`
shift命令——多用于“下一個參數”,shift內置命令每次調用時將所有參數進行一次移位,首先截去$1,然后截去$2....無法將移位逆向進行。
shift也可以一次截去多個變量(shift 3 ?或者 ?shift shift shift)多用后者
#!/bin/bash echo "My name is `basename $0` - I was called as $0" echo "I was called with $# parameters." count=1 while [ "$#" -ge "1" ]; doecho "Parameter number $count is: $1"let count=$count+1shift done[lixn@Fedora24 bash_learn]$ ./shift.sh My name is shift.sh - I was called as ./shift.sh I was called with 0 parameters. [lixn@Fedora24 bash_learn]$ ./shift.sh one two three My name is shift.sh - I was called as ./shift.sh I was called with 3 parameters. Parameter number 1 is: one Parameter number 2 is: two Parameter number 3 is: three
$*和$@的使用與區別
?
刪除變量——unset myvar;將變量賦值為空字符串也能實現變量的刪除,但與unset不完全相同
?