一循衰、變量和備注
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ù)定義變量
數(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 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 pw"`
這里要了解位置參數(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)算符
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)行