Bash,Unix shell的一種,在1987年由布萊恩·福克斯爲了GNU計劃而編寫。
1989年發佈第一個正式版本,原先是計劃用在GNU操做系統上,但能運行於大多數類Unix系統的操做系統之上,包括Linux與Mac OS X v10.4起至macOS Mojave都將它做爲默認shell,
而自macOS Catalina,默認Shell以zsh取代。
-- 來自於維基百科
bash的命令語法是Bourne shell命令語法的超集。
數量龐大的Bourne shell腳本大多不經修改便可以在bash中執行,只有那些引用了Bourne特殊變量或使用了Bourne的內置命令的腳本才須要修改。
bash的命令語法不少來自Korn shell(ksh)和C shell(csh),例如命令行編輯,命令歷史,目錄棧,$RANDOM和$PPID變量,以及POSIX的命令置換語法:$(...)。
做爲一個交互式的shell,按下TAB鍵便可自動補全已部分輸入的程序名,文件名,變量名等等。html
使用'function'關鍵字時,Bash的函數聲明與Bourne/Korn/POSIX腳本不兼容(Korn shell 有一樣的問題)。
不過Bash也接受Bourne/Korn/POSIX的函數聲明語法。
由於許多不一樣,Bash腳本不多能在Bourne或Korn解釋器中運行,除非編寫腳本時刻意保持兼容性。
然而,隨着Linux的普及,這種方式正變得愈來愈少。不過在POSIX模式下,Bash更加符合POSIX。linux
name="foo"
注意,變量名和等號之間不能有空格,這可能和你熟悉的全部編程語言都不同。
同時,變量名的命名須遵循以下規則:web
使用只須要加上美圓符號 $
便可shell
打印: echo $name
打印結果: foo
編程
若是不加美圓符號, 則就是一個字符串:segmentfault
打印: echo name
打印結果: name
數組
固然變量的兩邊也能夠加上花括號:bash
name="foo" echo "I am good at ${name} Script" echo "I am good at $name Script" // 這兩句是等價的 花括號的優點在於空格
url="mo.fish" readonly url url="jandan.net"
再次賦值時,即會報錯: index.sh: line 14: url: readonly variable
服務器
name="foo" url="mo.fish" unset url unset name
注意: 只讀變量是沒法刪除的, 報錯: index.sh: line 14: unset: url: cannot unset: readonly variable
編程語言
普通變量被刪除後,打印結果爲空
在 shell 中 儘可能使用雙引號
由於單引號中,變量是無效的, 這是很重要的一點
經過空格便可拼接:
name="foo" url="mo.fish" echo $name $url
加上 #
便可
name="foo" echo ${#name}
使用冒號:
url="mo.fish" echo ${url:1:3} // 打印: o.f // 從 0 開始 第一位至第三位
用括號來表示數組,數組元素用"空格"符號分割開。
arr=($name $url) echo ${arr[1]} // echo ${arr} 等於 echo ${arr[0]}「
這一點是比較特殊的
arr=($name $url) echo ${arr[@]}
和字符串相似:
length=${#arr[@]} echo $length
if 和 其餘語言有些不太相同:
if [ $name=="foo" ] then echo "name 是 foo" fi // fi 表示結束 由於不像其餘語言 沒有 {}
而 else 和 if else 的話 這樣寫:
if [ $name != "foo" ] then echo "name 是 foo" else echo "不符合" fi
if [ $name == "bar" ] ;then echo "name 是 bar" elif [ $name == "foo" ]; then echo "name 是 foo" else echo "不符合" fi
這種使用 ; then
的寫法 可能更加符合咱們的直覺
for loop in 1 2 3 4 5 do echo "The value is: $loop" done
int=1 while(( $int<=5 )) do echo $int let "int++" done
for 和 while 都只用一個簡單例子
GrewerFn(){ echo "這是個人第一個 shell 函數!" }
執行是一個簡單的操做:
GrewerFn(){ echo "這是個人第一個 shell 函數!" } GrewerFn
只需寫上函數名稱 便可調用
GrewerFn(){ echo "第一個參數爲 $1 !" echo "第二個參數爲 $2 !" echo "打印全部參數 $@ !" } GrewerFn 1 "qwer" "zxc"
經過這樣的方法可以傳遞參數
而裏面 $1
, $2
這樣的參數處理能夠參數下面的表格:
參數處理 | 說明 |
---|---|
$# | 傳遞到腳本或函數的參數個數 |
$* | 以一個單字符串顯示全部向腳本傳遞的參數 |
$$ | 腳本運行的當前進程ID號 |
$! | 後臺運行的最後一個進程的ID號 |
$@ | 與$*相同,可是使用時加引號,並在引號中返回每一個參數。 |
$- | 顯示Shell使用的當前選項,與set命令功能相同。 |
$? | 顯示最後命令的退出狀態。0表示沒有錯誤,其餘任何值代表有錯誤。 |
使用的方法很簡單:
read yourName echo "you name is $yourName"
後面還能加參數, 如
-p 參數,容許在 read 命令行中直接指定一個提示。
read -p "輸入網站名:" website echo "你輸入的網站名是 $website"
限定字符:
read -n1 -p "Do you want to continue [Y/N]?" answer case $answer in Y | y) echo "fine ,continue";; N | n) echo "ok,good bye";; *) echo "error choice";; esac
PS3='Please enter your choice: ' options=("Option 1" "Option 2" "Option 3" "Quit") select opt in "${options[@]}" do case $opt in "Option 1") echo "you chose choice 1" ;; "Option 2") echo "you chose choice 2" ;; "Option 3") echo "you chose choice $REPLY which is $opt" ;; "Quit") break ;; *) echo "invalid option $REPLY";; esac done
PS1——默認提示符
PS2——再談提示符
PS3——Shell腳本中使用select時的提示符
PS4——PS4-「set -x"用來修改跟蹤輸出的前綴
具體參考: https://os.51cto.com/art/2012...
還有一個比較熱門的 expect ,這裏就很少說了, 須要下載, 有些嵌入式環境不支持
登陸腳本等等, 能夠省略不少麻煩的過程
固然相較於其餘語言, 都是能夠這樣作, shell 的優點就在於原生支持
shell 做爲 linux 官方的語言, 他附帶了不少功能, 給咱們提供了不少便利
在沒有環境的時候, 也能夠直接運行, 學會此語言, 能夠幫助你在服務器領域大展拳腳
以上部分例子來源於 https://www.runoob.com/linux/...