[root@VM_234_23_centos ~]# vim hello.sh
---hello.sh
echo "Hello world!"
----
[root@VM_234_23_centos ~]#sh hello.sh
Hello world!
複製代碼
有兩種執行方式html
這個指令能夠用來檢測某些文件或者相關的屬性,更多使用在命令行中輸入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
/path/to/scirptname parm1 parm2 parm3 parm4
$0 $1 $2 $3 $4
複製代碼
感受偏移就像是移動參數數組的下標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以後的語句,格式以下:bash
if [條件判斷式] ; the
xxxx # 條件成立時,能夠進行的指令工做內容
fi # 反過來表示if語句段結束的意思
複製代碼
條件判斷式中,當有多個條件要判別時,經常使用如下兩個:多線程
兩種情形:成功或者失敗函數
# 一個條件的判斷,分爲成功和失敗的執行(else)
if [條件判斷式 ]; then
成功語句
else
條件失敗時執行的語句
fi
複製代碼
多個條件oop
if [條件一] ; then
條件一成功時執行的語句
elif [條件二] ; then
條件二成功時執行的語句
else
以上條件都不成立時,執行這一條語句
fi
複製代碼
以case開始,esac結束。具體語法以下
case ${變量名稱} in
"第一個變量內容") #每一個變量內容建議使用雙引號括起來,關鍵詞爲小括號 )
程序段
;; # 每一個類別結尾使用兩個連續的分號來處理
"第二個變量內容")
程序段
;;
*) # 最後一個變量內容都會用 * 來表明全部其餘值(有點像default節點hhh)
上面語句都沒有執行的話,這段內容會被執行
exit 1
;;
esac # case的結尾,【反過來寫】
複製代碼
【函數(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... ,但只在函數內生效噢~
循環能夠不斷的執行某個程序段落,知道用戶設定的條件達成爲止。
①:當condition條件成立時,就進行循環,直到condition的條件不成立才中止
while [condition] # 中括號內的狀態就是判斷式
do # 標誌着循環的開始
程序段
done # 標誌着循環的結束
複製代碼
②:until
until [condition]
do
程序段
done
複製代碼
這二者之間實際上是很相似的,區別在於,while循環時,至少會判斷一次condition,而until運行到循環語句時,直接執行程序段,而後在第二次循環前再判斷condition。
這種循環是知道要進行多少次循環,一般循環體是一個數組,對每個參數進行遍歷處理。
①: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循環~