1.shell簡介
1.1 shell
Shell 是1個用C語言編寫的程序,它是用戶使用Linux的橋梁。Shell既是1種命令語言,又是1種程序設(shè)計語言。
Shell 是指1種利用程序,這個利用程序提供了1個界面,用戶通過這個界面訪問操作系統(tǒng)內(nèi)核的服務(wù)。
1.2 shell腳本
Shell 腳本(shell script),是1種為shell編寫的腳本程序。
1.3shell類型
bash
csh
dash
ksh
....
2.shell入門
2.1編寫第1個shell腳本
test.sh:
#!/bin/bash
echo "Hello World !"
注:
2.2履行腳本
1.
#chmod +x test.sh
#./test.sh
2.
/bin/bash test.sh
3.shell 變量
3.1變量定義
var=val
var="val"
var='val'
循環(huán)賦值:
for file in 'ls /etc'
規(guī)則:
1.變量定義時,不使用$符號;
2.變量名與等號之間不能有空格;
3.首個字符必須為字母(a-z,A-Z);
4.中間不能有空格,可使用下劃線(_);
5.不能使用標(biāo)點符號;
6.不能使用bash里的關(guān)鍵字(可用help命令查看保存關(guān)鍵字)。
3.2使用變量
var=val
echo $var
echo $(var)
3.3只讀變量
通過readonly關(guān)鍵字聲明:
var=val
readonly var
3.4刪除變量
通過unset關(guān)鍵字聲明:
var=val
unset var
3.5變量類型
環(huán)境變量: 所有的程序,包括shell啟動的程序,都能訪問環(huán)境變量,有些程序需要環(huán)境變量來保證其正常運行。必要的時候shell腳本也能夠定義環(huán)境變量。
局部變量:局部變量在腳本或命令中定義,僅在當(dāng)前shell實例中有效,其他shell啟動的程序不能訪問局部變量。
shell變量:shell變量是由shell程序設(shè)置的特殊變量。shell變量中有1部份是環(huán)境變量,有1部份是局部變量,這些變量保證了shell的正常運行
3.6shell字符串
1.字符串聲明:
單引號:
str='string'
單引號里的任何字符都會原樣輸出,單引號字符串中的變量是無效的;
單引號字串中不能出現(xiàn)單引號(對單引號使用轉(zhuǎn)義符后也不行)。
雙引號:
str="string"
雙引號里可以有變量;
雙引號里可以出現(xiàn)轉(zhuǎn)義字符
無引:
str=string
2.拼接字符串:
your_name="qinjx"
greeting="hello, "$your_name" !"
greeting_1="hello, ${your_name} !"
echo $greeting $greeting_1
3.獲得字符串長度:
string="abcd"
echo ${#string}
4.提取子字符串:
string="runoob is a great site"
echo ${string:1:4}
5.查找子字符串:
string="runoob is a great company"
echo `expr index "$string" is`
注意: 以上腳本中 "`" 是反引號,而不是單引號 "'"。
3.7shell數(shù)組
bash支持1維數(shù)組(不支持多維數(shù)組),并且沒有限定數(shù)組的大小。
1.定義數(shù)組
array=(val0 val1 val2 ...)
array_name=(
value0
value1
value2
value3
)
array_name[0]=value0
array_name[1]=value1
array_name[n]=valuen
2.讀取數(shù)組
${array[index]}
通過"@"取得數(shù)組中的所有元素:
echo ${array[@]}
3.獲得數(shù)組長度
獲得數(shù)組元素個數(shù):
length=${
length=${
取得單個數(shù)組元素的長度:
length=${
3.8shell注釋
1.以"#"開頭行表示shell注釋行
2.shell無多行注釋操作,只能每行行頭添加"#"
4.Shell 傳遞參數(shù)
4.1傳遞參數(shù)使用
我們可以在履行 Shell 腳本時,向腳本傳遞參數(shù),腳本內(nèi)獲得參數(shù)的格式為:$n。n 代表1個數(shù)字,1 為履行腳本的第1個參數(shù),2 為履行腳本的第2個參數(shù),以此類推……
例:
test.sh:
#!/bin/bash
echo "Shell 傳遞參數(shù)實例!";
echo "履行的文件名:$0";
echo "第1個參數(shù)為:$1";
echo "第2個參數(shù)為:$2";
echo "第3個參數(shù)為:$3";
效果:
$ ./test.sh 1 2 3
Shell 傳遞參數(shù)實例!
履行的文件名:test.sh
第1個參數(shù)為:1
第2個參數(shù)為:2
第3個參數(shù)為:3
4.2特殊參數(shù)
$# 傳遞到腳本的參數(shù)個數(shù)
$* 以1個單字符串顯示所有向腳本傳遞的參數(shù)。
如"$*"用「"」括起來的情況、以"$1 $2 … $n"的情勢輸出所有參數(shù)。
$$ 腳本運行確當(dāng)前進(jìn)程ID號
$! 后臺運行的最后1個進(jìn)程的ID號
$@ 與$*相同,但是使用時加引號,并在引號中返回每一個參數(shù)。
如"$@"用「"」括起來的情況、以"$1" "$2" … "$n" 的情勢輸出所有參數(shù)。
$- 顯示Shell使用確當(dāng)前選項,與set命令功能相同。
$? 顯示最后命令的退出狀態(tài)。0表示沒有毛病,其他任何值表明有毛病。
注:
$* 與 $@ 區(qū)分:
相同點:都是援用所有參數(shù)。
不同點:只有在雙引號中體現(xiàn)出來。假定在腳本運行時寫了3個參數(shù) 1、2、3,,則 " * " 等價于 "1 2 3"(傳遞了1個參數(shù)),而 "@" 等價于 "1" "2" "3"(傳遞了3個參數(shù))。
例:
test.sh:
#!/bin/bash
echo "-- \$* 演示 ---"
for i in "$*"; do
echo $i
done
echo "-- \$@ 演示 ---"
for i in "$@"; do
echo $i
done
效果:
$ ./test.sh 1 2 3
-- $* 演示 ---
1 2 3
-- $@ 演示 ---
1
2
3
5.shell基本運算符
原生bash不支持簡單的數(shù)學(xué)運算,但是可以通過其他命令來實現(xiàn),例如 awk 和 expr,expr 最經(jīng)常使用。
expr 是1款表達(dá)式計算工具,使用它能完成表達(dá)式的求值操作。
注意
1.使用的是反引號 ` 而不是單引號 ';
2.表達(dá)式和運算符之間要有空格,例如 2+2 是不對的,必須寫成 2 + 2,這與我們熟習(xí)的大多數(shù)編程語言不1樣。
例:
test.sh:
#!/bin/bash
val=`expr 2 + 2`
echo "兩數(shù)之和為 : $val"
5.1 算數(shù)運算符
運算符 |
說明 |
舉例 |
+ |
加法 |
`expr $a + $b` 結(jié)果為 30。 |
- |
減法 |
`expr $a - $b` 結(jié)果為 10。 |
* |
乘法 |
`expr $a * $b` 結(jié)果為 200。 |
/ |
除法 |
`expr $b / $a` 結(jié)果為 2。 |
% |
取余 |
`expr $b % $a` 結(jié)果為 0。 |
= |
賦值 |
a=$b 將把變量 b 的值賦給 a。 |
== |
相等。用于比較兩個數(shù)字,相同則返回 true。 |
[ $a == $b ] 返回 false。 |
!= |
不相等。用于比較兩個數(shù)字,不相同則返回 true。 |
[ $a != $b ] 返回 true。 |
5.2 關(guān)系運算符
關(guān)系運算符只支持?jǐn)?shù)字,不支持字符串,除非字符串的值是數(shù)字。
運算符 |
說明 |
返回值 |
-eq |
檢測兩個數(shù)是不是相等,相等返回 true。 |
[ $a -eq $b ] 返回 false。 |
-ne |
檢測兩個數(shù)是不是相等,不相等返回 true。 |
[ $a -ne $b ] 返回 true。 |
-gt |
檢測左側(cè)的數(shù)是不是大于右側(cè)的,如果是,則返回 true。 |
[ $a -gt $b ] 返回 false。 |
-lt |
檢測左側(cè)的數(shù)是不是小于右側(cè)的,如果是,則返回 true。 |
[ $a -lt $b ] 返回 true。 |
-ge |
檢測左側(cè)的數(shù)是不是大等于右側(cè)的,如果是,則返回 true。 |
[$a -ge $b ] 返回 false。 |
-le |
檢測左側(cè)的數(shù)是不是小于等于右側(cè)的,如果是,則返回 true。 |
[ $a -le $b ] 返回 true。 |
5.3 布爾運算符
運算符 |
說明 |
舉例 |
! |
非運算,表達(dá)式為 true 則返回 false,否則返回 true。 |
[ ! false ] 返回 true。 |
-o |
或運算,有1個表達(dá)式為 true 則返回 true。 |
[ $a -lt 20 -o $b -gt 100 ] 返回 true。 |
-a |
與運算,兩個表達(dá)式都為 true 才返回 true。 |
[ $a -lt 20 -a $b -gt 100 ] 返回 false。 |
5.4 邏輯運算符
運算符 |
說明 |
舉例 |
&& |
邏輯的 AND |
[[ $a -lt 100 && $b -gt 100 ]] 返回 false |
|| |
邏輯的 OR |
[[ $a -lt 100 || $b -gt 100 ]] 返回 true |
5.5 字符串運算符
運算符 |
說明 |
舉例 |
= |
檢測兩個字符串是不是相等,相等返回 true。 |
[ $a = $b ] 返回 false。 |
!= |
檢測兩個字符串是不是相等,不相等返回 true。 |
[ $a != $b ] 返回 true。 |
-z |
檢測字符串長度是不是為0,為0返回 true。 |
[ -z $a ] 返回 false。 |
-n |
檢測字符串長度是不是為0,不為0返回 true。 |
[ -n $a ] 返回 true。 |
str |
檢測字符串是不是為空,不為空返回 true。 |
[ $a ] 返回 true。 |
5.6 文件測試運算符
運算符 |
說明 |
舉例 |
-b file |
檢測文件是不是是塊裝備文件,如果是,則返回 true。 |
[ -b $file ] 返回 false。 |
-c file |
檢測文件是不是是字符裝備文件,如果是,則返回 true。 |
[ -c $file ] 返回 false。 |
-d file |
檢測文件是不是是目錄,如果是,則返回 true。 |
[ -d $file ] 返回 false。 |
-f file |
檢測文件是不是是普通文件(既不是目錄,也不是裝備文件),如果是,則返回 true。 |
[ -f $file ] 返回 true。 |
-g file |
檢測文件是不是設(shè)置了 SGID 位,如果是,則返回 true。 |
[ -g $file ] 返回 false。 |
-k file |
檢測文件是不是設(shè)置了粘著位(Sticky Bit),如果是,則返回 true。 |
[ -k $file ] 返回 false。 |
-p file |
檢測文件是不是是具名管道,如果是,則返回 true。 |
[ -p $file ] 返回 false。 |
-u file |
檢測文件是不是設(shè)置了 SUID 位,如果是,則返回 true。 |
[ -u $file ] 返回 false。 |
-r file |
檢測文件是不是可讀,如果是,則返回 true。 |
[ -r $file ] 返回 true。 |
-w file |
檢測文件是不是可寫,如果是,則返回 true。 |
[ -w $file ] 返回 true。 |
-x file |
檢測文件是不是可履行,如果是,則返回 true。 |
[ -x $file ] 返回 true。 |
-s file |
檢測文件是不是為空(文件大小是不是大于0),不為空返回 true。 |
[ -s $file ] 返回 true。 |
-e file |
檢測文件(包括目錄)是不是存在,如果是,則返回 true。 |
[ -e $file ] 返回 true。 |
6.shell echo命令
6.1 顯示普通字符串
echo "It is a test"
echo It is a test
6.2 顯示轉(zhuǎn)義字符
echo "\"It is a test\""
6.3 顯示變量
#!/bin/sh
read name
echo "$name It is a test"
6.4 顯示換行
echo -e "OK! \n"
echo "It it a test"
6.5 顯示不換行
#!/bin/sh
echo -e "OK! \c"
echo "It is a test"
6.6 顯示結(jié)果定向至文件
echo "It is a test" > myfile
6.7 原樣輸出字符串,不進(jìn)行轉(zhuǎn)義或取變量(用單引號)
echo '$name\"'
6.8 顯示命令履行結(jié)果
echo `date`
注意是反引號,適用于履行相干命令。
7. shell printf命令
1.printf語法
printf format-string [arguments ...]
例:
test.sh:
#!/bin/bash
printf "%⑴0s %⑻s %⑷s\n" 姓名 性別 體重kg
printf "%⑴0s %⑻s %⑷.2f\n" 郭靖 男 66.1234
printf "%⑴0s %⑻s %⑷.2f\n" 楊過 男 48.6543
printf "%⑴0s %⑻s %⑷.2f\n" 郭芙 女 47.9876
格式符使用同C語言的printf函數(shù)。
7. shell test命令
Shell中的 test 命令用于檢查某個條件是不是成立,它可以進(jìn)行數(shù)值、字符和文件3個方面的測試。
7.1 數(shù)值測試
參數(shù) |
說明 |
-eq |
等于則為真 |
-ne |
不等于則為真 |
-gt |
大于則為真 |
-ge |
大于等于則為真 |
-lt |
小于則為真 |
-le |
小于等于則為真 |
7.2 字符串測試
參數(shù) |
說明 |
= |
等于則為真 |
!= |
不相等則為真 |
-z 字符串 |
字符串的長度為零則為真 |
-n 字符串 |
字符串的長度不為零則為真 |
7.3 文件測試
參數(shù) |
說明 |
-e 文件名 |
如果文件存在則為真 |
-r 文件名 |
如果文件存在且可讀則為真 |
-w 文件名 |
如果文件存在且可寫則為真 |
-x 文件名 |
如果文件存在且可履行則為真 |
-s 文件名 |
如果文件存在且最少有1個字符則為真 |
-d 文件名 |
如果文件存在且為目錄則為真 |
-f 文件名 |
如果文件存在且為普通文件則為真 |
-c 文件名 |
如果文件存在且為字符型特殊文件則為真 |
-b 文件名 |
如果文件存在且為塊特殊文件則為真 |
另外,Shell還提供了與( -a )、或( -o )、非( ! )3個邏輯操作符用于將測試條件連接起來,其優(yōu)先級為:"!"最高,"-a"次之,"-o"最低。例如:
#!/bin/bash
cd /bin
if test -e ./notFile -o -e ./bash
then
echo '有1個文件存在!'
else
echo '兩個文件都不存在'
fi
8.流程控制
8.1if else
1.
if condition
then
command1
command2
...
commandN
fi
2.
if condition
then
command1
command2
...
commandN
else
command
fi
3.
if condition1
then
command1
elif condition2
then
command2
else
commandN
fi
8.2for
1.
for var in item1 item2 ... itemN
do
command1
command2
...
commandN
done
無窮循環(huán):
for (( ; ; ))
do
commands
done
8.3while
1.
while condition
do
command
done
無窮循環(huán):
1.
while :
do
command
done
2.
while true
do
command
done
8.4case
1.
case 值 in
模式1)
command1
command2
...
commandN
;;
模式2)
command1
command2
...
commandN
;;
esac
8.5until
1.
until condition
do
command
done
8.6 跳出循環(huán)
1.break:適用于所有循環(huán),并且跳出所有循環(huán)
2.continue:適用于所有循環(huán),跳出當(dāng)前循環(huán)
3.esca:僅用于case循環(huán)中
9.shell函數(shù)
9.1 shell函數(shù)定義
[ function ] funname [()]
{
action;
[return int;]
}
說明:
1、可以帶function fun() 定義,也能夠直接fun() 定義,不帶任何參數(shù)。
2、參數(shù)返回,可以顯示加:return 返回,如果不加,將以最后1條命令運行結(jié)果,作為返回值。 return后跟數(shù)值n(0-255)
9.2 shell 函數(shù)參數(shù)
1.
在shell函數(shù)體內(nèi)部,通過 $n 的情勢來獲得參數(shù)的值,例如,$1表示第1個參數(shù),$2表示第2個參數(shù)...
例:
test.sh:
#!/bin/bash
funWithParam(){
echo "第1個參數(shù)為 $1 !"
echo "第2個參數(shù)為 $2 !"
echo "第10個參數(shù)為 $10 !"
echo "第10個參數(shù)為 ${10} !"
echo "第101個參數(shù)為 ${11} !"
echo "參數(shù)總數(shù)有 $# 個!"
echo "作為1個字符串輸出所有參數(shù) $* !"
}
funWithParam 1 2 3 4 5 6 7 8 9 34 73
效果:
第1個參數(shù)為 1 !
第2個參數(shù)為 2 !
第10個參數(shù)為 10 !
第10個參數(shù)為 34 !
第101個參數(shù)為 73 !
參數(shù)總數(shù)有 11 個!
作為1個字符串輸出所有參數(shù) 1 2 3 4 5 6 7 8 9 34 73 !
注意:
$10 不能獲得第10個參數(shù),獲得第10個參數(shù)需要${10}。當(dāng)n>=10時,需要使用${n}來獲得參數(shù)。
2.特殊參數(shù)
同shell腳本傳參相同,請回顧該小節(jié)。
10.Shell 輸入/輸出重定向
10.1重定向命令表
命令 |
說明 |
command > file |
將輸出重定向到 file。 |
command < file |
將輸入重定向到 file。 |
command >> file |
將輸出以追加的方式重定向到 file。 |
n > file |
將文件描寫符為 n 的文件重定向到 file。 |
n >> file |
將文件描寫符為 n 的文件以追加的方式重定向到 file。 |
n >& m |
將輸出文件 m 和 n 合并。 |
n <& m |
將輸入文件 m 和 n 合并。 |
<< tag |
將開始標(biāo)記 tag 和結(jié)束標(biāo)記 tag 之間的內(nèi)容作為輸入。 |
10.2 Here Document
Here Document 是 Shell 中的1種特殊的重定向方式,用來將輸入重定向到1個交互式 Shell 腳本或程序。它的作用是將兩個 delimiter 之間的內(nèi)容(document) 作為輸入傳遞給 command。
它的基本的情勢以下:
command << delimiter
document
delimiter
注意:
1.結(jié)尾的delimiter 1定要頂格寫,前面不能有任何字符,后面也不能有任何字符,包括空格和 tab 縮進(jìn)。
2.開始的delimiter前后的空格會被疏忽掉。
例:
test.sh:
#!/bin/bash
cat << EOF
welcome
feison`s blog!
EOF
效果:
welcome
feison`s blog!
11.shell文件包括
1.Shell 也能夠包括外部腳本。這樣可以很方便的封裝1些公用的代碼作為1個獨立的文件。
2.文件包括語法格式:
. filename
或
source filename
注意:
被包括的文件 test1.sh 不需要可履行權(quán)限。
12.寫在后面
本文是學(xué)習(xí)[菜鳥教程shell](http://www.runoob.com/linux/linux-shell.html)的筆記,記錄的是本人在shell方面的薄弱點,主要是打基礎(chǔ),方便以后回顧,編寫的不夠深入和全面,大家如有不同看法可以留言評論,相互交換學(xué)習(xí)。