一、用戶定義的變量
?
1、變量名
?
??? 以字母、下劃線開頭的字母、數(shù)字和下劃線字符序列
??? 注:大小寫敏感
?
2、變量賦值
?
??? 變量名=字符串
??? 注:等號兩邊不能有空格
?
3、引用變量值
?
??? 在變量名前加“$”表示引用,例如:
??? $?dir=/usr/wxq
??? $ echo $dir? --/usr/wxq
??? $ echo dir? --dir
?
??? 注意:
??? ① abc= 或未明確賦值過的變量,均為空字符串
??? ② 如果字符串中有空格,則用""括起來:names="Wang XQ"
??? ③ 可以作為某長字符串的一部分,例如:echo read$s
??? ④ 若會引起歧義時,用{}括起變量,如:cat ${dir}qc/m
?
4、命令替換
?
??? 使用倒引號“`”進(jìn)行命令替換,如:
??? $ dir=`pwd`
?
??? 或者使用$()的形式
??? $ dir=$(pwd)
??? $ echo $(pwd; cd /opt; ls -l)
?
?
?
二、數(shù)組
?
1、定義數(shù)組
?
??? bash只提供一維數(shù)組,且不限制數(shù)組大小。
??? 數(shù)據(jù)下標(biāo)從0開始賦值,格式為:數(shù)組名[下標(biāo)]=值
?
??? $ city[0]=Beijing
??? $ city[1]=Shanghai
??? ...
?
??? 也可以組合賦值
??? $ A=(this is an example of shell script)
?
2、數(shù)組的讀取
?
??? ${數(shù)組名[下標(biāo)]},例如上例中:
?
??? $ echo ${A[0]} ${A[2]}? --this an
??? $ echo ${A[8]}? --空值,超過上限
?
??? 注:可以使用*或@作為下標(biāo),表示所有元素,例如:
??? $ echo ${A[*]}
?
??? 當(dāng)不加下標(biāo)讀取時,默認(rèn)返回A[0]
?
3、取消數(shù)組
?
??? $ unset A? --取消整個數(shù)據(jù)
??? $ unset A[0]? --取消第一個值
?
?
?
三、變量引用
?
??? ① $name:表示變量name的值,若未定義變量則返回空值
?
??? ② ${name}:與$name相同,只是為了與后面緊接的字符分開
?
??? ③ ${name[n]}:表示引用數(shù)組name中的第n個元素
?
??? ④ ${name[*]} | ${name[@]}:表示引用數(shù)據(jù)的所有元素
?
??? ${name[*]}和${name[@]}的區(qū)別:
????? $ person=("a b" "c d")
????? $ echo ${person[*]}
????? $ 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
? ???? 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}:去掉開頭匹配部分之后的結(jié)果
??? ${name#pattern}:去掉匹配最少的部分
??? ${name##pattern}:去掉匹配最多的部分
?
??? $ echo $PWD
??? /home/wxq
??? $ echo ${PWD#*/}
??? home/wxq
??? $ echo ${PWD##*/}
??? wxq
?
??? ⑦ ${name%pattern}、${name%%pattern}:去掉末尾匹配部分之后的結(jié)果
??? ${name%pattern}:去掉匹配最少的部分
??? ${name%%pattern}:去掉匹配最多的部分
?
??? $ echo $FILE
??? A.abc.c
??? $ echo ${FILE%.*}
??? A.abc
??? $ echo ${FILE%%.*}
??? A
??? ⑧ ${#@}、${#*}:返回$@、$*返回參數(shù)的個數(shù)
?
??? ⑨ ${#name[i]}:返回第i個元素的長度(字符個數(shù))
?
??? ⑩ ${#name[*]}、${#name[@]}:返回數(shù)組name中已經(jīng)設(shè)置的元素個數(shù)
?
?
?
四、輸入/輸出命令
?
1、read命令
?
??? ① 輸入個數(shù)與給定數(shù)據(jù)個數(shù)相同
??? $ read x y z
??? Today is Monday
??? $ echo $z $y $x
??? Monday is Today
?
??? ② 輸入個數(shù)多于給定數(shù)據(jù)個數(shù)
??? $ read?a1?a2 a3
??? aaa bbb ccc ddd 111
??? $ echo $a2 $a1
??? bbb aaa
??? $ echo $a3
??? ccc ddd 111
?
??? 注:從左自右依次對應(yīng),最后一個變量分配到剩余所有的數(shù)據(jù)
?
??? ③ 輸入個數(shù)少于給定數(shù)據(jù)個數(shù)
?
??? 從左自右依次對應(yīng),沒有對應(yīng)的變量取空值
?
2、echo命令
?
??? echo命令用于顯示其后的變量值或之間顯示后面的字符串。各個參數(shù)之間以空格隔開,以換行符終止。如果數(shù)據(jù)間需要空格則用""括起來。
?
??? echo命令后面加上“-e”后可使用轉(zhuǎn)義符,轉(zhuǎn)義符包括以下這些:
?
??? \a? 響鈴報警
??? \b? 退一個字符位置
??? \c? 輸出之后光標(biāo)不換行,接在此之后(與-n選項(xiàng)相同)
??? \e? 轉(zhuǎn)義字符
??? \f? 換頁
??? \n? 顯示換行
??? \r? 回車
??? \t? 水平制表符
??? \v? 垂直制表符
??? \\? 印出反斜杠
??? \m? 表示一個ASCII字符(m以0開頭,由1位、2位或3位八進(jìn)制數(shù)組成的數(shù))
??? \xm 表示一個ASCII字符(m以0開頭,由1位、2位或3位十六進(jìn)制數(shù)組成的數(shù))
?
??? 舉例某特洛伊木馬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
?
?
?
???