SHELL 語法以及實例

語言簡介

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

  • 命名只能使用英文字母,數字和下劃線,首個字符不能以數字開頭。
  • 中間不能有空格,可使用下劃線(\_)。
  • 不能使用標點符號。
  • 不能使用bash裏的關鍵字(可用help命令查看保留關鍵字)。

使用變量

使用只須要加上美圓符號 $ 便可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 else

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

for loop in 1 2 3 4 5
do
    echo "The value is: $loop"
done

while

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

使用的方法很簡單:

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
select
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 ,這裏就很少說了, 須要下載, 有些嵌入式環境不支持

經常使用場景

  • Linux 上的自動腳本: 如使用 crontab 執行定時任務, 讀取修改文件, 我以前的一篇文章也使用到了他:https://segmentfault.com/a/11...
  • 登陸腳本等等, 能夠省略不少麻煩的過程

    固然相較於其餘語言, 都是能夠這樣作, shell 的優點就在於原生支持
  • 初始化環境, 使用腳本一鍵初始化整個 linux 環境, 若是接觸過 cli 的話應該知道他的做用

結語

shell 做爲 linux 官方的語言, 他附帶了不少功能, 給咱們提供了不少便利
在沒有環境的時候, 也能夠直接運行, 學會此語言, 能夠幫助你在服務器領域大展拳腳

以上部分例子來源於 https://www.runoob.com/linux/...

相關文章
相關標籤/搜索