Shell筆記

Shell筆記

變量的使用

定義變量

定義變量直接 變量名=值

注意

  1. =號左右不能有空格,不然認為變量名為shell命令
  2. 值可以為任意類型,想寫什么就寫什么,而且在后面可以隨意更改類型

使用變量

使用變量需要用$標識

name="corbin"
echo $name

也可以使用{}包圍(推薦)

name="corbin"
echo ${name}    

只讀變量

只讀變量 使用readonly定義變量即可

name="jay"
readonly name

刪除變量

刪除變量 使用unset定義變量即可

name="jay"
unset name  

Shell中的變量

字符串

字符串 單引號標識

str='this is a string'

單引號字符串的限制:

  • 單引號里的任何字符都會原樣輸出,單引號字符串中的變量是無效的;

  • 單引號字串中不能出現單引號(對單引號使用轉義符后也不行)。

字符串 雙引號標識

str=“this is a string”

雙引號的優點:

  • 雙引號里可以有變量

  • 雙引號里可以出現轉義字符

字符串的操作
  • 獲取字符串的長度

    str="abce"

    echo ${#str}

  • 提取子字符串

    str="this is a string"

    echo ${str:1:4}

上面demo從第二個字符開始截取一共4個字符

數組

使用()括號來標識數組,數組元素使用"空格"分割開。只支持一維數組,不支持多維數組,類似于C語言,數組元素的下標由0開始

array_name=(value0 value1 value2)

也可以使用回車

aray_name=(
value0
value1
value2
)

還可以單獨定義每一個分量

array_name[0]=value0
array_name[1]=value1
array_name[n]=valuen

可以不使用連續的下標,而且下邊沒有范圍限制

數組的操作
  • 讀取數組

    ${array_name[n]}

  • 讀取所有元素

    ${array_name[@]}

  • 獲取數組長度

    echo ${#array_name[*]} or echo ${#array_name[@]}

  • 獲取數組的子串

    echo ${array_name:1:4}

類似于獲取字符串的字串,上面的demo獲取從第二個開始的一共4個元素

其他變量

Shell中還有整數,浮點數等,但是沒有其他語言里面的布爾值

使用注釋

shell中的注釋為# Shell中沒有多行注釋

Shell 傳遞參數

我們在執行Shell腳本的時候,往往會傳遞一些參數,獲取這些參數的和使用變量的方式類似,使用$n,n=1,2,3...代表第一二三個參數,$0 代表執行的文件名

t.sh文件

echo "文件名為:${0}"
echo $1
echo ${2}
echo ${3}

傳遞參數的方法為,執行

sh ./t.sh value1 value2

上面demo沒有第三個參數,會打印空

一些額外的參數

參數處理    說明

$#  傳遞到腳本的參數個數

$*  以一個單字符串顯示所有向腳本傳遞的參數。

如"$*"用「"」括起來的情況、以"$1 $2 … $n"的形式輸出所有參數。

$$  腳本運行的當前進程ID號

$!  后臺運行的最后一個進程的ID號

$@  與$*相同,但是使用時加引號,并在引號中返回每個參數。

如"$@"用「"」括起來的情況、以"$1" "$2" … "$n" 的形式輸出所有參數。

$-  顯示Shell使用的當前選項,與set命令功能相同。

$?  顯示最后命令的退出狀態。0表示沒有錯誤,其他任何值表明有錯誤。

Shell腳本運行需要可執行權限,所以要使用chmod命令來給予可執行權限

chomd u+x t.sh

Shell 基本運算符

不支持簡單的數學運算,需要使用命令來計算,eg:awk和expr.

兩個數相加(使用的是反引號`)

val=`expr 2 + 2`
echo "2+2=${val}"

注意

  • 表達式和運算符之間需要空格,比如2+2是不對的,必須為2 + 2

  • 表達式需要被``(反引號)包含

    運算符 說明 舉例

    + 加法 expr $a + $b

    - 減法 expr $a - $b

    * 乘法 expr $a \* $b

    / 除法 expr $b / $a

    % 取余 expr $b % $a

    = 賦值 a=$b 將把變量 b 的值賦給 a。

    == 相等。用于比較兩個變量,相同則返回 true。如[ $a == $b ]

    != 不相等。用于比較兩個變量,不相同則返回 true。如[ $a != $b ]

注意:條件表達式要放在方括號之間,并且要有空格,例如: [$a==$b] 是錯誤的,必須寫成 [ $a == $b ]。

a=1
b='1'
if [ $a == $b ]
then
    echo "a = b"
else
    echo "a != b"
fi
輸出為:a = b

[]與[[]]的區別

[]實際上是bash 中 test 命令的簡寫。即所有的 [ expr ] 等于 test expr
對 test 命令來說, 用 -eq 要進行數字比較.

[[ expr ]] 是bash中真正的條件判斷語句,其語法更符合編程習慣 (比如 &&, || 的用法),在 [[ ]] 中的,任何需要整數,但是提供的確又是其他不能轉換成整數的字符串,都變成了0。 所以應該保證自己代碼中的需要用到整數的時候,總是提供整數。

邏輯運算符

以下介紹 Shell 的邏輯運算符,假定變量 a 為 10,變量 b 為 20:

運算符 說明  舉例
&&  邏輯的 AND [[ $a -lt 100 && $b -gt 100 ]] 返回 false
||  邏輯的 OR  [[ $a -lt 100 || $b -gt 100 ]] 返回 true

字符運算符

運算符 說明  舉例
=   檢測兩個字符串是否相等,相等返回 true。  [ $a = $b ] 返回 false。
!=  檢測兩個字符串是否相等,不相等返回 true。 [ $a != $b ] 返回 true。
-z  檢測字符串長度是否為0,為0返回 true。  [ -z $a ] 返回 false。
-n  檢測字符串長度是否為0,不為0返回 true。 [ -n $a ] 返回 true。
str 檢測字符串是否為空,不為空返回 true。   [ $a ] 返回 true。

文件測試運算符

文件測試運算符用于檢測 Unix 文件的各種屬性。
屬性檢測描述如下:
操作符 說明  舉例
-b file 檢測文件是否是塊設備文件,如果是,則返回 true。  [ -b $file ] 返回 false。
-c file 檢測文件是否是字符設備文件,如果是,則返回 true。 [ -c $file ] 返回 false。
-d file 檢測文件是否是目錄,如果是,則返回 true。 [ -d $file ] 返回 false。
-f file 檢測文件是否是普通文件(既不是目錄,也不是設備文件),如果是,則返回 true。    [ -f $file ] 返回 true。
-g file 檢測文件是否設置了 SGID 位,如果是,則返回 true。  [ -g $file ] 返回 false。
-k file 檢測文件是否設置了粘著位(Sticky Bit),如果是,則返回 true。  [ -k $file ] 返回 false。
-p file 檢測文件是否是有名管道,如果是,則返回 true。   [ -p $file ] 返回 false。
-u file 檢測文件是否設置了 SUID 位,如果是,則返回 true。  [ -u $file ] 返回 false。
-r file 檢測文件是否可讀,如果是,則返回 true。  [ -r $file ] 返回 true。
-w file 檢測文件是否可寫,如果是,則返回 true。  [ -w $file ] 返回 true。
-x file 檢測文件是否可執行,如果是,則返回 true。 [ -x $file ] 返回 true。
-s file 檢測文件是否為空(文件大小是否大于0),不為空返回 true。 [ -s $file ] 返回 true。
-e file 檢測文件(包括目錄)是否存在,如果是,則返回 true。    [ -e $file ] 返回 true。

流程控制

if elseif else

if condition1
then
    command1
elif condition2 
then 
    command2
else
    commandN
fi

for循環

for var in item1 item2 ... itemN
do
    command1
    command2
    ...
    commandN
done

while循環

while condition
do
    command
done
while無限循環
while :
do
    command
done

while true
do
    command
done

until 循環

until condition
do
    command
done

case語句

case 值 in
模式1)
    command1
    command2
    ...
    commandN
    ;;
模式2)
    command1
    command2
    ...
    commandN
    ;;
*)
    ;;
esac

跳出循環

break

break命令

break命令允許跳出所有循環(終止執行后面的所有循環)。

continue

continue命令與break命令類似,只有一點差別,它不會跳出所有循環,僅僅跳出當前循環。

Shell 函數

demoFun(){
    echo "這是我的第一個 shell 函數!"
}
echo "-----函數開始執行-----"
demoFun
echo "-----函數執行完畢-----"

定義一個帶有return語句的函數:

funWithReturn(){
    echo "這個函數會對輸入的兩個數字進行相加運算..."
    echo "輸入第一個數字: "
    read aNum
    echo "輸入第二個數字: "
    read anotherNum
    echo "兩個數字分別為 $aNum 和 $anotherNum !"
    return $(($aNum+$anotherNum))
}
funWithReturn
echo "輸入的兩個數字之和為 $? !"

帶參數的函數示例

funWithParam(){
    echo "第一個參數為 $1 !"
    echo "第二個參數為 $2 !"
    echo "第十個參數為 $10 !"
    echo "第十個參數為 ${10} !"
    echo "第十一個參數為 ${11} !"
    echo "參數總數有 $# 個!"
    echo "作為一個字符串輸出所有參數 $* !"
}
funWithParam 1 2 3 4 5 6 7 8 9 34 73
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 229,362評論 6 537
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 99,013評論 3 423
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事?!?“怎么了?”我有些...
    開封第一講書人閱讀 177,346評論 0 382
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,421評論 1 316
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 72,146評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,534評論 1 325
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,585評論 3 444
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,767評論 0 289
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 49,318評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 41,074評論 3 356
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,258評論 1 371
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,828評論 5 362
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,486評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,916評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,156評論 1 290
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,993評論 3 395
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,234評論 2 375

推薦閱讀更多精彩內容

  • 變量使用$variable, ${variable_a} 輸出到屏幕echoecho -e 對字符串中轉義字符進行...
    mrwrong1988閱讀 671評論 0 49
  • 基礎 頭文件 #!/bin/bash 或者#!/bin/sh #!約定的標記,如IOS的Import 執行文件時需...
    ZMJun閱讀 1,242評論 1 2
  • 一,shell題記 不懂shell的程序員不是好程序員,學習shell是為了自動化,使用自動化可以非常有效的提高工...
    架構師小秘圈閱讀 8,733評論 3 70
  • 01 一位大三的小姑娘與我聊天,整個晚上都在跟我倒苦水,各種室友不和諧、學習壓力大、畢業迷茫感,甚至還有食堂飯菜不...
    午后囈語閱讀 5,103評論 139 285
  • 突然接到前男友D的女友的電話,說什么D和她分手了,又在嗨粉.問我她應該怎么辦。這不是當初我想要的結果嗎?可為什么...
    余笙都是你閱讀 390評論 0 0