shell 语法介绍
大家好,我是藍(lán)胖子,在日常開發(fā)中或多或少都會接觸到shell腳本,可以說會shell腳本是一位后端開發(fā)的基本功,今天我將會花上一篇文章總結(jié)下常見的shell的語法,學(xué)完本篇,相信簡單的shell腳本就能夠看懂了,一些比較高級的語法可以遇到的時候再去學(xué)習(xí)。
我認(rèn)為學(xué)習(xí)一門編程語言語法的時候,最基本的無外乎就是語言中的類型定義,以及循環(huán)或if else等跳轉(zhuǎn)指令,懂了這兩個以后,便能寫一些簡單的邏輯了。所以shell語言也不例外,我也會從這兩個角度去介紹。
變量定義
首先看下shell中對變量的定義,其中分為環(huán)境變量和局部變量。
環(huán)境變量在子shell進(jìn)程中是可見的,可以通過export 關(guān)鍵字進(jìn)行定義,如下所示,
[root@localhost ~]# export VAR=value
局部變量是指在某個shell中生效的變量,這個變量在其他shell中是無效。
變量的定義
變量的定義可以通過如下方式進(jìn)行定義,
變量名=變量值,
[root@localhost ~]# name=john
注意點一:變量名和變量值之間用等號緊緊相連,之間沒有任何空格
注意點二:當(dāng)變量中有空格時必須用引號(單引號,雙引號都可以)括起,否則會出現(xiàn)錯誤
變量的引用
定義了變量,那么如何對其進(jìn)行引用呢?可以通過如下方式對變量進(jìn)行引用,
在變量前面加上$ 符號即可。
(base) ? ~ name=lanpangzi
(base) ? ~ echo $name
lanpangzi
更標(biāo)準(zhǔn)點的寫法是用${}將變量名括起來。
(base) ? ~ echo ${name}
lanpangzi
位置參數(shù)
除了通過${變量名} 方式引用變量,還可以通過 $數(shù)字 方式獲取shell腳本的參數(shù),$0 代表第一個參數(shù),$1 代表第二個參數(shù),依次類推。 另外 $# 代表參數(shù)的個數(shù), $* 或者 $@代表所有參數(shù),例如我寫一個腳本 輸出這些變量。
腳本如下,
!/bin/sh
echo "第一個參數(shù): $0"
echo "第二個參數(shù): $1"
echo "所有參數(shù): $@"
echo "參數(shù)個數(shù): $#"
運行這個腳本
(base) ? ~ sh print.sh wudi lanoangzi
print.sh: line 1: !/bin/sh: No such file or directory
第一個參數(shù): print.sh
第二個參數(shù): wudi
所有參數(shù): wudi lanoangzi
參數(shù)個數(shù): 2
注意下shell腳本中單引號和雙引號的區(qū)別,如果要讓輸出的語句中引用變量,那么要用雙引號。
數(shù)組的語法
另外,在shell腳本中還有個經(jīng)常用到的類型,數(shù)組,與其他語言不同的是,shell腳本中的數(shù)據(jù)只支持一維數(shù)組。
數(shù)組的定義方式如下,
declare 關(guān)鍵字定義數(shù)組,其中元素用()括起來,并且元素之間用空格隔開。
declare arr1=(元素1 元素2)
數(shù)組中的元素引用方式如下,
echo ${數(shù)組名[索引號]}
比較特殊的是可以通過 ${數(shù)組名[@]} 或者 ${數(shù)組名[*]} 獲取數(shù)組中的 元素, 可以通過 ${#數(shù)組名[@]} 或者 ${#數(shù)組名[*]} 獲取數(shù)組的長度。
對數(shù)組中元素替換和新增數(shù)組元素可以按如下操作,
對指定位置的變量進(jìn)行替換
數(shù)組名[索引值]=30
假設(shè)數(shù)組名是arr,對數(shù)組末尾進(jìn)行元素添加,
arr[${#arr[@]}]=30
循環(huán)以及判斷語句
看了變量的定義,我們再來看看shell腳本中的跳轉(zhuǎn)指令,在學(xué)跳轉(zhuǎn)指令前還需要對shell中如何對表達(dá)式獲取表達(dá)式的結(jié)果有所了解,因為一般跳轉(zhuǎn)指令都是條件跳轉(zhuǎn),像if else之類的語句,總有個判斷條件。
表達(dá)式結(jié)果
在shell中可以通過$? 獲取上一個shell語句的執(zhí)行結(jié)果,shell命令中規(guī)定0才是命令正確執(zhí)行后的返回結(jié)果,其余結(jié)果都是不正確的。
讓表達(dá)式執(zhí)行比較邏輯的方式有兩種,
1, 第一種是通過test expression 的方式,test后面跟表達(dá)式,如下所示,比較了兩個數(shù)字是否相等,返回1說明相等。
(base) ? ~ test 1 -eq 2
(base) ? ~ echo $?
1
2, 第二種方式是使用[] 把表達(dá)式括起來,這種方式注意[] 內(nèi)變量需要與括號相隔一個空格才行。
(base) ? ~ [ 1 -eq 2 ]
(base) ? ~ echo $?
1
字符串比較
接著來看下shell中如何對字符串進(jìn)行比較,
字符串的比較是可以用> < 這種符號的,數(shù)字則不同。
數(shù)字比較
文件相關(guān)的判斷
除了數(shù)字和字符串的比較,我們平時還經(jīng)常會用到對文件的判斷,比如判斷文件是否存在等,如下是對文件相關(guān)操作的判斷。
if 語句
了解了判斷語句就可以看看跳轉(zhuǎn)指令的語法,首先我們看下if語句在shell中是如何寫的。
if expression; then
command
fi
通過if then fi三個關(guān)鍵字組成了最簡單的if語句,其中expression則是前面講到的判斷語句的表達(dá)式,如下,執(zhí)行這個腳本將會輸出,123 和456兩行數(shù)據(jù)。
!/bin/sh
num=1
if test $num -eq 1 ;then
echo 123
fi
if [ $num -eq 1 ] ;then
echo 456
fi
if else 語句也類似,它的語法結(jié)構(gòu)如下,
if expression; then
command
else
command
fi
for while循環(huán)語句
for 語法結(jié)構(gòu)
for VARIABLE in (list)
do
command
done
for語句可以遍歷一個列表然后對其中每一個元素進(jìn)行遍歷。上述語法中,list既可以是變量也可以是固定數(shù)組表達(dá)式,也可以命令輸出。
案例1,數(shù)組變量 循環(huán)
!/bin/sh
arr="1 2 3 4"
for num in ${arr}
do
echo $num
done
案例2,固定數(shù)組表達(dá)式循環(huán)
!/bin/sh
for num in 1 2 3 4
do
echo $num
done
案例3,命令輸出結(jié)果 循環(huán)
!/bin/sh
for num in $(ls)
do
echo $num
done
while 語法結(jié)構(gòu)
while expression
do
command
done
表達(dá)式的語法也和之前if 語句那里講的語法結(jié)構(gòu)類似,這里就不再展開了。
總結(jié)
這一節(jié)簡單的介紹了shell最基本的語法,掌握了這些,便可以簡單的寫一些最基本的腳本了。函數(shù)的聲明和調(diào)用可以等用到的時候再學(xué),后續(xù)也會介紹一些shell腳本的實際案例來鞏固下這部分的內(nèi)容。
總結(jié)
以上是生活随笔為你收集整理的shell 语法介绍的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: throw与throws的区别
- 下一篇: 珠宝加工厂的工作环境以及工资待遇怎么样?