shell入門學習(1)——語法基礎

本文為轉載,原文:shell入門學習(1)——語法基礎

shell

介紹

Shell Script,Shell腳本與Windows/Dos下的批處理相似,也就是用各類命令預先放入到一個文件中,方便一次性執行的一個程序文件,主要是方便管理員進行設置或者管理用的。但是它比Windows下的批處理更強大,比用其他編程程序編輯的程序效率更高,它使用了Linux/Unix下的命令。

Hello World

在學習之前,我們先看個最簡單的hello world的例子,新建helloworld.sh文件,編寫以下代碼:

#!/bin/sh
# Athor: Chain
echo "hello world"

在該文件目錄下,執行以下命令:

./helloworld.sh
helloworld

若是執行*.sh腳本文件的時候報Permission denied錯誤,可在該目錄下先執行以下命令:

chmod a+x *.sh

代碼解讀

  1. 第一行#!/bin/sh#! 是一種約定標記, 它可以告訴系統這個腳本需要什么樣的解釋器來執行
  2. 第二行# Athor: Chain# 是用于注釋的標記
  3. 第三行echo "hello world":輸出hello world字符串。

變量

Shell Script是一種弱類型語言,使用變量的時候無需首先聲明其類型。新的變量會在本地數據區分配內存進行存儲,這個變量歸當前的Shell所有,任何子進程都不能訪問本地變量。這些變量與環境變量不同,環境變量被存儲在另一內存區,叫做用戶環境區,這塊內存中的變量可以被子進程訪問。變量賦值的方式是:

variable_name=variable_value

注意:等號兩邊不要有空格,否則會報錯的。

如果對一個已經有值的變量賦值,新值將取代舊值。取值的時候要在變量名前加,variable_name可以在引號中使用,這一點和其他高級語言是明顯不同的。如果出現混淆的情況,可以使用花括號來區分。例如:

#!/bin/sh
# Athor: Chain

str="hello world"
echo $str
echo "shell say $str"
echo "shell say $strs"
echo "shell say ${str}s"
結果

控制流程

條件

if語句

if語句格式

if ...; then
    ...
elif ...; then
    ...
else
    ...
fi

Shell Script中if語句的條件部分要以分號來分隔,若是條件測試的話,需要將條件用[]包起來,且括號兩邊必須要有空格。
常見的條件測試如下:

1. 整數比較:
-eq 測試兩個整數是否相等
-ne 測試兩個整數是否不等
-gt 測試一個數是否大于另一個數
-lt 測試一個數是否小于另一個數
-ge 大于或等于
-le 小于或等于

2. 字符串比較:
== 等于 兩邊要有空格
!= 不等
> 大于
< 小于
-z string 當串的長度為0時為真
-n string 當串的長度大于0時為真

3. 文件比較:
-e file 測試文件是否存在
-f file 測試文件是否為普通文件
-d file 測試指定路徑是否為目錄
-r file 測試文件對當前用戶是否可讀
-w file 測試文件對當前用戶是否可寫
-x file 測試文件對當前用戶是都可執行

4. 組合測試條件:
-a: and
-o: or
!: 非

示例
實現一個輸入考試分數,打出評分,規則如下:

A: 90–100
B: 80–89
C: 70–79
D: 60–69
F: < 60

shell腳本實現:

#!/bin/sh
# Author: Chain

# 終端輸入處理
read -p "請輸入您的分數(0-100):" grade

# 合法性校驗
if [ -z "$grade" ]; then
    echo "您沒有輸入分數"
    exit
fi

if [ $grade -gt "100" -o $grade -lt "0" ]; then
    echo "您輸入的分數不在0-100范圍內"
    exit
fi
# 計算等級
if [ $grade -ge "90" -a $grade -le "100" ]; then
    echo "好極了,您的評分為: A"
elif [ $grade -ge "80" -a $grade -le "89" ]; then
    echo "很好。您的評分為 B"
elif [ $grade -ge "70" -a $grade -le "79" ]; then
    echo "好。您的評分為 C"
elif [ $grade -ge "60" -a $grade -le "69" ]; then
    echo "不錯。您的評分為 D"
elif [ $grade -lt "60" ]; then
    echo "好吧。您的評分為 E"
fi
if語句實例結果

循環

for

語法:

for item in …; do
    …
done

for (( cond1; cond2; cond3 )) do
    …
done

示例:

#!/bin/sh
# Author: Chain

echo "for循環示例1"
for ((i = 0; i < 5; i++)) do
    echo $i
done

echo "for循環示例2"
for i in $(seq 5); do
    echo $i
done
for示例結果

while

語法:

while …; do
    …
done

示例:

#!/bin/sh
# Author: Chain

echo "while循環示例"
i=5
while [ $i -gt 0 ]; do
    echo $i
    ((i--))
done
while示例結果

until

語法:

until …; do
    …
done

示例:

#!/bin/sh
# Author: Chain

echo "until循環示例"
i=5
until [ $i -lt 0 ]; do
    echo $i
    ((i--))
done
until示例結果

選擇

case

語法:

case var in
    pattern 1 )
        … ;;
    pattern 2 )
        … ;;
    *)
        … ;;
esac

示例:

#!/bin/sh
# Author: Chain

echo "case示例"

case $1 in
start | begin)
    echo "start something";;
stop | end)
    echo "stop somethinf";;
restart)
    echo "restart something"
;;
*)
    echo "Ignorant"
;;
esac
case示例結果

select

Bash提供了一種用于交互式應用的擴展select,用戶可以從一組不同的值中進行選擇。

語法:

select var in …; do
    break;
done

示例:

#!/bin/sh
# Author: Chain

select ch in "begin" "end" "exit"; do
    case $ch in
        "begin")
            echo "start something"
        ;;
        "end")
            echo "stop something"
        ;;
        "exit")
            echo "exit"
            break;
        ;;
        *)
            echo "Ignorant"
        ;;
    esac
done;
select示例結果

注意:這里交互輸入要輸入1,2,3,而不是beign,end,exit

函數

和其他語言一樣,在Shell語言中也有著函數。盡管在Shell中函數并非是必須的編程元素,但是通過使用函數,可以對程序進行更加好的組織。將一些相對獨立的代碼變成函數,可以提高程序的可讀性和重用性。避免重復編寫大量相同的代碼。

定義:

# 定義函數格式一:
functionname()
{
    …
}

# 定義函數格式二:
# 函數名前面多了個function關鍵字
function functionname() 
{
    …
}

示例:

#!/bin/sh
# Author: Chain
# function用法示例

#####函數定義#####
# 注意:所有函數在使用前必須定義。這意味著必須將函數放在腳本開始部分,直至shell解釋器首次發現它時,才可以使用。
# 無參數的函數定義
function hello(){
    echo "Hello! "
}

# 有參數的函數定義
# $1為參數
function hello_param(){
    echo "Hello $1 !"
}

# 有返回的函數定義
add(){
    echo "The function is to get the sum of two numbers..."
    echo -n "Input first number: "
    read aNum
    echo -n "Input another number: "
    read anotherNum
    echo "The two numbers are $aNum and $anotherNum !"
    return $(($aNum+$anotherNum))
}

#####函數調用#####
echo "無參函數調用"
hello
echo "有參函數調用"
hello_param Chain
echo "有返回的函數調用"
add
# 函數返回值在調用該函數后通過 $? 來獲得
echo "The sum of two numbers is $? !"

# 若函數與調用的地方不在同一個文件,在調用之前需要先加載
# .和文件名中間需要有個空格
# . filename.sh
# 另外,用unset functionname 可以取消載入指定的函數名
函數示例結果

注意

  1. 執行腳本時,所傳參數只要跟在腳本文件名后即可,用空格隔開,多個參數也是用空格隔開,讀取參數按照傳入參數順序用$1, $2, $3... 讀取即可。例如:./filename.sh param1 param2
  1. 調用有參數的函數時,所傳參數只要跟在函數名后即可,用空格隔開,多個參數也是用空格隔開,讀取參數按照傳入參數順序用$1, $2, $3... 讀取即可。例如:function_name param1 param2

轉載請注明出處
shell入門學習(1)——語法基礎

?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容