linux shell快速入門
阿新 • • 發佈:2021-07-12
Shell 是一個命令列直譯器,它為使用者提供了一個向 Linux 核心傳送請求以便執行程式的介面系統級程式,使用者可以用 Shell 來啟動、掛起、停止甚至是編寫一些程式。
1.shell指令碼格式要求
1. 指令碼以#!/bin/bash 開頭
2. 指令碼需要有可執行許可權
2 Shell的變數
1. Shell 中的變數分為系統變數和使用者自定義變數。 2. 系統變數:$HOME、$PWD、$SHELL、$USER 等等,比如: echo $HOME 等等.. 3. 顯示當前 shell 中所有變數:set
2.1 shell 變數的定義
1. 定義變數:變數名=值 2.撤銷變數:unset 變數3. 宣告靜態變數:readonly 變數,注意:不能 unset
定義變數的規則
1.變數名稱可以由字母、數字和下劃線組成,但是不能以數字開頭。5A=200(×) 2. 等號兩側不能有空格 3. 變數名稱一般習慣為大寫, 這是一個規範
將命令的返回值賦給變數
1. A=`date`反引號,執行裡面的命令,並把結果返回給變數 A
2. A=$(date) 等價於反引號
3 設定環境變數
1. export 變數名=變數值 (將 shell 變數輸出為環境變數/全域性變數) 2. source 配置檔案(讓修改後的配置資訊立即生效) 3. echo $變數名(查詢環境變數的值)
shell 指令碼的多行註釋
:<<!
xxxxxx
xxxxxx
!
4 位置引數變數
當我們執行一個 shell 指令碼時,如果希望獲取到命令列的引數資訊,就可以使用到位置引數變數. 比如 : ./add.sh 100 200 , 這個就是一個執行 shell 的命令列,可以在 add指令碼中獲取到引數資訊
$n (n 為數字,$0 代表命令本身,$1-$9 代表第一到第九個引數,十以上的引數,十以上的引數需要用大括號包含,如${10}) $* (代表命令列中所有的引數,$*把所有的引數看成一個整體) $@ (代表命令列中所有的引數,不過$@把每個引數區分對待) $# (代表命令列中所有引數的個數)
5 預定義變數
就是 shell 設計者事先已經定義好的變數,可以直接在 shell 指令碼中使用
1. $$ (當前程序的程序號(PID)) 2. $! (後臺執行的最後一個程序的程序號(PID)) 3. $?(最後一次執行的命令的返回狀態。如果這個變數的值為 0,證明上一個命令正確執行;
如果這個變數的值為非 0(具體是哪個數,由命令自己來決定),則證明上一個命令執行不正確了。)
在一個 shell 指令碼中簡單使用一下預定義變數
#!/bin/bash echo "當前執行的程序 id=$$" #以後臺的方式執行一個指令碼,並獲取他的程序號 /home/brian/show.sh & echo "最後一個後臺方式執行的程序 id=$!" echo "執行的結果是=$?"
6 運算子
1. “$((運算式))” 或 “$[運算式] ” 或者 expr m + n 2. 注意 expr 運算子間要有空格, 如果希望將exp 的結果賦給某個變數,使用 `` 3. expr m - n 4. expr \*, /, % 乘,除,取餘
應用例項
#!/bin/bash
#案例 1:計算(2+3)X4 的值 #使用第一種方式 RES1=$(((2+3)*4)) echo "res1=$RES1" #使用第二種方式, 推薦使用 RES2=$[(2+3)*4] echo "res2=$RES2" #使用第三種方式 expr TEMP=`expr 2 + 3` RES4=`expr $TEMP \* 4` echo "temp=$TEMP" echo "res4=$RES4" #案例 2:請求出命令列的兩個引數[整數]的和 6 7 SUM=$[$1+$2] echo "sum=$SUM"
7 條件判斷
[ condition ](注意 condition 前後要有空格) #非空返回 true,可使用$?驗證(0 為 true,>1 為 false)
[ condition ] && echo “OK” || echo “ERROR” 條件滿足,執行後面的語句
常用判斷條件
1. = 字串比較 2. 整數的比較 -lt 小於 -le 小於等於 -eq 等於 -gt 大於 -ge 大於等於 -ne 不等於 3. 按檔案許可權進行判斷 -r 有讀的許可權 -w 有寫的許可權 -x 有執行的許可權 4. 按檔案型別進行判斷 -f 檔案存在並且是一個常規的檔案 -e 檔案存在 -d 檔案存在並是一個目錄
8 流程控制
8.1 if 判斷
if [ 條件判斷式 ] then 程式碼 fi
多分支判斷
if [ 條件判斷式 ] then 程式碼 elif [條件判斷式] then 程式碼 fi
注意:[ 條件判斷式 ] 括號和條件判斷式之間必須有空格
8.2 case語句
case $變數名 in "值 1") 如果變數的值等於值 1,則執行程式 1 ;; "值 2") 如果變數的值等於值 2,則執行程式 2 ;; …省略其他分支… *) 如果變數的值都不是以上的值,則執行此程式 ;; esac
8.3 for迴圈
for 變數 in 值 1 值 2 值 3… do 程式/程式碼 done
基本語法2
for (( 初始值;迴圈控制條件;變數變化 )) do 程式/程式碼 done
8.4 while迴圈
while [ 條件判斷式 ] do 程式 /程式碼 done
注意:while 和 [有空格,條件判斷式和 [也有空格
9 read讀取控制檯輸入
read(選項)(引數) -p:指定讀取值時的提示符; -t:指定讀取值時等待的時間(秒),如果沒有在指定的時間內輸入,就不再等待
應用例項
#!/bin/bash #案例 1:讀取控制檯輸入一個 N1 值 read -p "請輸入一個數 N1=" N1 echo "你輸入的 N1=$N1" #案例 2:讀取控制檯輸入一個 N2 值,在5秒內輸入。 read -t 5 -p "請輸入一個數 N2=" N2 echo "你輸入的 N2=$N2"
10 函式
shell 程式設計和其它程式語言一樣,有系統函式,也可以自定義函式。
10.1 系統函式
系統函式中,我們這裡就介紹兩個。
basename :返回完整路徑最後 / 的部分,常用於獲取檔名
basename [pathname] [suffix]
basename [string] [suffix]
suffix 為字尾,如果 suffix 被指定了,basename 會將 pathname 或 string 中的 suffix 去掉。
dirname 返回完整路徑最後 / 的前面的部分,常用於返回路徑部分
dirname 檔案絕對路徑
10.2 自定義函式
[ function ] funname[()] { Action; [return int;] }
呼叫直接寫函式名:funname [值]
應用例項
#!/bin/bash #案例:計算輸入兩個引數的和(動態的獲取), getSum #定義函式 getSum function getSum() { SUM=$[$n1+$n2] echo "和是=$SUM" } #輸入兩個值 read -p "請輸入一個數 n1=" n1 read -p "請輸入一個數 n2=" n2 #呼叫自定義函式 getSum $n1 $n2