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 環境變量
定義
基本語法
- export 變量名=變量值,將 Shell 變量輸出為環境變量。
- source 配置文件路徑,讓修改后的配置信息立即生效。
- 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
實例
- 打印命令行輸入的參數。
#!/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