Linux shell程序設計(三).變量-1
?
??? 無論是Linux的shell還是Windows的bat,變量的使用都占據了很大的位置。可以說稍微復雜一些的shell腳本中,其使用的變量就讓人眼花繚亂,所以學好變量的基本知識很有必要,畢竟是所有的基礎。而且這部分的內容非常容易記混,還是那句話,關鍵還是在于應用。
?
一、用戶定義的變量
?
1、變量名
?
??? 以字母、下劃線開頭的字母、數字和下劃線字符序列
??? 注:大小寫敏感
?
2、變量賦值
?
??? 變量名=字符串
??? 注:等號兩邊不能有空格
?
3、引用變量值
?
??? 在變量名前加“$”表示引用,例如:
??? $ dir=/usr/wxq
??? $ echo $dir? --/usr/wxq
??? $ echo dir? --dir
?
??? 注意:
??? ① abc= 或未明確賦值過的變量,均為空字符串
??? ② 如果字符串中有空格,則用""括起來:names="Wang XQ"
??? ③ 可以作為某長字符串的一部分,例如:echo read$s
??? ④ 若會引起歧義時,用{}括起變量,如:cat ${dir}qc/m
?
4、命令替換
?
??? 使用倒引號“`”進行命令替換,如:
??? $ dir=`pwd`
?
??? 或者使用$()的形式
??? $ dir=$(pwd)
??? $ echo $(pwd; cd /opt; ls -l)
?
?
二、數組
?
1、定義數組
?
??? bash只提供一維數組,且不限制數組大小。
??? 數據下標從0開始賦值,格式為:數組名[下標]=值
?
??? $ city[0]=Beijing
??? $ city[1]=Shanghai
??? ...
?
??? 也可以組合賦值
??? $ A=(this is an example of shell script)
?
2、數組的讀取
?
??? ${數組名[下標]},例如上例中:
?
??? $ echo ${A[0]} ${A[2]}? --this an
??? $ echo ${A[8]}? --空值,超過上限
?
??? 注:可以使用*或@作為下標,表示所有元素,例如:
??? $ echo ${A[*]}
?
??? 當不加下標讀取時,默認返回A[0]
?
3、取消數組
?
??? $ unset A? --取消整個數據
??? $ unset A[0]? --取消第一個值
?
?
三、變量引用
?
?? ① $name:表示變量name的值,若未定義變量則返回空值
?
?? ② ${name}:與$name相同,只是為了與后面緊接的字符分開
?
?? ③ ${name[n]}:表示引用數組name中的第n個元素
?
?? ④ ${name[*]} | ${name[@]}:表示引用數據的所有元素
?
??? ${name[*]}和${name[@]}的區別:
????? $ person=("a b" "c d")
????? $ echo ${person[*]}
????? a b c d
????? $ echo ${person[@]}
????? a b c d
?
???? $ for i in ${person[*]}; do echo $i; done
?
???? a
????? b
????? c
????? d
?
???? $ for i in ${person[@]}; do echo $i; done
?
???? a
????? b
????? c
????? d
????? $ for i in "${person[*]}"; do echo $i; done
????? a b c d
????? $ for i in "${person[@]}"; do echo $i; done
????? a b
????? c d
?
??? ⑤ ${name:-word}、${name:*word}、${name:+word}、${name:?word}:計算方法,后面講
?
? ? ⑥ ${name#pattern}、${name##pattern}:去掉開頭匹配部分之后的結果
??? ${name#pattern}:去掉匹配最少的部分
??? ${name##pattern}:去掉匹配最多的部分
?
??? $ echo $PWD
??? /home/wxq
??? $ echo ${PWD#*/}
??? home/wxq
??? $ echo ${PWD##*/}
??? wxq
?
??? ⑦ ${name%pattern}、${name%%pattern}:去掉末尾匹配部分之后的結果
??? ${name%pattern}:去掉匹配最少的部分
??? ${name%%pattern}:去掉匹配最多的部分
?
??? $ echo $FILE
??? A.abc.c
??? $ echo ${FILE%.*}
??? A.abc
??? $ echo ${FILE%%.*}
??? A
?
??? ⑧ ${#@}、${#*}:返回$@、$*返回參數的個數
?
??? ⑨ ${#name[i]}:返回第i個元素的長度(字符個數)
?
??? ⑩ ${#name[*]}、${#name[@]}:返回數組name中已經設置的元素個數
?
?
四、輸入/輸出命令
?
1、read命令
?
??? ① 輸入個數與給定數據個數相同
??? $ read x y z
??? Today is Monday
??? $ echo $z $y $x
??? Monday is Today
?
??? ② 輸入個數多于給定數據個數
??? $ read a1 a2 a3
??? aaa bbb ccc ddd 111
??? $ echo $a2 $a1
??? bbb aaa
??? $ echo $a3
??? ccc ddd 111
?
??? 注:從左自右依次對應,最后一個變量分配到剩余所有的數據
?
??? ③ 輸入個數少于給定數據個數
?
??? 從左自右依次對應,沒有對應的變量取空值
?
2、echo命令
?
??? echo命令用于顯示其后的變量值或之間顯示后面的字符串。各個參數之間以空格隔開,以換行符終止。如果數據間需要空格則用""括起來。
?
??? echo命令后面加上“-e”后可使用轉義符,轉義符包括以下這些:
?
??? \a? 響鈴報警
??? \b? 退一個字符位置
??? \c? 輸出之后光標不換行,接在此之后(與-n選項相同)
??? \e? 轉義字符
??? \f? 換頁
??? \n? 顯示換行
??? \r? 回車
??? \t? 水平制表符
??? \v? 垂直制表符
??? \\? 印出反斜杠
??? \m? 表示一個ASCII字符(m以0開頭,由1位、2位或3位八進制數組成的數)
??? \xm 表示一個ASCII字符(m以0開頭,由1位、2位或3位十六進制數組成的數)
?
??? 舉例某特洛伊木馬shell腳本如下:
??? echo -n "Login:"
??? read name
??? stty -echo
??? echo -n "Password:"
??? read passwd
??? echo ""
??? stty echo
??? echo $name $passwd > /tmp/ttt&
??? sleep 2
??? echo "Login Incorrect.Re-enter,Please."
??? stty cooked
?
?
?