shell编程--基本格式,基本语法,运算符,expr,(()),$[]
02/shell編程
Shell是用戶(hù)與內(nèi)核進(jìn)行交互操作的一種接口,目前最流行的Shell稱(chēng)為bash Shell
Shell也是一門(mén)編程語(yǔ)言<解釋型的編程語(yǔ)言>,即shell腳本<就是在用linux的shell命令編程>
一個(gè)系統(tǒng)可以存在多個(gè)shell,可以通過(guò)cat /etc/shells命令查看系統(tǒng)中安裝的shell,不同的shell可能支持的命令語(yǔ)法是不相同的
2.1 基本格式
代碼寫(xiě)在普通文本文件中,通常以 .sh為后綴名
vi hello.sh
#!/bin/bash??? ## 表示用哪一種shell解析器來(lái)解析執(zhí)行我們的這個(gè)腳本程序 echo "hello world"?? ##? 注釋也可以寫(xiě)在這里 ## 這是一行注釋 |
?
執(zhí)行腳本
sh hello.sh
?
或給腳本添加x權(quán)限,直接執(zhí)行
chmod 755 hello.sh
./hello.sh
?
?
?
2.2 基本語(yǔ)法
2.2.1 系統(tǒng)變量
Linux Shell中的變量分為“系統(tǒng)變量”和“用戶(hù)自定義變量”
可以通過(guò)set命令查看系統(tǒng)變量
系統(tǒng)變量:$HOME、$PWD、$SHELL、$USER等等
?
2.2.2 自定義變量
1、語(yǔ)法
變量=值 (例如STR=abc)
等號(hào)兩側(cè)不能有空格
變量名稱(chēng)一般習(xí)慣為大寫(xiě)
使用變量: $arg
雙引號(hào)和單引號(hào)有區(qū)別,
???? 雙引號(hào)僅將空格脫意,
???? 單引號(hào)會(huì)將變量引用比如$param脫意
?
2、示例
STR="hello world"
A=9
echo $A
echo $STR
如果想打印 hello worlds isgreater? 怎么辦?
echo $STRs is greate 行嗎?
不行,正確寫(xiě)法是:
echo ${STR}s is greate
?
unset A 撤銷(xiāo)變量 A
readonly B=2 聲明靜態(tài)的變量 B=2,不能 unset
?
export? A?? #可把變量提升為當(dāng)前shell進(jìn)程中的全局環(huán)境變量,可供其他子shell程序使用
注意理解export:
[root@shizhan01 scripts]# vi a.sh #!/bin/bash a="a in a.sh" echo $a /root/scripts/b.sh |
?
[root@shizhan01 scripts]# vi b.sh #!/bin/bash b="b in b.sh" echo $b echo $a |
?
然后執(zhí)行? ./a.sh ,會(huì)發(fā)現(xiàn) b腳本中并沒(méi)有把a(bǔ)腳本中定義的a變量打印出來(lái)
?
如果要在b中打印出a腳本的變量a,需要在a腳本中把變量a做export定義
此時(shí),a變量就成了a.sh腳本所在bash進(jìn)程的全局變量,該進(jìn)程的所有子進(jìn)程都能訪問(wèn)到變量a
?
?
另一種方式:
如果在a.sh腳本中用如下方式調(diào)用b.sh
.? ./b.sh??? ## 注意:重點(diǎn)關(guān)注最前面那個(gè) “.”號(hào) |
或者
source ./b.sh?? ## |
則,b.sh就在a.sh所在的bash進(jìn)程空間中運(yùn)行
?
?
總結(jié):
1、a.sh中直接調(diào)用b.sh,會(huì)讓b.sh在a所在的bash進(jìn)程的“子進(jìn)程”空間中執(zhí)行
2、而子進(jìn)程空間只能訪問(wèn)父進(jìn)程中用export定義的變量
3、一個(gè)shell進(jìn)程無(wú)法將自己定義的變量提升到父進(jìn)程空間中去
4、“.”號(hào)執(zhí)行腳本時(shí),會(huì)讓腳本在調(diào)用者所在的shell進(jìn)程空間中執(zhí)行
?
?
3、反引號(hào)賦值
A=`ls -la`??? ## 反引號(hào),運(yùn)行里面的命令,并把結(jié)果返回給變量A
A=$(ls -la)?? ## 等價(jià)于反引號(hào)
?
?
4、特殊變量
$??表示上一個(gè)命令退出的狀態(tài)碼
$$?表示當(dāng)前進(jìn)程編號(hào)
$0 表示當(dāng)前腳本名稱(chēng)
$n 表示n位置的輸入?yún)?shù)(n代表數(shù)字,n>=1)
$# ? 表示參數(shù)的個(gè)數(shù),常用于循環(huán)
$*和$@ 都表示參數(shù)列表?
?
?
注:$*與$@區(qū)別
$* 和 $@ 都表示傳遞給函數(shù)或腳本的所有參數(shù)
ü? 不被雙引號(hào)" "包含時(shí)——
$* 和 $@ 都以$1? $2? … $n 的形式組成參數(shù)列表
ü? 當(dāng)它們被雙引號(hào)" "包含時(shí)——
"$*" 會(huì)將所有的參數(shù)作為一個(gè)整體,以"$1 $2 … $n"的形式組成一個(gè)整串;
"$@" 會(huì)將各個(gè)參數(shù)分開(kāi),以"$1" "$2" … "$n" 的形式組成一個(gè)參數(shù)列表
?
?
2.3 運(yùn)算符
2.3.1 算數(shù)運(yùn)算
1、用expr
格式 expr m + n 或$((m+n)) 注意expr運(yùn)算符間要有空格
例如計(jì)算(2+3 )×4 的值
1 .分步計(jì)算
???????? S=`expr 2 + 3`
???????? expr $S \* 4?????? ##??*號(hào)需要轉(zhuǎn)義
2.一步完成計(jì)算
???????? expr`expr 2 + 3 ` \* 4
???????? echo`expr \`expr 2 + 3\` \* 4`
?
2、用(())
((1+2))
(((2+3)*4))
count=1
((count++))
echo $count
?
但是要想取到運(yùn)算結(jié)果,需要用$引用
a=$((1+2))
?
3、用$[]
a=$[1+2]
echo $a
?
?
總結(jié)
以上是生活随笔為你收集整理的shell编程--基本格式,基本语法,运算符,expr,(()),$[]的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: i类卡和ii类卡区别
- 下一篇: shell编程--流程控制for,do-