bash,  Research & Study

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

複合式指令 (檔案)

if [[ -e $FILENAME]]
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 為多個指令,可以透過{} 來一併

留下一個回覆

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *