掌握Shell編程,一篇就夠了


Shell 是什么?
Shell 是一個命令解釋權,它為用戶提供了一個向 Linux 內核發送請求以便運行程序界面系統級程序,用戶可以用 Shell 來啟動、掛起、停止甚至是編寫一些程序。


Shell 編程快速入門
進入 Linux 終端,編寫一個 Shell 腳本 hello.sh :

#!/bin/bash echo 'hello world!'


運行:

# 方法1 sh hello.sh # 方法2 chmod +x hello.sh ./hello.sh


終端打印出 hello world! 。
說明:

  • #! 告訴系統這個腳本需要什么解釋器來執行。
  • 文件擴展名 .sh 不是強制要求的。
  • 方法1 直接運行解釋器,hello.sh 作為 Shell 解釋器的參數。此時 Shell 腳本就不需要指定解釋器信息,第一行可以去掉。
  • 方法2 hello.sh 作為可執行程序運行,Shell 腳本第一行一定要指定解釋器。

Shell 變量
定義
Shell 變量分為系統變量和自定義變量。系統變量有$HOME、$PWD、$USER等,顯示當前 Shell 中所有變量:set 。
變量名可以由字母、數字、下划線組成,不能以數字開頭。
基本語法

  • 定義變量:變量名=變量值,等號兩側不能有空格,變量名一般習慣用大寫。
  • 刪除變量:unset 變量名 。
  • 聲明靜態變量:readonly 變量名,靜態變量不能unset。
  • 使用變量:$變量名

將命令返回值賦給變量(重點)

  • A=`ls` 反引號,執行里面的命令
  • A=$(ls) 等價於反引號

Shell 環境變量
定義


基本語法

  1. export 變量名=變量值,將 Shell 變量輸出為環境變量。
  2. source 配置文件路徑,讓修改后的配置信息立即生效。
  3. echo $變量名,檢查環境變量是否生效

位置參數變量
基本語法

  • $n :$0 代表命令本身、$1-$9 代表第1到9個參數,10以上參數用花括號,如 ${10}。
  • $* :命令行中所有參數,且把所有參數看成一個整體。
  • $@ :命令行中所有參數,且把每個參數區分對待。
  • $# :所有參數個數。

實例:
編寫 Shell 腳本 positionPara.sh ,輸出命令行輸入的各個參數信息。

#!/bin/bash # 輸出各個參數 echo $0 $1 $2 echo $* echo $@ echo 參數個數=$#


運行:

chmod +x positionPara.sh 
./positionPara.sh 10 20


運行結果:

./positionPara.sh 10 20 10 20 10 20 參數個數=2


預定義變量
定義
在賦值定義之前,事先在 Shell 腳本中直接引用的變量。
基本語法

  • $$ :當前進程的 PID 進程號。
  • $! :后台運行的最后一個進程的 PID 進程號。
  • $? :最后一次執行的命令的返回狀態,0為執行正確,非0執行失敗。

實例:
編寫 Shell 腳本 prePara.sh ,輸出命令行輸入的各個參數信息。

#!/bin/bash echo 當前的進程號=$$ # &:以后台的方式運行程序 ./hello.sh & echo 最后一個進程的進程號=$! echo 最后執行的命令結果=$?


運行結果:

當前的進程號=41752 最后一個進程的進程號=41753 最后執行的命令結果=0 # hello world!


運算符
基本語法

  • $((運算式)) 或 $[運算式]
  • expr m + n 注意 expr 運算符間要有空格
  • expr m - n
  • expr \*,/,% 分別代表乘,除,取余

實例

# 第1種方式 $(()) echo $(((2+3)*4)) # 第2種方式 $[],推薦 echo $[(2+3)*4] # 使用 expr TEMP=`expr 2 + 3` echo `expr $TEMP \* 4`


條件判斷
基本語法
[ condition ] 注意condition前后要有空格。非空返回0,0為 true,否則為 false 。
實例

#!/bin/bash if [ 'test01' = 'test' ] then echo '等於' fi # 20是否大於10 if [ 20 -gt 10] then echo '大於' fi # 是否存在文件/root/shell/a.txt if [ -e /root/shell/a.txt ] then echo '存在' fi if [ 'test02' = 'test02' ] && echo 'hello' || echo 'world' then echo '條件滿足,執行后面的語句' fi


運行結果:

大於 
hello 
條件滿足,執行后面的語句

流程控制

if 判斷

基本語法

if [ 條件判斷式 ];then 程序 fi # 或者(推薦) if [ 條件判斷式 ] then 程序 elif [ 條件判斷式 ] then 程序 fi

實例

編寫 Shell 程序:如果輸入的參數大於60,輸出“及格”,否則輸出“不及格”。

#!/bin/bash if [ $1 -ge 60 ] then echo 及格 elif [ $1 -lt 60 ] then echo "不及格" fi

case 分支

基本語法

case $變量名 in "值1") 如果變量值等於值1,則執行此處程序1 ;; "值2") 如果變量值等於值2,則執行此處程序2 ;; ...省略其它分支... *) 如果變量值不等於以上列出的值,則執行此處程序 ;; esac

實例

當命令行參數為1時輸出“周一”,2時輸出“周二”,其他情況輸出“其它”。

case $1 in "1") echo 周一 ;; "2") echo 周二 ;; *) echo 其它 ;; esac

for 循環

基本語法

# 語法1 for 變量名 in 值1 值2 值3... do 程序 done # 語法2 for ((初始值;循環控制條件;變量變化)) do 程序 done

實例

  1. 打印命令行輸入的參數。
#!/bin/bash  # 使用$* for i in "$*" do echo "the arg is $i" done echo "==================" # 使用$@ for j in "$@" do echo "the arg is $j" done

運行結果(回顧一下 $* 和 $@ 的區別):

the arg is 1 2 3 ================== the arg is 1 the arg is 2 the arg is 3

2. 輸出從1加到100的值。

#!/bin/bash SUM=0 for ((i=1;i<=100;i++)) do SUM=$[$SUM+$i] done echo $SUM

while 循環

基本語法

while [ 條件判斷式 ] do 程序 done 

實例

輸出從1加到100的值。

#!/bin/bash SUM=0 i=0 while [ $i -le $1 ] do SUM=$[$SUM+$i] i=$[$i+1] done echo $SUM

讀取控制台輸入

基本語法

read(選項)(參數)
選項

  • -p:指定讀取值時的提示符
  • -t:指定讀取值時等待的時間(秒),如果沒有在指定時間內輸入,就不再等待了。

參數

  • 變量名:讀取值的變量名

實例

讀取控制台輸入一個num值。

#!/bin/bash  read -p "請輸入一個數num1=" NUM1 echo "你輸入num1的值是:$NUM1" read -t 10 -p "請在10秒內輸入一個數num2=" NUM2 echo "你輸入num2的值是:$NUM2"

運行結果:

請輸入一個數num1=10 你輸入num1的值是:10 請在10秒內輸入一個數num2=20 你輸入num2的值是:20

函數

和其它編程語言一樣,Shell 編程有系統函數和自定義函數,本文只舉兩個常用系統函數。

系統函數

  • basename,刪掉路徑最后一個 / 前的所有部分(包括/),常用於獲取文件名。
    基本語法
    • basename [pathname] [suffix]
    • basename [string] [suffix]
    • 如果指定 suffix,也會刪掉pathname或string的后綴部分。

實例

# basename /usr/bin/sort sort # basename include/stdio.h stdio.h # basename include/stdio.h .h stdio
  • dirname,刪掉路徑最后一個 / 后的所有部分(包括/),常用於獲取文件路徑。
    基本語法
    • dirname pathname
    • 如果路徑中不含 / ,則返回 '.' (當前路徑)。

實例

# dirname /usr/bin/ /usr # dirname dir1/str dir2/str dir1 dir2 # dirname stdio.h .

自定義函數

基本語法

[ function ] funname[()] { Action; [return int;] } # 調用 funname 參數1 參數2...

實例

計算輸入兩個參數的和。

#!/bin/bash  function getSum(){ SUM=$[$n1+$n2] echo "sum=$SUM" } read -p "請輸入第一個參數n1:" n1 read -p "請輸入第二個參數n2:" n2 # 調用 getSum 函數 getSum $n1 $n2

恭喜!你已經掌握了 Shell 的基本語法,入門很簡單。想要更系統的探索Shell編程,可以和我一起深入學習接下來的高級篇。老樣子,向大家推薦一本最值得購入和收藏的程序員必讀

 

轉自:https://zhuanlan.zhihu.com/p/102176365


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM