聲明變量java
a-zA-Z
開頭,不包含特殊字符PATH="/user/yihui"
使用shell
{}
進行變量名的圈定readonly
修飾變量爲不可更改unset
刪除變量(且沒法再次聲明和使用,只讀變量沒法刪除)PATH="/user/yihui" echo "the path is ${PATH}/tmp" PATH="/test" echo "after modify, the new path is ${PATH}/tmp" readonly PATH PATH="/new"
// 輸出爲: the path is /user/yihui/tmp after modify, the new path is /test/tmp ./in.sh: line 12: PATH: readonly variable
特殊變量數組
Shell特殊變量:Shell $0, $#, $*, $@, $?, $$和命令行參數函數
$$
表示當前Shell進程的ID,即pid$0
當前的腳本名$#
傳遞給腳本或函數的參數個數。$n
傳遞給腳本或函數的參數。n是一個數字,表示第幾個參數,例如,第一個參數是$1
,第二個參數是$2
$?
上個命令的退出狀態,或函數的返回值$*
傳遞給腳本或函數的全部參數$@
傳遞給腳本或函數的全部參數, 與$*
區別在於被雙引號(" ")包含時,"$*" 會將全部的參數做爲一個總體,以"$1 $2 … $n"
的形式輸出全部參數;"$@" 會將各個參數分開,以"$1" "$2" … "$n"
的形式輸出全部參數echo "current pid:$$" echo "arg num: $#" echo "shell name: $0" echo "second arg: $2" echo "last return $?" for var in $*: do echo "$var" done echo "\$*=" $* echo "\$*=$*" for var in $@: do echo "$var" done echo "\$*=" $@ echo "\$@=$@"
current pid:36886 arg num: 4 shell name: ./in.sh second arg: hello last return 0 test hello wolrd 123: $*= test hello wolrd 123 $*=test hello wolrd 123 test hello wolrd 123: $*= test hello wolrd 123 $@=test hello wolrd 123
命令替換測試
限制性shell命令,並將結果保存在變量之中ui
用反引號,將shell命令包含起來便可命令行
Data=`date` echo "data is $Data" UNUM=`who | wc -l` echo "current user num: $UNUM"
data is 2017年 5月21日 星期日 14時54分19秒 CST current user num: 2
變量替換code
上面使用
${varName}
來表示變量,放在雙引號中時,會自動被值替換,下面給出一些擴展進程
${var:-word}
若是變量 var 爲空或已被刪除(unset),那麼返回 word,但不改變 var 的值${var:=word}
若是變量 var 爲空或已被刪除(unset),那麼返回 word,並將 var 的值設置爲 word${var:?message}
若是變量 var 爲空或已被刪除(unset),那麼將消息 message 送到標準錯誤輸出,能夠用來檢測變量 var 是否能夠被正常賦值。 若此替換出如今Shell腳本中,那麼腳本將中止運行${var:+word}
若是變量 var 被定義,那麼返回 word,但不改變 var 的值數學運算字符串
使用 expr xxx
expr $a + $b
表示兩數相加數學判斷
布爾運算
注意
條件表達式要放在方括號之間,而且要有空格,例如 [$a==$b] 是錯誤的,必須寫成 [ $a == $b ]
#!/bin/sh a=10 b=20 val=`expr $a + $b` echo "a + b : $val" val=`expr $a - $b` echo "a - b : $val" val=`expr $a \* $b` echo "a * b : $val" val=`expr $b / $a` echo "b / a : $val" val=`expr $b % $a` echo "b % a : $val" if [ $a == $b ] then echo "a is equal to b" fi if [ $a != $b ] then echo "a is not equal to b" fi
輸出
a + b : 30 a - b : -10 a * b : 200 b / a : 2 b % a : 0 a is not equal to b
字符串運算
${#varName}
${arName:1:4}
a="hello" b="world" if [ $a = $b ];then echo "a equal b" elif [ $a != $b ];then echo "a not equal b" fi if [ $a ];then echo "$a is not blank" fi if [ -n $a ];then echo "$a's length bigger then 0" fi echo "$a's length ${#a}" echo "$a index of 1, 4 is ${a:1:4}"
a not equal b hello is not blank hello's length bigger then 0 hello's length 5 hello index of 1, 4 is ello
聲明
ary=(value1 value2 value3)
讀取
第0個元素: ${ary[0]}
全部元素: $ary[*]
$ary[@]
長度 : ${#ary[*]}
ary=('hello' 'world' 'java' 'shell') echo $ary echo ${ary[1]} echo "all cell is : ${ary[*]}" echo "length ${#ary[*]}"
hello world all cell is : hello world java shell length 4
if語句
語法:
if [ condition ]; then xxx elif [ condition ]; then xxx else xxx fi
switch語句
語法:
case value in: v1) xxx xxx ;; v2) xxx xxx ;; *) xxx ;;; esac
測試
ary=('hello' 'world' 'java' 'shell') if [ ${ary[0]} = 'helo' ];then echo "first cell is helo" elif [ ${ary[0]} = 'hello' ];then echo "first cell is hello" else echo "default" fi read option case $option in ${ary[0]}): echo "print hello" ;; ${ary[1]}): echo "print world" ;; ${ary[2]}): echo "print java" ;; ${ary[3]}): echo "print shell" ;; *): echo "print other" ;; esac
輸出
first cell is hello java <-- 這個是本身輸入的 print java
for循環
語法
for 變量 in 列表: do xxx done for ((i=0;i<$#;i++)): do xxx done
ary=('hello' 'world' 'java' 'shell') for i in ${ary[*]} do echo $i done for ((i=0;i<10;i++)) do printf "%d %s" $i ' ' done
輸出
hello world java shell 0 1 2 3 4 5 6 7 8 9
while循環
語法
while condition do xxx done
COUNTER=0 while [ $COUNTER -lt 5 ] do COUNTER='expr $COUNTER+1' echo $COUNTER done
until循環
循環執行,直到條件爲true時中止,語法同while
ary=('hello' 'world' 'java' 'shell') i=0 until [ ${ary[$i]} = 'world' ] do i=`expr $i + 1` echo $i done
1
break, continue
循環的控制
前面加一個點號, 引入文件,則能夠直接訪問文件中的變量
. fileName