bash – 基本文法教學 #1
bash 是一個命令處理器,通常執行在CLI介面。通常我們都會都會BASH 來撰寫指令碼,在很多時候會非常方便。
輸出
輸出部分跟很多程式一樣。可以透過”echo”和”printf”來輸出檔案。
echo
$ echo “Hello World”
Hello World
echo 會在字串後面加上換行字符
prinrf
$ printf “Hello World\n”
變數
變數部分也是跟程式寫法一樣,不過需要注意的是需又透過”$”字元才能夠將變數裡面的值取出。另外也需要注意變數裡面的型態。
賦值
Greetings=Hello
取值
透過 $字元 將變數的值取出來
echo $Greetings
單引號 & 雙引號
若有多個的單字,需要用單引號包起來
Greeting=’only for words’
若需要使用變數功能,則需要用雙引號包起來
Greeting2= “if want to use variable”
用雙引號(“),任何$字元開頭的部分都會被替換
位置參數
若要取的取得的參數,可以透過 $字元 +數字來取得參數
$0 則會取得指令搞的名稱
$# 則會取得該指令搞在執行時,輸入的參數數量
範例指令搞如下所示
#!/bin/bash –
# test02.sh
echo $1
echo $2
echo $3
echo $0
echo $#
可以透過$ 來分別取得參數、指令搞名稱、參數數量
$ ./test02.sh hello world ??
hello
world
??
./test02.sh
3
輸出
bash 透過 read 讀取輸入,他會從 stdin 來接收使用者的輸入,再存在指定的變數裡面
read data
也可以透過 read 來達到程式暫停的功能
# 條件判斷
任何在 bash 中引用的指令或是程式,可能都會產生輸出,但也會傳回一個代表成功或是失敗的值。
在 shell 中,只要是剛剛執行的指令(還未執行下一個指令前),都可以透過 $? 變數取得狀態。
0 代表成功、為真 ,任何非 0 值代表失敗、為假
if condition
then
actions
elif condition2
then
actions2
else
other
fi
指令 + 條件
if cd /test
then
echo “the thing in /test”
ls -l
fi
管線串流
if ls | gerp pdf
then
echo “have pdf”
else
echo “no pdf”
fi
但需要注意,若使用管線,則會以最後一條指令的成功與否來判斷。
下列範例不管有沒有找到 pdf ,都會輸出 “have pdf”
#!/bin/bash –
if ls | grep pdf | echo ‘1’
then
echo “have pdf”
else
echo “no pdf”
fi
複合式指令 (檔案)
then
echo $FILENAME exists
fi
- -d 測試目錄是否存在
- -e 測試檔案是否存載
- -r 測試檔案是否可以讀取
- -w 測試檔案是否可以寫入
- -x 測試檔案是否可以執行
複合式指令 (數值)
if [[ $VAL -lt $VAL2 ]]
then
echo “value is smaller”
fi
- -eq 測試兩數字是否相等
- -gt 測試數字是否較大
- -lt 測試數字是否較小
需要注意 > 字元 和 < 字元不太一樣
這邊的運算子是採取詞語式的邏輯比較,所以會根據字母訊續排序來比較
eg: 1<2 , 12<2
雙小括弧
如果要用運算子來進行比較, 可以透過雙小括弧,他會假設所有變數內容都數值
if (( VAL < 6))
then
echo “smaller than 6”
fi
雙小括弧中, 都是採用 數值化的邏輯比較,所有非0 都為真,0 為 假, 若透過 $? 取得執行狀態, 前面指令失敗,回傳 非0 ,但在數值化的邏輯比較,非0 為真,故最後就會變成為真
決策
在BASH 也不一定需要透過 if/then 來形成決策分支
指令A && 指令B
- 指令A 成功 才會執行 指令B
指令A || 指令B
- 指令A 失敗 才會執行 指令B
下列兩者程式碼為相同功能
- [[ -d $DIR ]] && “$DIR”
- if [[ -d $DIR]] ; then; ls “$DIR” ;fi;
PS:若指令A、B 為多個指令,可以透過{} 來一併