shell一文入門通

一隻大白兔兔兔兔兔丫發表於2020-01-29

簡單來說“Shell程式設計就是對一堆Linux命令的邏輯化處理”。

W3Cschool 上的一篇文章是這樣介紹 Shell的什麼是 Shell?

hello world

學習任何一門程式語言第一件事就是輸出HelloWord了!下面我會從新建檔案到shell程式碼編寫來說下Shell 程式設計如何輸出Hello World。

(1)新建一個檔案 helloworld.sh :touch helloworld.sh,副檔名為 sh(sh代表Shell)(副檔名並不影響指令碼執行,見名知意就好,如果你用 php 寫 shell 指令碼,副檔名就用 php 好了)

(2) 使指令碼具有執行許可權:chmod +x helloworld.sh

(3) 使用 vim 命令修改helloworld.sh檔案:vim helloworld.sh(vim 檔案------>進入檔案----->命令模式------>按i進入編輯模式----->編輯檔案 ------->按Esc進入底行模式----->輸入:wq/q! (輸入wq代表寫入內容並退出,即儲存;輸入q!代表強制退出不儲存。))

helloworld.sh 內容如下:

#!/bin/bash
#第一個shell小程式,echo 是linux中的輸出命令。
echo  "helloworld!"

shell中 # 符號表示註釋。shell 的第一行比較特殊,一般都會以#!開始來指定使用的 shell 型別。在linux中,除了bash shell以外,還有很多版本的shell, 例如zsh、dash等等...不過bash shell還是我們使用最多的。

(4) 執行指令碼:./helloworld.sh 。(注意,一定要寫成 ./helloworld.sh ,而不是 helloworld.sh ,執行其它二進位制的程式也一樣,直接寫 helloworld.sh ,linux 系統會去 PATH 裡尋找有沒有叫 helloworld.sh 的,而只有 /bin, /sbin, /usr/bin,/usr/sbin 等在 PATH 裡,你的當前目錄通常不在 PATH 裡,所以寫成 helloworld.sh 是會找不到命令的,要用./helloworld.sh 告訴系統說,就在當前目錄找。)

shell 程式設計Hello World

變數

Shell程式設計中一般分為三種變數:

  1. 我們自己定義的變數(自定義變數): 僅在當前 Shell 例項中有效,其他 Shell 啟動的程式不能訪問區域性變數。
  2. Linux已定義的環境變數(環境變數, 例如:$PATH, $HOME 等..., 這類變數我們可以直接使用),使用 env 命令可以檢視所有的環境變數,而set命令既可以檢視環境變數也可以檢視自定義變數。
  3. Shell變數 :Shell變數是由 Shell 程式設定的特殊變數。Shell 變數中有一部分是環境變數,有一部分是區域性變數,這些變數保證了 Shell 的正常執行

常用的環境變數:

PATH 決定了shell將到哪些目錄中尋找命令或程式 HOME 當前使用者主目錄 HISTSIZE 歷史記錄數 LOGNAME 當前使用者的登入名 HOSTNAME 指主機的名稱 SHELL 當前使用者Shell型別 LANGUGE  語言相關的環境變數,多語言可以修改此環境變數 MAIL 當前使用者的郵件存放目錄 PS1 基本提示符,對於root使用者是#,對於普通使用者是$

使用 Linux 已定義的環境變數:

比如我們要看當前使用者目錄可以使用:echo $HOME命令;如果我們要看當前使用者Shell型別 可以使用echo $SHELL命令。可以看出,使用方法非常簡單。

使用自己定義的變數:

#!/bin/bash
#自定義變數hello
hello="hello world"
echo $hello
echo  "helloworld!"

使用自己定義的變數

Shell 程式設計中的變數名的命名的注意事項:

  • 命名只能使用英文字母,數字和下劃線,首個字元不能以數字開頭,但是可以使用下劃線(_)開頭。
  • 中間不能有空格,可以使用下劃線(_)。
  • 不能使用標點符號。
  • 不能使用bash裡的關鍵字(可用help命令檢視保留關鍵字)。

字串

字串是shell程式設計中最常用最有用的資料型別(除了數字和字串,也沒啥其它型別好用了),字串可以用單引號,也可以用雙引號。這點和Java中有所不同。

單引號字串:

#!/bin/bash
name='SnailClimb'
hello='Hello, I  am '$name'!'
echo $hello

輸出內容:

Hello, I am SnailClimb!

雙引號字串:

#!/bin/bash
name='SnailClimb'
hello="Hello, I  am "$name"!"
echo $hello

輸出內容:

Hello, I am SnailClimb!

拼接字串:

#!/bin/bash
name="SnailClimb"
# 使用雙引號拼接
greeting="hello, "$name" !"
greeting_1="hello, ${name} !"
echo $greeting  $greeting_1
# 使用單引號拼接
greeting_2='hello, '$name' !'
greeting_3='hello, ${name} !'
echo $greeting_2  $greeting_3

輸出結果:

輸出結果

獲取字串長度:

#!/bin/bash
#獲取字串長度
name="SnailClimb"
# 第一種方式
echo ${#name} #輸出 10
# 第二種方式
expr length "$name";

輸出結果:

10
10

使用 expr 命令時,表示式中的運算子左右必須包含空格,如果不包含空格,將會輸出表示式本身:

expr 5+6    // 直接輸出 5+6
expr 5 + 6       // 輸出 11

對於某些運算子,還需要我們使用符號\進行轉義,否則就會提示語法錯誤。

expr 5 * 6       // 輸出錯誤
expr 5 \* 6      // 輸出30

擷取子字串:

簡單的字串擷取:

#從字串第 1 個字元開始往後擷取 10 個字元
str="SnailClimb is a great man"
echo ${str:0:10} #輸出:SnailClimb

根據表示式擷取:

#!bin/bash
#author:amau

var="http://www.runoob.com/linux/linux-shell-variable.html"

s1=${var%%t*}#h
s2=${var%t*}#http://www.runoob.com/linux/linux-shell-variable.h
s3=${var%%.*}#http://www
s4=${var#*/}#/www.runoob.com/linux/linux-shell-variable.html
s5=${var##*/}#linux-shell-variable.html

陣列

bash支援一維陣列(不支援多維陣列),並且沒有限定陣列的大小。我下面給了大家一個關於陣列操作的 Shell 程式碼示例,通過該示例大家可以知道如何建立陣列、獲取陣列長度、獲取/刪除特定位置的陣列元素、刪除整個陣列以及遍歷陣列。

#!/bin/bash
array=(1 2 3 4 5);
# 獲取陣列長度
length=${#array[@]}
# 或者
length2=${#array[*]}
#輸出陣列長度
echo $length #輸出:5
echo $length2 #輸出:5
# 輸出陣列第三個元素
echo ${array[2]} #輸出:3
unset array[1]# 刪除下標為1的元素也就是刪除第二個元素
for i in ${array[@]};do echo $i ;done # 遍歷陣列,輸出: 1 3 4 5 
unset arr_number; # 刪除陣列中的所有元素
for i in ${array[@]};do echo $i ;done # 遍歷陣列,陣列元素為空,沒有任何輸出內容

 

Shell 程式設計支援下面幾種運算子

  • 算數運算子
  • 關係運算子
  • 布林運算子
  • 字串運算子
  • 檔案測試運算子

算數

算數運算子

我以加法運算子做一個簡單的示例(注意:不是單引號,是反引號):

#!/bin/bash
a=3;b=3;
val=`expr $a + $b`
#輸出:Total value : 6
echo "Total value : $val"

關係

關係運算子只支援數字,不支援字串,除非字串的值是數字。

shell關係運算子

通過一個簡單的示例演示關係運算子的使用,下面shell程式的作用是當score=100的時候輸出A否則輸出B。

#!/bin/bash
score=90;
maxscore=100;
if [ $score -eq $maxscore ]
then
   echo "A"
else
   echo "B"
fi

輸出結果:

B

邏輯

邏輯運算子

示例:

#!/bin/bash
a=$(( 1 && 0))
# 輸出:0;邏輯與運算只有相與的兩邊都是1,與的結果才是1;否則與的結果是0
echo $a;

布林

布林運算子

這裡就不做演示了,應該挺簡單的。

字串

字串運算子

簡單示例:


#!/bin/bash
a="abc";
b="efg";
if [ $a = $b ]
then
   echo "a 等於 b"
else
   echo "a 不等於 b"
fi

輸出:

a 不等於 b

檔案

檔案相關運算子

使用方式很簡單,比如我們定義好了一個檔案路徑file="/usr/learnshell/test.sh" 如果我們想判斷這個檔案是否可讀,可以這樣if [ -r $file ] 如果想判斷這個檔案是否可寫,可以這樣-w $file,是不是很簡單。

流程控制

if

簡單的 if else-if else 的條件語句示例

#!/bin/bash
a=3;
b=9;
if [ $a -eq $b ]
then
   echo "a 等於 b"
elif [ $a -gt $b ]
then
   echo "a 大於 b"
else
   echo "a 小於 b"
fi

輸出結果:

a 小於 b

相信大家通過上面的示例就已經掌握了 shell 程式設計中的 if 條件語句。不過,還要提到的一點是,不同於我們常見的 Java 以及 PHP 中的 if 條件語句,shell if 條件語句中不能包含空語句也就是什麼都不做的語句。

for

通過下面三個簡單的示例認識 for 迴圈語句最基本的使用,實際上 for 迴圈語句的功能比下面你看到的示例展現的要大得多。

輸出當前列表中的資料:

for loop in 1 2 3 4 5
do
    echo "The value is: $loop"
done

產生 10 個隨機數:

#!/bin/bash
for i in {0..9};
do 
   echo $RANDOM;
done

輸出1到5:

通常情況下 shell 變數呼叫需要加 $,但是 for 的 (()) 中不需要,下面來看一個例子:

#!/bin/bash
for((i=1;i<=5;i++));do
    echo $i;
done;

while

基本的 while 迴圈語句:

#!/bin/bash
int=1
while(( $int<=5 ))
do
    echo $int
    let "int++"
done

while迴圈可用於讀取鍵盤資訊:

echo '按下 <CTRL-D> 退出'
echo -n '輸入你最喜歡的電影: '
while read FILM
do
    echo "是的!$FILM 是一個好電影"
done

輸出內容:

按下 <CTRL-D> 退出
輸入你最喜歡的電影: 變形金剛
是的!變形金剛 是一個好電影

無限迴圈:

while true
do
    command
done

不帶引數沒有返回值的函式

#!/bin/bash
hello(){
    echo "這是我的第一個 shell 函式!"
}
echo "-----函式開始執行-----"
hello
echo "-----函式執行完畢-----"
-----函式開始執行-----
這是我的第一個 shell 函式!
-----函式執行完畢-----

有返回值

相加

#!/bin/bash
funWithReturn(){
    echo "輸入第一個數字: "
    read aNum
    echo "輸入第二個數字: "
    read anotherNum
    echo "兩個數字分別為 $aNum 和 $anotherNum !"
    return $(($aNum+$anotherNum))
}
funWithReturn
echo "輸入的兩個數字之和為 $?"
輸入第一個數字: 
1
輸入第二個數字: 
2
兩個數字分別為 1 和 2 !
輸入的兩個數字之和為 3

帶引數

#!/bin/bash
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
第一個引數為 1 !
第二個引數為 2 !
第十個引數為 10 !
第十個引數為 34 !
第十一個引數為 73 !
引數總數有 11 個!
作為一個字串輸出所有引數 1 2 3 4 5 6 7 8 9 34 73 !

 

相關文章