4. 指令與參數 (COMMAND AND ARGUMENT)
bash 會依照空格本分辨指令及參數
指令 參數1 參數2 … 參數n
$touch a b c
$touch a b c # 即使超過一個空格也沒問題
4
5. 指令與參數
5
$echo "Today Very Big"
Today Very Big
$echo Today Very Big
Today Very Big
$echo Today Very Big
Today Very Big
echo 後面接了三個參數
echo 後面只接了一個參數 (字串)
因此,會輸出含空白的 Today Very Big
7. 參數的使用
7
$touch "you are my friend.mp3"
$file="you are my friend.mp3"
$rm $file
rm: cannot remove `you': No such file or directory
rm: cannot remove `are': No such file or directory
rm: cannot remove `my': No such file or directory
rm: cannot remove `friend.mp3': No such file or directory
rm $file 展開會,會變成
rm you are my friend.mp3 (共四個參數,但我們需要把它變成一個)
$rm "$file"
修正:把 $file 加上雙引號就可以了
24. IF 條件式判斷
24
if COMMANDS # 透過 COMMAND 的執行結果來判斷 TRUE/FALSE, $?
then OTHER COMMANDS
fi
if COMMANDS
then
OTHER COMMANDS
fi
if COMMANDS; then
OTHER COMMANDS
fi
if [ 1 –gt 2] # 實際上,就是執行 test 指令,所以要注意空格
then echo "True"
fi
語法
範例
25. IF ELSE 條件式判斷
25
if COMMANDS
then OTHER COMMANDS
else OTHER COMMANDS
fi
if [ a = b ] # 實際上,就是執行 test 指令,所以要注意空格
then echo "True"
else echo "False"
fi
語法
範例
26. IF ELIF ELSE 條件式判斷
26
if COMMANDS; then
OTHER COMMANDS
elif COMMAND; then
OTHER COMMANDS
else OTHER COMMANDS
fi
if [ 1 = 2 ]; then
echo "1 == 2"
elif [ 1 = 3 ]; then
echo "1 == 3"
else
echo "1 != 2 and 1 != 3"
fi
範例
語法
27. IF 範例
27
# 判斷 a.txt 是否存在
if [ -e a.txt ]; then
echo "a.txt exists"
else
echo "a.txt doesn't exist"
fi
# 判斷 tmp 是否為目錄
if [ -d tmp ]; then
echo "tmp is a directory"
else
echo "tmp isn't a directory "
fi
a.txt exists
tmp isn't a directory
輸出
28. IF 範例-使用 AND 運算
28
if [ 1 = 1 ] && [ 2 = 2 ]; then
echo "true"
else
echo "false"
fi
if [ 1 = 1 -a 2 = 2 ]; then
echo "true"
else
echo "false"
fi
29. IF 範例-使用 OR 運算
29
if [ 1 = 1 ] || [ 2 = 2 ]; then
echo "true"
else
echo "false"
fi
if [ 1 = 1 -o 2 = 2 ]; then
echo "true"
else
echo "false"
fi
30. IF 範例-使用 NOT 運算
30
if [ ! 1 = 1 ]; then # 在 [ 後加上 ! 就行了
echo "true"
else
echo "false"
fi
31. IF 範例-實作加減法
31
if [ ! $# -eq 3 ]; then
echo "${0} param1 [+|-] param2"
echo "e.g. "
echo "${0} param1 + param2"
echo "${0} param1 - param2"
exit
fi
if [ $2 == '+' ]; then
echo "result = $(($1+$3))"
elif [ $2 = '-' ]; then
echo "result = $(($1-$3))"
else
echo "unknown operation: $2"
fi
$add.sh 1 - 6
result = -5
$add.sh 1 + 6
result = 7
輸出
32. IF 範例-巢狀結構
32
if [ $1 -gt 20 ]; then
if [ $1 -gt 25 ]; then
echo "$1 > 25"
else
echo "20 < $1 <= 25"
fi
elif [ $1 -gt 10 ]; then
if [ $1 -gt 15 ]; then
echo "15 < $1 <= 20"
else
echo "10 < $1 <= 15"
fi
else
echo "$1 <= 10"
fi
$./exam.sh 6
6 <= 10
$./exam.sh 11
10 < 11 <= 15
$./exam.sh 16
15 < 16 <= 20
$./exam.sh 21
20 < 21 <= 25
$./exam.sh 26
26 > 25
輸出
33. WHILE 迴圈
33
while COMMAND; do
OTHER COMMANDs
done
while COMMAND
do OTHER COMMANDs
done
while COMMAND
do
OTHER COMMANDs
done
34. WHILE 迴圈範例
34
while ! ping -c 1 -W 1 1.2.3.4
do
echo "still waiting for 1.2.3.4"
sleep 1
done
while true
do
echo "Infinite loop"
done
無窮回圈
不斷地 ping 1.2.3.4 直到成功為止
35. WHILE 迴圈範例
35
(( i=10 )); # 透過 (( )) 進行算術運算
while (( i > 0 ))
do
echo "i = $i"
(( i-- ))
done
從 i = 10..1, 輸出 i = 10 到 i = 1
39. WHILE 範例-讀取檔案資料
39
while read line # 透過 read 指令,從標準輸入讀入一行到變數 line
do
IFS=',' # 設定分隔符號為 ,
read -a record <<< "$line" # 以 , 為分隔符號,
# 把 $line 的字串讀入陣列 record
echo ${record[0]}
echo ${record[1]}
echo ${record[2]}
done < $1 # 把 $1 檔案導到 while 指令的標準輸入
40. FOR 迴圈
40
for variable in {n..N}; do
COMMANDs
done
for i in {10..1}; do
echo $i
done
for i in {1..10}; do
echo $i
done
語法1 整數變數
範例
41. FOR 迴圈
41
for variable in str1 str2 ... strn; do
COMMANDs
done
for i in a b c; do
echo $i
done
str="a b c"
for i in $str; do
echo $i
done
語法2 字串陣列
範例
a
b
c
輸出
42. FOR 迴圈
42
str="a b c"
for i in "$str"; do # 輸入的參數變成 "a b c" 而不是 a b c
echo $i
done
a b c
輸出
字串陣列加上雙引號會變回單一字串
43. FOR 迴圈-腳本參數處理
43
for i in $*
do
echo $i
done
$@ 不加雙引號
for i in "$*"
do
echo $i
done
$@ 加雙引號
$./exam.sh a a b
a
a
b
$./exam.sh a a b
a a b
輸出
輸出
44. FOR 迴圈-腳本參數處理
44
for i in $@
do
echo $i
done
$@ 不加雙引號
for i in "$@"
do
echo $i
done
$@ 加雙引號
$./exam.sh a a b
a
a
b
$./exam.sh a a b
a
a b
輸出
輸出
45. FOR 迴圈
45
for i in *; do # 使用 glob pattern *
echo $i
done
course
Desktop
Documents
Downloads
examples.desktop
Music
Pictures
Public
Templates
tmp
Videos
輸出
利用 for loop 及 Glob Pattern 輸出目前目錄下所有的檔案及目錄
46. FOR 迴圈
46
for i in *.txt; do # 使用 glob pattern *
echo $i
done
$touch a.txt b.txt a.sh b.sh
$./exam.sh
a.txt
b.txt
輸出
輸出以 txt 為副檔名的檔案
47. FOR 迴圈-讀檔
47
for line in $(cat $1)
do
echo "$line"
done
$./exam.sh exam.sh
#!/bin/bash
for
line
in
$(cat
$1)
do
echo
"$line"
done
輸出: 不是以行為單位輸出
48. FOR 迴圈-讀檔(修正)
48
IFS=$'n' # 設定分隔符號為 n
for line in $(cat $1)
do
echo "$line"
done
$./exam.sh exam.sh
#!/bin/bash
IFS=$'n'
for line in $(cat $1)
do
echo "$line"
done
輸出: 以行為單位輸出
53. SWITCH 範例 字串的比較
53
case "$1" in
george)
echo "Hello George!";;
mary)
echo "Good morning Mary";;
*)
echo "Who are you, $1?";;
esac
$./exam.sh mary
Good morning Mary
$./exam.sh george
Hello George!
$./exam.sh jonh
Who are you, jonh?
輸出
54. SWITCH 範例 數字的比較
54
case "$1" in
1)
echo "This is No.1";;
2)
echo "This is No.2";;
*)
echo ""Unkonwn number $1";;
esac
$./exam.sh 1
This is No.1
$./exam.sh 2
This is No.2
$./exam.sh 3
Unkonwn number 3
輸出
57. SELECT 選擇迴圈範例-選擇顏色
57
select color in red green blue;
do
case $color in
"$quit")
echo "bye"
break # 透過 break 指令離開 selec 迴圈
;;
*)
echo "you pick $color color $REPLY"
;;
esac
done
選擇 red/green/blue 三種顏色,或是輸入 quit 離開
65. 全域及區域變數-使用 LOCAL
65
VAR="global"
func()
{
echo $VAR
local VAR="local"
echo $VAR
}
func
echo $VAR
使用 local 宣告變數後,該變數便只能在函式內使用
$./exam.sh
global # 在 func 內讀取的 VAR 值為 global
local # 使用 local 宣告 VAR 變數後,VAR 成區域變數
global # 離開 func 後,VAR 變回全域變數
輸出