Linux學習——Shell語法

拖了不少終於開始學系列-Shell語法

編寫Hello world

[root@VM_234_23_centos ~]# vim hello.sh
---hello.sh
echo "Hello world!"

----
[root@VM_234_23_centos ~]#sh hello.sh
Hello world!
複製代碼

執行方式

有兩種執行方式html

  • sh : 例如上面的 # sh hello.sh 實際上使用的是/bin/bash程序,它會在一個新的bash環境內執行腳本內的指令!能夠理解爲在當前進程新建一個子程序bash進行程序的處理。(跟多線程類似,bash是子線程,私有變量不影響主進程的變量)。
  • source : 在本bash程序中執行,全部操做在本來的bash中生效。(大概能夠理解爲,是在原來的進程中操做,變量定義和修改都會影響到原來的bash)。

判斷式

test指令

這個指令能夠用來檢測某些文件或者相關的屬性,更多使用在命令行中輸入man test以後,能看到相關參數的說明。linux

# 測試文件是否存在,單純的test是不會返回執行結果的
[root@VM_234_23_centos ~]# test -e index.html
# 咱們能夠根據上一次的執行結果來判斷指令是否成功
[root@VM_234_23_centos ~]# echo $?
0
# 關於 &&(與) || (或)的操做
# PS shell裏面好像沒有指令的優先級這一說法,因此在處理邏輯運算時,要記得帶小括號或者編寫的順序
[root@VM_234_23_centos ~]# test -e index.html && echo "file exist" || echo "Not exist"
file exist
複製代碼

Shell script的默認函數($0,$1...)

實際寫一個指令,大概就能明白默認函數的位置了shell

/path/to/scirptname parm1 parm2 parm3 parm4
       $0           $1    $2   $3   $4
複製代碼
  • $0 : 腳本檔名
  • $1 : 第一個參數
  • $2 : 第二個參數
  • $# : 參數的個數
  • $@ : 表示參數列表,例如上面的,表示[ "$1", "$2", "$3", "$4"],每一個變量是獨立的。
  • $* : 表示[ "$1c$2c$3c$4" ],其中c爲分割字符,默認是空格鍵

shift:形成參數變量號碼偏移

感受偏移就像是移動參數數組的下標vim

先編寫一個程序centos

[root@VM_234_23_centos ~]vim shift_test.sh
echo "This program script name is : $0"
echo "Before Shift"
echo "This program paramters number is : $#"
echo "Your whole paramter is : $@"
echo "The first number is : $1"
echo "After Shift"
shift 3
echo "Your whole paramters number is : $#"
echo "Your whole paramter is : $@"
echo "The first number is : $1"
echo "End"

最後進行保存和退出:wq
複製代碼

來看執行結果數組

[root@VM_234_23_centos ~]
sh shift_test.sh parm1 parm2 parm3 parm4 parm5 parm6
This program script name is : shift_test.sh   #檔名
Before Shift
This program paramters number is : 6 #參數數量
Your whole paramter is : parm1 parm2 parm3 parm4 parm5 parm6  #所有變量
The first number is : parm1
After Shift     # 移動以後
Your whole paramters number is : 3 # 參數下標移動了,總數量也就相應變少了
Your whole paramter is : parm4 parm5 parm6
The first number is : parm4
End
複製代碼

條件判斷式

利用 if...then

if條件成立的話,執行then以後的語句,格式以下:bash

if [條件判斷式] ; the
     xxxx # 條件成立時,能夠進行的指令工做內容
fi  # 反過來表示if語句段結束的意思
複製代碼

條件判斷式中,當有多個條件要判別時,經常使用如下兩個:多線程

  • && 表明 AND
  • || 表明 OR

多重判斷式

兩種情形:成功或者失敗函數

# 一個條件的判斷,分爲成功和失敗的執行(else)
if [條件判斷式 ]; then
    成功語句
else 
    條件失敗時執行的語句
fi
複製代碼

多個條件oop

if [條件一] ; then
    條件一成功時執行的語句
elif [條件二] ; then
    條件二成功時執行的語句
else 
    以上條件都不成立時,執行這一條語句
fi
複製代碼

case...esac

以case開始,esac結束。具體語法以下

case ${變量名稱} in
  "第一個變量內容")  #每一個變量內容建議使用雙引號括起來,關鍵詞爲小括號 )
    程序段
    ;;      # 每一個類別結尾使用兩個連續的分號來處理
  "第二個變量內容")
    程序段
    ;;
  *)        # 最後一個變量內容都會用 * 來表明全部其餘值(有點像default節點hhh)
    上面語句都沒有執行的話,這段內容會被執行
    exit 1
    ;;
esac  # case的結尾,【反過來寫】
複製代碼

function功能

【函數(function)】,相似於一個定義執行指令的片斷封裝體,例如:

function fname() {
    程序段
}
複製代碼

注意點:shell script的執行方式是由上而下,由左而右,所以在shell script當中的function的設定必定要在程序的最前面。

例以下面例子,定義一個簡單的打印函數,而後經過輸入的參數進行case選擇進行打印:

[root@VM_234_23_centos ~]vim test.sh
function printit() {
    echo  "Your choice is "
}

echo "This program will print yout selection !"
case ${1} in
  "one")
	printit; echo ${1} | tr 'a-z' 'A-Z' # 轉換大小寫
	;;
  "two")
	printit; echo ${1} | tr 'a-z' 'A-Z'
	;;
  *)
	echo "The param not match"
	;;
esac
複製代碼

保存以後,執行代碼:

[root@VM_234_23_centos ~]sh test.sh one
This program will print yout selection !
Your choice is
ONE
複製代碼

書本中也提到,一行代碼的函數看起來的確有點雞肋,可是能夠封裝多條指令,變成一個模塊,抽象重複的代碼,提升代碼整潔度。

function也有內建變量,與shell script很相似,函數名稱$0,後續變量是 $1,$2... ,但只在函數內生效噢~


循環Loop

循環能夠不斷的執行某個程序段落,知道用戶設定的條件達成爲止。

while do done,until do done(不定循環)

①:當condition條件成立時,就進行循環,直到condition的條件不成立才中止

while [condition] # 中括號內的狀態就是判斷式
do              # 標誌着循環的開始
    程序段
done            # 標誌着循環的結束
複製代碼

②:until

until [condition]
do
    程序段
done
複製代碼

這二者之間實際上是很相似的,區別在於,while循環時,至少會判斷一次condition,而until運行到循環語句時,直接執行程序段,而後在第二次循環前再判斷condition。

for...do...done(固定循環)

這種循環是知道要進行多少次循環,一般循環體是一個數組,對每個參數進行遍歷處理。

①:foreach形式

for var in con1 con2 con3 ...
do
    程序段
done
複製代碼

②:自定義步長的處理

for ((初始值; 限定值; 執行步長 ))
do
    程序段
done

例如:
for (( i = 1; i < ${number}; i = i + 1 ))
do
    程序段
done
複製代碼

瞭解一下數組的寫法

跟日常的數組同樣,經過下標來指定數組中每一個值,一樣下標也是從0開始的喲~

[root@VM_234_23_centos ~]vim list.sh
function print_list() {
   local numbers        # 聲明本地變量
   numbers=(`echo "$@"`) # 將傳參轉回數組,不這樣作的話,$1會被當成是一個總體字符喲
   size=${#numbers[*]}
   for (( i=0; i<${size}; i=i+1 ))
   do
         echo "The ${i} number is ${numbers[i]}"
   done
}
list=(0 1 2 3 4)
print_list "${list[*]}" # 傳遞一個數組到方法中
[root@VM_234_23_centos ~]sh list.sh
The 0 number is 0
The 1 number is 1
The 2 number is 2
The 3 number is 3
The 4 number is 4
複製代碼

上面的例子大概寫了如何定義一個函數、將數組做爲傳參、在函數內將傳參數組轉化還有數組的for循環~


參考資料

一、《鳥哥的Linux私房菜-基礎篇》

相關文章
相關標籤/搜索