您好,登錄后才能下訂單哦!
在Linux操作系統中,有兩個非常重要的工具:①Linux命令;②Shell。Linux命令是Linux系統對用戶提供的眾多系統功能接口,每一個Linux命令都能完成一個獨立的系統功能;Shell是一個基于C語言開發的應用程序,它可以通過各種邏輯語法和程序控制指令把一系列的Linux命令組合在一起,形成一個面向過程的程序命令(Shell Script)。
Linux命令一般需要在特定環境中執行,我們一般的Linux命令就是在Shell中執行的,需要特定的環境變量等支持;而Shell腳本會fork一個子進程去執行,如果在腳本中涉及環境變量的改變則只會改變子進程的環境,對Shell的環境變量沒有影響。
我們知道Linux的Shell是一個組合并執行Linux命令的應用程序,所以Shell的實現并不只有一種,我們常用的Shell類型包括:sh、C Shell、TCSH、bash。Linux中默認的Shell為bash,一般保存在/bin/bash
中
也就是說,Linux命令是系統提供的具備各種不同功能的命令集合、Shell是一個可以將多個Linux命令組合為Shell腳本的應用程序,相當于一個腳本解析器。
在Linux中l腳本的第一行一般會向系統聲明該腳本所使用的解析程序:
#!/bin/bash
,通過這條語句聲明該腳本使用/bin/bash
這個應用程序解析
Shell腳本的基本表達式:
表達式 | 功能 |
---|---|
++、-- | 自增、自減(與C語言的前后自增自減相同) |
+、-、*、/、% | 加、減、乘、除、余運算 |
** | 冪運算 |
>、>=、<、<=、==、!= | 比較運算 |
<<、>> | 按位左移、右移運算 |
&、|、^ | 與、或、異或運算 |
&&、||、! | 邏輯與、或、非 |
exp?a:b | 三目運算符 |
#內容 | 單行注釋 |
:<<EOF 內容 EOF | 代表多行注釋(EOF可以使用單引號、感嘆號代替) |
變量賦值:
如何給變量賦值?如何調用變量?
Shell的變量使用等于號賦值,且等號之間不允許有空格,必須要直接與等號相連v1="value"
調用變量只需要將變量名連接在美元符號$后面v2=$v1
,也可以使用大括號區分每個變量的邊界v3=${v1}isgood
#直接進行變量賦值
a=12 #默認是字符串類型的"12",進行數值運算時會解析為數值型的12
b=str1 #默認是字符串類型的"str1"
#使用單引號和雙引號進行變量賦值,雙引號會解析變量、轉義字符、反引號命令;而單引號則不會解析任何上面的東西,完全按照字符串字面值賦值。
v="$a" #這時變量v的值為12
v='$a' #這時變量v的值為'$a'
#列表變量的賦值
list=(v1,v2,v3) #括號內為列表內容,中間使用空格分隔
echo ${list[@]} #通過${}來調用列表,[]內表示索引,[@]表示列表內的每一項
注意使用以上方式的變量賦值,是無法進行任何命令以及運算的!,只能將變量解析出來,但是無法進行命令執行和數學運算。
a=1
b=2
c="$a+$b" #c的值為"1+2"而不是3
d="ls -al" #d的值為"ls -al"而不會執行
代換和Shell中的括號
文件名代換
簡單地說就是一種可以使用在文件名上的通配符:
* #表示匹配任意多個任意字符
? #表示匹配一個任意字符
[] #表示匹配中括號內任意一個字符的第一次出現
cd ./test[123abc] #匹配test1、test2、test3、testa...
命令代換,單括號
單括號符功能:①命令組功能,可以執行單引號中的多個命令;②命令代換,在變量中的命令會執行并正常輸出到標準輸出中;③初始化Shell列表變量
注意區分變量環境和非變量的環境,只有變量的環境下需要在單括號外加美元符號
#在變量中使用反引號或單括號,可以將變量解析為shell命令并執行:
a=`ls -al` #反引號可以進行命令代換
b=$(ls -al) #美元括號的內容會進行命令代換
(pwd) #執行pwd命令
`pwd` #執行pwd命令
運算代換,雙括號
雙括號符功能:①數值運算功能,只要內符合C語言運算語法,即可進行數值運算;②運算代換,在變量中的數值運算會正常進行后再進行賦值;③for語句功能,雙括號可以在for循環中使用;
注意區分變量環境和非變量環境,只有變量環境下需要在雙括號外加美元符號
#在變量中使用雙引號,可以將變量解析為數值運算并執行:
a=10
b=$(($a+20)) #b的值為30
中括號
中括號功能:①Shell的內部命令,可用于進行條件測試返回True、False,等同于test命令;②正則表達式和通配符可以使用;③作為列表的索引使用
要注意,作為條件測試的中括號是一個命令語句而不是一個符號。作為命令前中括號后需要帶一個空格才能接參數,而后中括號就是作為該條件測試命令的最后一個參數,代表參數輸入結束。前后中括號中間的值都作為命令的參數。
并且作為一個命令,[
在對開空格的字符串作處理時會發生問題。
#if使用中括號條件測試,結果為輸出yes
if [ 10 -lt 20 ] && [ 1 -lt 2 ] #此處前中括號后和后中括號前都需要加一個空格
then
echo yes
else
echo no
fi
#這里$name會解析為三個字符串,導致[命令參數錯誤
name="here and there"
if [ -n $name ] #使用[ -n "$name" ]才能正常
then
echo "not empty"
fi
#這里的結果會報錯 bash: [: too many arguments
雙中括號
雙中括號功能:①bash的內部關鍵字,能完成[
的加強版功能,并且因為[[
不是命令而是關鍵字,所以對參數的解析規則會略有不同。且與[
每次只能做一種判斷不停,[[
可以使用&&、||等運算符,可以同時做多種比較。
#if使用中括號條件測試,結果為輸出yes
if [[ 10 -lt 20 && 1 -lt 2 ]] #此處前中括號后和后中括號前都需要加一個空格
then
echo yes
else
echo no
fi
#因為對參數的處理不同,可以直接處理帶空格的字符串
name="this is a test"
if [[ -n $name ]]
then
echo "not empty"
fi
#結果會正常顯示
大括號
大括號功能:①可以對文件名做擴展,作用類似通配符;②執行代碼塊,就是C中的代碼塊,每條命令結束都要加分號;③分隔變量名稱和使用列表變量
touch test{1..5}.txt #會創建5個文件,其實就是通配符嘛
a="${this}IsATest" #不使用大括號變量名會粘在一起
a="${list[@]}" #選擇列表所有元素
Shell中的特殊字符
Shell中的字符都有許多特殊的用法:
特殊字符 | 功能 |
---|---|
; | 分號,表示連續執行命令 |
exp & | 句尾的&號,表示命令在后臺執行 |
n&>file | 重定向,將文件符n重定向到目標文件 |
exp1 && exp2 | 兩個命令中間的&&,表示exp1返回0才會執行exp2 |
exp1 || exp2 | 兩個命令中間的||,表示exp1返回非0才會執行exp2 |
${#var} | 返回列表或變量的長度 |
$0、$1、$2 | 和運行腳本的命令有關。0表示該腳本文件;1、2分別表示第1、2個參數 |
$*、$@、$# | 和運行腳本的命令有關。*和@表示參數列表;#表示參數個數 |
$$、$? | 和運行腳本的命令有關。\$表示腳本運行PID;?表示腳本退出碼 |
if語句
#可以寫成正常形式
if condition1
then
cmd1
elif condition2
then
cmd2
else
cmd3
fi
#也可以寫成一句話形式,中間用分號連接
if condition1; then cmd1; elif condition2; then cmd2; else cmd3; fi
for語句
#正常形式
for var in ${list[@]}
do
cmd1
cmd2
cmd3
done
#一句話形式,中間用分號分隔
for var in ${list[@]}; do cmd1; cmd2; cmd3; done
while語句
while語句是先判斷條件再執行循環,且條件為False時結束循環,同C語言
#正常形式
while condition
do
cmd1
cmd2
done
#一句話形式,中間用分號分隔
while condition; do cmd1; cmd2; done
until語句
until語句是執行函數后再判斷條件,且條件為True時結束循環,同C語言
until condition
do
cmd1
cmd2
done
until condition; do cmd1; cmd2; done
case語句
a=2
case $a in
1)
cmd1
;;
2)
cmd2
;;
*)
cmd3
;;
esac
#一句話形式
a=2
case $a in 1) cmd1;; 2) cmd2;; *) cmd3;; esac
跳出循環
可以在循環語句for、while、until以及枚舉語句case中,使用break
終止整個流程;使用continue
跳過本次流程。此處與C語言相同。
Shell可以定義函數,之后可以隨意調用。
funName(){ #定義函數,后面不用帶參數,傳參方法和命令相似
(ls -al $1)
echo $2
i=$3
while [ $i -gt 0 ]
do
echo $i
i=$(($i-1))
done
}
funName /usr this 3 #調用函數,后面是參數
新手發文,歡迎大佬指正錯誤
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。