shell編程編程1

一循衰、變量和備注

1.1.備注:和普通的編程語(yǔ)言一樣厢漩,用井號(hào)后面內(nèi)容(#)來(lái)表示備注
1.2.變量:變量分為系統(tǒng)變量和用戶變量,在shell中經(jīng)常用到系統(tǒng)變量拗踢,通常使用 美元符號(hào) 變量名稱 來(lái)引用變量

變量名和等號(hào)之間不能有空格脚牍。同時(shí),變量名的命名須遵循如下規(guī)則:
首個(gè)字符必須為字母(a-z巢墅,A-Z)诸狭。
中間不能有空格,可以使用下劃線(_)砂缩。
不能使用標(biāo)點(diǎn)符號(hào)作谚。
不能使用 bash 里的關(guān)鍵字(可用 help 命令查看保留關(guān)鍵字)
例如:

echo $PATH

除了直接賦值,還可以用語(yǔ)句給變量賦值

for file in `ls /etc`

注意:定義變量時(shí)等號(hào)前后不要有空格庵芭,$后面跟著變量名來(lái)引用
使用 readonly 命令可以將變量定義為只讀變量妹懒,只讀變量的值不能被改變

myUrl="http://www.baidu.com"
readonly myUrl
myUrl="http://www.baidu.com"

=左右不要有空格
如果內(nèi)容有空格,需要使用單引號(hào)或者雙引號(hào)
雙引號(hào)支持轉(zhuǎn)移 $ 開頭的遍歷會(huì)被自動(dòng)替換

1.3双吆、變量的使用
echo $a
echo $眨唬
echo "$a"
使用$var或者${var}來(lái)訪問(wèn)遍歷 后者更為嚴(yán)謹(jǐn)
遍歷不需要定義也可以使用会前,引用未定義的遍歷,默認(rèn)為空值

預(yù)定義變量


預(yù)定義變量

數(shù)組變量
使用()來(lái)定義數(shù)組變量匾竿,中間使用空格隔開
例如

array=(1 2 3 4)
array=('ls')

 echo ${array[2]};
echo ${array[*]}
echo ${#array[*]}
···

####二瓦宜、獲取用戶輸入
獲取用戶輸入就需要用到read命令

echo "please input your name: "
read name
echo "You nam is $name"`

獲取用戶輸入的多個(gè)輸入

echo "please input your name: "
read name1 name2 name3
echo "You nam is name1,name2, $name3"`

按照空格取值,不夠的輸入空岭妖,多的在最后一個(gè)打印出來(lái)
想要換行 就是在read后面加入-p

read -p "please input your username: " name
read -sp "please input your password: " pw

這里的-s在密碼輸入的時(shí)候用到临庇,輸入過(guò)程看不到輸入的內(nèi)容

echo "Your nam is name"` echo "Your password ispw"`

這里要了解位置參數(shù)
從命令行傳遞到腳本的參數(shù):```$0,$1昵慌,$2假夺,$3...```
```$0 就是腳本文件自身的名字,$1 是第一個(gè)參數(shù)斋攀,$2 是第二個(gè)參數(shù)已卷,$3 是第三個(gè)參數(shù),然后是第四個(gè)淳蔼。$9 之后的位置參數(shù)就必須用大括號(hào)括起來(lái)了侧蘸,比如,${10}鹉梨,${11}讳癌,${12}。
$# : 傳遞到腳本的參數(shù)個(gè)數(shù)
$* : 以一個(gè)單字符串顯示所有向腳本傳遞的參數(shù)俯画。與位置變量不同,此選項(xiàng)參數(shù)可超過(guò) 9 個(gè)
$$ : 腳本運(yùn)行的當(dāng)前進(jìn)程 ID 號(hào)
$! : 后臺(tái)運(yùn)行的最后一個(gè)進(jìn)程的進(jìn)程 ID 號(hào)
$@ : 與 $* 相同,但是使用時(shí)加引號(hào),并在引號(hào)中返回每個(gè)參數(shù)
$: 顯示 shell 使用的當(dāng)前選項(xiàng),與 set 命令功能相同
$? : 顯示最后命令的退出狀態(tài)析桥。 0 表示沒(méi)有錯(cuò)誤,其他任何值表明有錯(cuò)誤。

三艰垂、特殊符號(hào)

3.1.#注釋

echo The # 這里開始一個(gè)注釋
3.2.;(分號(hào))

使用分號(hào) ; 可以在同一行上寫兩個(gè)或兩個(gè)以上的命令泡仗。

echo hello; echo there
3.3..(點(diǎn)號(hào))
source filename.sh 
. filename.sh
3.4.引號(hào)

3.4.1單引號(hào)
阻止 STRING 中所有特殊字符的解釋,這是一種比使用"更強(qiáng)烈的形式
3.4.2 雙引號(hào)
阻止(解釋)STRING 中大部分特殊的字符
3.5.斜線和反斜線
3.5.1斜線
文件名路徑分隔符
例如D:\Program Files\MuMu

3.5.2反斜線

D:\Program Files\MuMu
\n 表示新的一行
\r 表示回車
\t 表示水平制表符
\v 表示垂直制表符
\b 表示后退符
\a 表示"alert"(蜂鳴或者閃爍)
\0xx 轉(zhuǎn)換為八進(jìn)制的 ASCII 碼, 等價(jià)于 0xx
" 表示引號(hào)字面的意思

3.6.`(反引號(hào))
cp `mkdir back` test.sh back
#先創(chuàng)建了 back 目錄猜憎,然后復(fù)制 test.sh 到 back 目錄娩怎。
3.7.:冒號(hào)

3.71.空命令
什么作用都沒(méi)有
3.7.2變量擴(kuò)展/子串替換
與 > 重定向操作符結(jié)合使用時(shí),會(huì)把一個(gè)文件清空胰柑,不會(huì)修改這個(gè)文件的權(quán)限截亦。如果之個(gè)文件并不存在,那么就創(chuàng)建這個(gè)文件

: > test.sh   # 文件“test.sh”現(xiàn)在被清空了
# 與 cat /dev/null > test.sh 的作用相同
# 然而,這并不會(huì)產(chǎn)生一個(gè)新的進(jìn)程, 因?yàn)椤?”是一個(gè)內(nèi)建命令
3.8.?問(wèn)號(hào)

測(cè)試操作符

 #!/bin/bash
 a=10
 (( t=a<50?8:9 ))
 echo $t
3.9.$一直在用

3.10.()小括號(hào)
命令組:在括號(hào)中的命令列表柬讨,將會(huì)作為一個(gè)子 shell 來(lái)運(yùn)行

#!/bin/bash
a=123
( a=321; )
echo "$a" #括號(hào)將判斷為局部變量,所以a的值為123而不是321

初始化數(shù)組

arr=(1 4 5 7 9 21)
echo ${arr[3]}
3.11崩瓤、{} 大括號(hào)

文件名擴(kuò)展

if [ ! -w 't.txt' ];
then
    touch t.txt
fi
echo 'test text' >> t.txt
cp t.{txt,back}#在大括號(hào)中不允許有空白,除非這個(gè)空白被引用或轉(zhuǎn)義

代碼塊

3.12.[]中括號(hào)

3.12.1踩官、條件測(cè)試

a=5
if [ $a -lt 10 ]
then
    echo "a: $a"
else
    echo 'a>=10'
fi

3.12.2却桶、數(shù)組元素
在一個(gè) array 結(jié)構(gòu)的上下文中,中括號(hào)用來(lái)引用數(shù)組中每個(gè)元素的編號(hào)

arr=(11 21 31)
arr[0]=10
echo ${arr[0]}
3.13、< 和 > 尖括號(hào)

3.13.1颖系、重定向
test.sh > filename:重定向 test.sh 的輸出到文件 filename 中嗅剖。如果 filename 存在的話,那么將會(huì)被覆蓋嘁扼。
test.sh &> filename:重定向 test.sh 的 stdout(標(biāo)準(zhǔn)輸出)和 stderr(標(biāo)準(zhǔn)錯(cuò)誤)到 filename 中信粮。
test.sh >&2:重定向 test.sh 的 stdout 到 stderr 中。
test.sh >> filename:把 test.sh 的輸出追加到文件 filename 中趁啸。如果 filename 不存在的話强缘,將會(huì)被創(chuàng)建。

3.14.|(豎線)

分析前邊命令的輸出不傅,并將輸出作為后邊命令的輸入欺旧,產(chǎn)生命令鏈。

chmod 755 test.sh #給文件test.sh賦權(quán)限
ls -l | ./test.sh #輸送 ls -l 的輸出到一個(gè)腳本中
3.15.-(破折號(hào))

3.15.1選項(xiàng)蛤签,前綴
在所有的命令內(nèi)如果想使用選項(xiàng)參數(shù)的話,前邊都要加上“-”
15.2用于重定向 stdin 或 stdout

#用于備份最后 24 小時(shí)當(dāng)前目錄下所有修改的文件
BACKUPFILE=backup-$(date +%m-%d-%Y)
# 在備份文件中嵌入時(shí)間.
archive=${1:-$BACKUPFILE}
#  如果在命令行中沒(méi)有指定備份文件的文件名,
#  那么將默認(rèn)使用"backup-MM-DD-YYYY.tar.gz".
tar cvf - `find . -mtime -1 -type f -print` > $archive.tar
gzip $archive.tar
echo "Directory $PWD backed up in archive file \"$archive.tar.gz\"."
exit 0

四、基本的預(yù)算符號(hào)

4.1.算數(shù)運(yùn)算符

例如:

a=10
b=20
val=`expr $a + $b`
echo "a + b : $val"

val=`expr $a - $b`
echo "a - b : $val"

val=`expr $a \* $b`
echo "a * b : $val"

val=`expr $b / $a`
echo "b / a : $val"

val=`expr $b % $a`
echo "b % a : $val"

if [ $a == $b ]
then
   echo "a == b"
fi
if [ $a != $b ]
then
   echo "a != b"
fi
原生 bash 不支持簡(jiǎn)單的數(shù)學(xué)運(yùn)算栅哀,但是可以通過(guò)其他命令來(lái)實(shí)現(xiàn)震肮,例如 awk 和 expr,expr 最常用留拾。
expr 是一款表達(dá)式計(jì)算工具戳晌,使用它能完成表達(dá)式的求值操作。
注意使用的反引號(hào)(esc 鍵下邊)
表達(dá)式和運(yùn)算符之間要有空格 $a + $b 寫成 $a+$b 不行
條件表達(dá)式要放在方括號(hào)之間痴柔,并且要有空格 [ $a == $b ] 寫成 [$a==$b] 不行
可以用expr判斷一個(gè)字符串是否是整數(shù)
awk可以實(shí)現(xiàn)整數(shù)和小數(shù)計(jì)算:
awk "2.1 2.5"|awk '{print $1-$2}'
格式化顯示可以用:
awk "3.134 2.532" |awk '{printf("%.2\n", $1-$2)}'
乘號(hào)(*)前邊必須加反斜杠(\)才能實(shí)現(xiàn)乘法運(yùn)算

4.2.關(guān)系運(yùn)算符

-eq:檢測(cè)左邊的數(shù)是否相等沦偎,如果相等,返回true
-ne:檢測(cè)左邊的數(shù)是否不相等咳蔚,如果不相等豪嚎,返回true
-gt:檢測(cè)左邊的數(shù)是否大于右邊的,如果是谈火,返回true
-lt:檢測(cè)左邊的數(shù)是否小于右邊的侈询,如果是,返回true
-ge:檢測(cè)左邊的數(shù)是否大于等于右邊的糯耍,如果是扔字,返回true
-le:檢測(cè)左邊的數(shù)是否小于等于右邊的,如果是温技,返回true
例如

a=5
b=10

if [ $a -eq $b ]
then
   echo "$a -eq $b : a == b"
else
   echo "$a -eq $b: a != b"
fi
4.3.邏輯運(yùn)算符

&&: 邏輯的AND
|| :邏輯的OR

a=5
b=10
if [[ $a -lt 100 && $b -gt 100 ]]
then
   echo "return true"
else
   echo "return false"
fi

if [[ $a -lt 100 || $b -gt 100 ]]
then
   echo "return true"
else
   echo "return false"
fi
4.4.字符串運(yùn)算符
a="abc"
b="efg"
if [ $a = $b ]
then
   echo "$a = $b : a == b"
else
   echo "$a = $b: a != b"
fi
if [ -n $a ]
then
   echo "-n $a : The string length is not 0"
else
   echo "-n $a : The string length is  0"
fi
if [ $a ]
then
   echo "$a : The string is not empty"
else
   echo "$a : The string is empty"
fi
4.5字符串操作

取值

掐頭趣味與內(nèi)容替換

4.6.文件測(cè)試運(yùn)算符
image.png
file="/home/shiyanlou/test.sh"
if [ -r $file ]
then
   echo "The file is readable"
else
   echo "The file is not readable"
fi
if [ -e $file ]
then
   echo "File exists"
else
   echo "File not exists"
fi
4.7.浮點(diǎn)型計(jì)算

bash默認(rèn)是不支持浮點(diǎn)型數(shù)字計(jì)算革为,需要安裝bc軟件,然后通過(guò)bc才能計(jì)算浮點(diǎn)型舵鳞。
安裝bc

sudo apt-get update
sudo apt-get install bc

#加法運(yùn)算
n1=3.45
n2=0.78
echo "3.45+0.78" | bc
#乘法運(yùn)算
r=3.4
pi=3.14159
g=$(echo "scale=4; 3.14 * 2 * $r" | bc)
a=$(echo "scale=4; 3.14 * $r * $r" | bc)
echo "g=$g"
echo "a=$a"
注意:運(yùn)行Bash的腳本的方式有:

sh filename.sh
bash filename.sh

../filename.sh

source filename.sh
. filename.sh

chomd u+rx filename.sh 賦權(quán)限并運(yùn)行

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末震檩,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子系任,更是在濱河造成了極大的恐慌恳蹲,老刑警劉巖虐块,帶你破解...
    沈念sama閱讀 222,464評(píng)論 6 517
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異嘉蕾,居然都是意外死亡贺奠,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,033評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門错忱,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)儡率,“玉大人,你說(shuō)我怎么就攤上這事以清《眨” “怎么了?”我有些...
    開封第一講書人閱讀 169,078評(píng)論 0 362
  • 文/不壞的土叔 我叫張陵掷倔,是天一觀的道長(zhǎng)眉孩。 經(jīng)常有香客問(wèn)我,道長(zhǎng)勒葱,這世上最難降的妖魔是什么浪汪? 我笑而不...
    開封第一講書人閱讀 59,979評(píng)論 1 299
  • 正文 為了忘掉前任,我火速辦了婚禮凛虽,結(jié)果婚禮上死遭,老公的妹妹穿的比我還像新娘。我一直安慰自己凯旋,他們只是感情好呀潭,可當(dāng)我...
    茶點(diǎn)故事閱讀 69,001評(píng)論 6 398
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著至非,像睡著了一般钠署。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上荒椭,一...
    開封第一講書人閱讀 52,584評(píng)論 1 312
  • 那天踏幻,我揣著相機(jī)與錄音,去河邊找鬼戳杀。 笑死该面,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的信卡。 我是一名探鬼主播隔缀,決...
    沈念sama閱讀 41,085評(píng)論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼傍菇!你這毒婦竟也來(lái)了猾瘸?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 40,023評(píng)論 0 277
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎牵触,沒(méi)想到半個(gè)月后淮悼,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,555評(píng)論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡揽思,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,626評(píng)論 3 342
  • 正文 我和宋清朗相戀三年袜腥,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片钉汗。...
    茶點(diǎn)故事閱讀 40,769評(píng)論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡羹令,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出损痰,到底是詐尸還是另有隱情福侈,我是刑警寧澤,帶...
    沈念sama閱讀 36,439評(píng)論 5 351
  • 正文 年R本政府宣布卢未,位于F島的核電站肪凛,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏辽社。R本人自食惡果不足惜显拜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,115評(píng)論 3 335
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望爹袁。 院中可真熱鬧,春花似錦矮固、人聲如沸失息。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,601評(píng)論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)盹兢。三九已至,卻和暖如春守伸,著一層夾襖步出監(jiān)牢的瞬間绎秒,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,702評(píng)論 1 274
  • 我被黑心中介騙來(lái)泰國(guó)打工尼摹, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留见芹,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 49,191評(píng)論 3 378
  • 正文 我出身青樓蠢涝,卻偏偏與公主長(zhǎng)得像玄呛,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子和二,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,781評(píng)論 2 361