Bash 是一個爲 GNU 計劃編寫的 Unix shell,是 Linux 和 Mac OS X 下的默認 shell。
如下大多數例子能夠做爲腳本的一部分運行,也可直接在 shell 下交互執行。html
更多信息python
#!/bin/sh
腳本的第一行叫 shebang,用來告知系統如何執行該腳本:
參見: http://en.wikipedia.org/wiki/Shebang_(Unix)
如你所見,註釋以 # 開頭,shebang 也是註釋。shell
顯示 「Hello world!」編程
echo Hello, world!
每一句指令以換行或分號隔開:數組
echo 'This is the first line'; echo 'This is the second line'
聲明一個變量:bash
VARIABLE="Some string"
下面是錯誤的作法:編程語言
VARIABLE = "Some string"
Bash 會把 VARIABLE 當作一個指令,因爲找不到該指令,所以這裏會報錯。函數
使用變量:學習
echo $VARIABLE echo "$VARIABLE" echo '$VARIABLE'
當你賦值 (assign) 、導出 (export),或者以其餘方式使用變量時,變量名前不加 $。
若是要使用變量的值, 則要加 $。
注意: ' (單引號) 不會展開變量(即會屏蔽掉變量)。翻譯
在變量內部進行字符串代換
echo ${VARIABLE/Some/A}
會把 VARIABLE 中首次出現的 "some" 替換成 「A」。
內置變量:
下面的內置變量頗有用
echo "Last program return value: $?" echo "Script's PID: $$" echo "Number of arguments: $#" echo "Scripts arguments: $@" echo "Scripts arguments separeted in different variables: $1 $2..."
讀取輸入:
echo "What's your name?" read NAME # 這裏不須要聲明新變量 echo Hello, $NAME!
一般的 if 結構看起來像這樣:man test
可查看更多的信息
if [ $NAME -ne $USER ] then echo "Your name is you username" else echo "Your name isn't you username" fi
根據上一個指令執行結果決定是否執行下一個指令
echo "Always executed" || echo "Only executed if first command fail" echo "Always executed" && echo "Only executed if first command does NOT fail"
表達式的格式以下:
echo $(( 10 + 5 ))
與其餘編程語言不一樣的是,bash 運行時依賴上下文。好比,使用 ls 時,列出當前目錄。
ls
指令能夠帶有選項:
ls -l # 列出文件和目錄的詳細信息
前一個指令的輸出能夠看成後一個指令的輸入。grep 用來匹配字符串。
用下面的指令列出當前目錄下全部的 txt 文件:
ls -l | grep "\.txt"
重定向能夠到輸出,輸入和錯誤輸出。
python2 hello.py < "input.in" python2 hello.py > "output.out" python2 hello.py 2> "error.err"
>
會覆蓋已存在的文件, >>
會以累加的方式輸出文件中。
一個指令可用 $( ) 嵌套在另外一個指令內部:
如下的指令會打印當前目錄下的目錄和文件總數
echo "There are $(ls | wc -l) items here."
Bash 的 case 語句與 Java 和 C++ 中的 switch 語句相似:
case "$VARIABLE" in # 列出須要匹配的字符串 0) echo "There is a zero.";; 1) echo "There is a one.";; *) echo "It is not null.";; esac
循環遍歷給定的參數序列:
變量$VARIABLE 的值會被打印 3 次。
注意 和 $( ) 等價。seq 返回長度爲 3 的數組。
for VARIABLE in `seq 3` do echo "$VARIABLE" done
你也可使用函數
定義函數:
function foo () { echo "Arguments work just like script arguments: $@" echo "And: $1 $2..." echo "This is a function" return 0 }
更簡單的方法
bar () { echo "Another way to declare functions!" return 0 }
調用函數
foo "My name is" $NAME
有不少有用的指令須要學習:
tail -n 10 file.txt
打印 file.txt 的最後 10 行
head -n 10 file.txt
打印 file.txt 的前 10 行
sort file.txt
將 file.txt 按行排序
uniq -d file.txt
報告或忽略重複的行,用選項 -d 打印重複的行
cut -d ',' -f 1 file.txt
打印每行中 ',' 以前內容
原文 Learn X in Y minutes, where X = Bash
by Max Yankov
翻譯 徐春陽
許可 CC-BY-SA