2017年11月28日 星期二

Shell script 快速入門

第一行是 #!/bin/bash/
bin/bash 是大部人用的,也是預設的 shell,可看 /etc/passwd 的最後一個欄位


※參數

假設檔名叫 xxx.sh,下 xxx.sh aa bb
$#:表示有幾個參數,此例為 2
$0:xxx.sh,也就是檔名
$1:aa
$2:bb
一直到$9,10以上要用 {} 包起來,如 ${12}
$*:表示所有參數,整個參數是一個整體,如"$1 $2 $3",參數和參數之間用空隔隔開
$@:也表示所有參數,但每個參數是分開的,如 "$1" "2" "$3",參數和參數之間用空隔隔開
以上兩個需視情況用「"」包起來使用
$$:processID,ps -aux 可查看
$?:讀取上一行指令有沒有錯誤,沒錯回傳0,否則回傳錯誤代碼,最多255,如果超過255,那就是除 256 的餘數
man bash ,搜尋  ^exit status

※test.sh
#!/bin/bash
echo $#
echo $@
echo $0
echo $1
echo $$
echo $?
#echo xxx "aaa" "bbb"

xxx(){
    echo $1 $2
}
xxx "aaa" "bbb"

※./test.sh a b cccc de 結果為
4
a b cccc de
test.sh
a
547
0
aaa bbb

※./和sh可執行shell,但./需要w權限


※變數

a=apple(=前後不可有空格,字串有空格時,用「'」或「"」包起來)
echo $a 印出a變數
export aaa 將aaa變數提升為系統變數
source xxx 因為提升為系統變數後,要重登入才有效,懶得重登入就可用這個指令
unset xxx 刪除xxx變數

「`」鍵盤左上角下來一格的按鍵,可用這個包指令,然後串接字符串
如:echo xxx `date` ooo


四則運算(+-*/%)和test

$a+$b 用 $(( 和 )) 包起來,然後裡面的$可有可無-> $((a+b))
無法用小數點

${#a}:長度
${a:2}:最前面扣2長
${a:2:4}:最前面扣2長後,取4長
${a#a*c}:從前面開始刪除abc,刪一次(勉強)
${a##a*c}:從前面開始刪除abc,(貪婪)
${a%a*c}:從後面開始刪除abc,刪一次(勉強)
${a%%a*c}:從後面開始刪除abc,(貪婪)


test

-f -d -r -w -x
test -f $f && echo "is a file" || echo "isn't a file"
&& || 為三元運算子


[]

1.前後必需空格
2.變數要用「"」包起來
[ "$a" == '5' ] && echo "yes" || "no"
== != -eq -ne -gt -ge -lt -le


※條件

if

read xxx

if [ "$xxx" == '1' ]; then
elif []; then
else
fi

/proc/cpuinfo
/proc/meminfo

-a 且
-o 或

if [ "$xxx" == 'a' -o "$xxx" == 'd' -o "$xxx" == 'xx' ]


case

read n
case "$n" in
'a') echo 'aaa';;
'b') echo 'bbb';;
  *) echo '***';;
esac


※陣列

xxx=("aaa" "bbb" "ccc")
echo length:${#xxx[@]}
for((i=0; i<${#xxx[@]}; i++)); do
      echo ${xxx[i]}
done

※迴圈

while

while 條件; do

done;

while [ "$i" -le 10 ]; do
  echo "$i"
  i=$((i+1))
done


until

#觀念和 while 相反,判斷式為 true 時停止
until 條件; do

done;

until [ "$i" -gt 10 ]; do
  echo "$i"
  i=$((i+1))
done

for

for (()); do
  內容
done;

for ((i=0;i<10;i++)) do
  echo "$i"
done

for in

for x in aaa bbb ccc; do
  echo "$x"
done

沒有留言:

張貼留言