1. echo 參數
- -n 不換行(默認換行)
- -e 使得轉移字符有效
例子
ss='abc\n' echo -e $ss abc #換行起作用 echo $ss abc
2. 賦值
2.1 =左右兩側不要帶空格
a = "hello" #錯誤 a="hello"
2.2 左邊變量名不可加$
$a='134' [jihite] $a=$a'abc' [jihite] $echo a a [jihite] $echo $a 134abc
3. shell運算
b=4 let "c=$b+1" echo $c
小例
i=9000 while [ $i -lt 9010 ] do let "i=$i+1" echo $i done
9001 9002 9003 9004 9005 9006 9007 9008 9009 9010
4. 單引號和雙引號區別
單引號和雙引號一樣都是字符串的界定符,而不是字符的界定符。單引號用於保持引號內所有字符的字面值,即使引號內的\和回車也不例外。
舉例
bb="hello" echo "$bb" hello echo '$bb' $bb
注意ecoh -e '$bb' 結果還是$bb,因為'$bb'就是字面值,不會轉義。
5. 數組
5.1 聲明、定義
- array['a']=1
- array=('a', 'b')
- array=([1]='a' [2]='b')
5.2 訪問
- echo ${array['a']}
- echo ${array[0]}
5.3 遍歷
for var in ${array[*]} do echo $var done
5.4 數組長度
num=${#array[@]}
對比:獲取字符串長度:num=${#str}
6. Linux shell實現多線程
for ((i=0;i<5;i++)); do { sleep 3; echo "hello" $i } done wait
對比
for ((i=0;i<5;i++)); do { sleep 3; echo "hello" $i }& done wait
這個在上面的基礎上多加了一個后台執行&符號,此時5個循環任務並發執行,最后需要3s多一點的時間(效果非常明顯)。wait的作用是完成后台所有的任務后才往下執行,否則程序本身會等待。
7. 去除一行最后的'\r'
字符串最后有個'\r'是非常惡心的,可以通過tr命令去掉
a="hello\r" echo $a | tr -d '\r' hello\r echo $a | tr -d "\r" hello\r echo -e $a | tr -d '\r' hello #轉移字符起作用 echo -e $a | tr -d "\r" hello
8. 編譯shell文件
bash -x ***.sh
+開頭的是編譯的中間過程,不帶+的為正常的輸出。效果非常明顯。
9. if else
#!/bin/bash proc=$1 proc_num=`ps -ef | grep root | grep $proc | wc -l` echo $proc_num if [ $proc_num = 2 ] then exit 0 else exit 2 fi
注:if [ con ], 條件con和[]之間有空格
- -ne —比較兩個參數是否不相等
- -lt —參數1是否小於參數2
- -le —參數1是否小於等於參數2
- -gt —參數1是否大於參數2
- -ge —參數1是否大於等於參數2
e.g. if [ $proc_num -gt 1 ]
以上為數字的比較,字符串的比較用'='、'!='。e.g.
rev=$(cat /etc/ld.so.conf | grep usr/local/lib) if [[ $rev != '/usr/local/lib' ]] then echo "hello" fi
10. for循環
例1:
- sleep 1 睡眠1秒
- sleep 1s 睡眠1秒
- sleep 1m 睡眠1分
- sleep 1h 睡眠1小時
例如:以下shell腳本每隔10秒鍾就打印出“Hell, dansir”
#!/bin/shell while true do echo "Hello, dansir" sleep 10s done
例2:
ids=" 123 456 789" for i in $ids do echo $i done
執行
$sh del.sh 123 456 789
11. 執行變量里的命令
$(eval echo $v_endcomm)
