Shell編程基礎入門
1.shell格式:例
shell腳本開發習慣
1.指定解釋器 #!/bin/bash
2.腳本開頭加版權等信息如:#DATE:時間,#author(作者)#mail:郵箱,#function(功能),#Version:版本
3.腳本注釋(用英文注釋 中文可能亂碼。)
4.腳本以.sh結尾 不是必須的
5.成對的符號,一次性寫全,退格補內容。特殊符號[ xxxx ] 中括號中間內容兩邊都有空格。
6 .代碼有條理性(通過縮進)。
2.執行:1.sh xxx.sh (-x)執行並顯示執行過程。
sh xx.sh(不需要root權限)。全路徑執行需要x權限。(chmod a+x xx.sh)當前路徑下用點執行(. xx.sh )或者source xxx.sh (重點)
注意:兩個 腳本 ,當一個腳本需要調用前一個腳本里面的內容時候 。需要source 或者點 “.” 來執行加載才可調用。Sh .xxsh bash xxx 只可執行 不可加載。
學習在線資料:http://manual.51yip.com/shell/
3.環境變量全局配置地點:常見的:/etc/profile , /etc/basrc , /etc/profile.d/xxx.sh ,
用戶的環境變量~/.bash_profile ~./bash_bashrc
設置環境變量用:export 變量名(大寫)=xxx變量值。
如登錄時候提示信息可在 vi /etc/motd 編輯改文件自定義提示信息。也可在/profile.d/xx.sh 內如可寫echo “xxx自定義提示信息”。即可加入x執行權限。注意:定時任務。環境變量需要重新定義。
(1). 顯示環境變量輸出: echo $XXX , set ,env 顯示比較全面。
(2)取消變量 unset 命令行臨時取消。
(3)jobs 將查當前后台執行程序。
(4) ctrl+z 暫停, fg 調至前台運行,bg將程序調至后台執行。
(5)清空日志:cat /dev/null >test.log unll
4.shell特殊符號總結
‘’單引號 照原輸出。
“” 自動識別變量執行,遇到命令需要加反引號。=不加引號(設置變量里面)
.*表示任意字符
. 表示任意一個字符。
* 表示任意0個或多個字符。(包括+和?)
+ 表示1個或多個+前面的字符
? 表示0個或1個字符。
# 注釋符號。#后面的內容可以忽略
\ 脫意字符。
| 管道符號 將符號前面執行的結果作為符號后面的命令。如cat test.txt |wc -l 計算文檔行數。
$變量前面表示符號。還有一個妙用即和!結合起來使用。!$ 表示上一條命令中最后一個變量 如:上一次touch 1.txt 。Vi !$ 其中!$表示為1.txt、
~表示root家目錄。
& 如果把一條命令放到后台執行的話,則需要加上這個符號, 通常用作一個命令運作時間非常長的情況。如。Sleep 200 & 后台執行。Jobs 查看 bg 調用到前天 fg調用到后台。
>>追加重定向。 >(重定向) 2>>錯誤追加重定向。2>重定向。
< 如:wc -l <1.txt
[ ] 中括號 中間字符組合,代表中間字符中的任意一個。Ls [1-3].txt
{ } 表示序列 序列 如:touch wyl{1..3}.txt 也有表示變量的意義如: Echo “${a}abc” 告訴它a是變量。
^以什么開頭。
$以什么結尾。
^$表示空行。
&& 左邊命令執行成功后,在執行下一個命令
|| 左邊的命令沒有執行成功后,才會執行后面的命令。
;常常把兩條命令寫在一行中間用;隔開。有或的意思。如:command1:command2
5.cut(切割)命令 檢索字段。(單獨使用檢索列配合起來可檢索字段。)
-d 指定分隔符。用雙引號引起來。
-f 指定第幾段。
-c 第幾個字符。可用區間如 1-3,或者1,3,5,不可與d f 連用。
命令實例:head -1 /etc/shadow |cut -d “:” -f 2| 查出root密碼文件
6.sort 排序。(默認ASC2碼值進行排序。)
參考文檔:http://www.cnblogs.com/51linux/archive/2012/05/23/2515299.html
-t 指定分隔符
-n 充數字排序
-r反向排序。
-u 去重復。
-k 對第幾個字符串進行排序。K3,5 表示從3-5區間字符進行排序。
-n-u 一起用會將文檔中的字母當成0進行排序。
注釋:Echo -e “computer\nmouse\nadmin\nexprot”>wyl.txt -e 啟用轉義,將\n轉換為換行。http://www.linuxidc.com/Linux/2015-05/116936.htm
規則:默認方式下
1.以數字開頭的優先級最高
2.以小寫字母開頭的優先級次之
3.待排序內如按字典序進行排序。
4.默認情況下sort將待 排序內容的每行關鍵字當做一個字符串進行字典排序。
12.wc
-l (統計行數)
-w (多少個單詞,以空格為分隔符。)
-m (多少個字符,包括空格,和換行符。)
7.uniq 去重復。
默認和sort -u 一樣.
-c 統計重復的行。但只能統計相鄰的行。於是常與sort連用。即:sort 1.txt|uniq -c
8.tee 類似於重定向“>” 區別在於寫入文檔后並且顯示在屏幕上 如:echo “111111w3s” | tee 1.txt
9.tr 替換字符 -d 替換字符,-s 去掉重復的字符,最常用與替換如:head -2 /etc/passwd |tr ’[a-z]’’[A-Z]’ 針對字符對於字符串就不管用了,了解tr即可。
10.split 文件分割。(文件分割,常用語日志等文件過大,查看麻煩)
-l 按照行數分割。
-b 按照大小分割。默認b 如果按照K M G 可寫為:split -b 500m passwd
11.grep
12.sed
13.awk 見附頁【grep,sed awk總結】
14.date 查看時間(常用於日志中)
更改時間:ate -s “2014-12-20 13:26:50”
自動時間同步:yum install -y ntp
ntpdate time.windows.com
ntpdate ntp.fudan.edu.cn
Date +%F (打印年月日)
Date +%T (打印時間)
Date +%Y-%m-%d Y:全寫年,小寫y簡寫 m月d日
Date +%H:%M:%S H時 M分 S秒 小s:時間戳
Date +“%Y-%m-%d %H:%M:%S”
Date -d “-2 days”+%F 兩天前
Date -d “-2 month”+%F 兩個月前
Date -d “-2 hour”+%T 兩小時前
Date -d “-2 min”+%T 兩分鍾前
Date -d “-2 sec”+%T 兩秒前
Date +%w 星期幾
Date +%W 今年的第幾周
15.shell變量
定義變量:variableName(變量名)=“value(變量值)”
注釋:變量名和等號之間不能有空格,變量名的命名須遵循如下規則:
1.首個字符必須為字母(a-z,A-Z)
2.中間不能有空格,可以使用下划線(_)
3. 不能使用標點符號
4. 不能使用bash里的關鍵字(可用help命令查看保留關鍵字)
定義變量例:a=100 b=”http://www.cnblogs.com/wylhome”
使用變量:
使用一個定義過的變量只要在變量名前面加美元符號($)即可,如:
your_name=wyl
echo $your_name
echo ${your_name}
注釋:變量名外面的花括號是可選的,加不加都行,加花括號是為了幫助解釋器識別變量的邊界,比如下面這種情況:
for skill in Ada Coffe Action Java
do
echo "I am good at ${skill}Script"
Done
如果不給skill變量加花括號,寫成echo "I am good at $skillScript",解釋器就會把$skillScript當成一個變量(其值為空),代碼執行結果就不是我們期望的樣子了。(推薦使用花括號)
只讀變量:使用 readonly 命令可以將變量定義為只讀變量,只讀變量的值不能被改變。 如:your_name=wyl
readonly your_name
如果嘗試給your_name重新賦值,將會報錯。
刪除變量: unset 如:unset your_name
Shell特殊變量:
特殊變量列表 |
|
變量 |
含義 |
$0 |
當前腳本的文件名 |
$n |
傳遞給腳本或函數的參數。n 是一個數字,表示第幾個參數。例如,第一個參數是$1,第二個參數是$2。 |
$# |
傳遞給腳本或函數的參數個數。 |
$* |
傳遞給腳本或函數的所有參數。 |
$@ |
傳遞給腳本或函數的所有參數。被雙引號(" ")包含時,與 $* 稍有不同,下面將會講到。 |
$? |
上個命令的退出狀態,或函數的返回值。 |
$$ |
當前Shell進程ID。對於 Shell 腳本,就是這些腳本所在的進程ID。 |
舉例:vim 1.sh
echo "File Name: $0"
echo "First Parameter : $1"
echo "First Parameter : $2"
echo "Quoted Values: $@"
echo "Quoted Values: $*"
echo "Total Number of Parameters : $#"
運行:sh 1.sh wang yun long
[root@www share]# bash 1.sh wang yun long
File Name: 1.sh
First Parameter : wang
First Parameter : yun
Quoted Values: wang yun long
Quoted Values: wang yun long
Total Number of Parameters : 3
$*和$a的區別
$* 和 $@ 都表示傳遞給函數或腳本的所有參數,不被雙引號(" ")包含時,都以"$1" "$2" … "$n" 的形式輸出所有參數。但是當它們被雙引號(" ")包含時,"$*" 會將所有的參數作為一個整體,以"$1 $2 … $n"的形式輸出所有參數;"$@" 不變,依然以“$1”“$2”..形式輸出。
舉例:vim 1.sh
echo "print each param from \$*"
for var in $*
do
echo "$var"
done
echo "print each param from \$@"
for var in $@
do
echo "$var"
done
echo "print each param from \"\$*\""
for var in "$*"
do
echo "$var"
done
echo "print each param from \"\$@\""
for var in "$@"
do
echo "$var"
done
執行看到結果:
[root@www share]# bash 1.sh wang yun long
print each param from $*
wang
yun
long
print each param from $@
wang
yun
long
print each param from "$*"
wang yun long
print each param from "$@"
wang
yun
long
對出狀態:$?
表示上一個命令退出的狀態。返回結果。如測試xx安裝執行是否ok則用echo $? 結果“0”表示ok “1”表示錯誤。
Shell替換[shell變量替換,命令替換,轉義字符]
shell變量替換
如果表達式中包含特殊字符,Shell 將會進行替換。例如,在雙引號中使用變量就是一種替換,轉義字符也是一種替換。
#!/bin/bash
a=10
echo -e "Value of a is $a \n"
運行結果:
Value of a is 10
這里 -e 表示對轉義字符進行替換。如果不使用 -e 選項,將會原樣輸出:
Value of a is 10\n
下面的轉義字符都可以用在 echo 中:
轉義字符 |
含義 |
\\ |
反斜杠 |
\a |
警報,響鈴 |
\b |
退格(刪除鍵) |
\f |
換頁(FF),將當前位置移到下頁開頭 |
\n |
換行 |
\r |
回車 |
\t |
水平制表符(tab鍵) |
\v |
垂直制表符 |
可以使用 echo 命令的 -E 選項禁止轉義,默認也是不轉義的;使用 -n 選項可以禁止插入換行符。
命令替換:`命令語句` :Shell可以先執行命令反引號里面的命令語句,然后將輸出結果暫時保存,在適當的地方輸出。
#!/bin/bash
DATE=`date`
echo "Date is $DATE"
執行后結果:
Date is 2016年 11月 06日 星期日 03:33:19 CST
變量替換可以根據變量的狀態(是否為空、是否定義等)來改變它的值
變量替換
可以使用的變量替換形式:
形式 |
說明 |
${var} |
變量本來的值 |
${var:-word} |
如果變量 var 為空或已被刪除(unset),那么返回 word,但不改變 var 的值。 |
${var:=word} |
如果變量 var 為空或已被刪除(unset),那么返回 word,並將 var 的值設置為 word。 |
${var:?message} |
如果變量 var 為空或已被刪除(unset),那么將消息 message 送到標准錯誤輸出,可以用來檢測變量 var 是否可以被正常賦值。 |
${var:+word} |
如果變量 var 被定義,那么返回 word,但不改變 var 的值。 |
請看下面的例子:
#!/bin/bash
echo ${var:-"Variable is not set"}
echo "1 - Value of var is ${var}"
echo ${var:="Variable is not set"}
echo "2 - Value of var is ${var}"
unset var
echo ${var:+"This is default value"}
echo "3 - Value of var is $var"
var="Prefix"
echo ${var:+"This is default value"}
echo "4 - Value of var is $var"
echo ${var:?"Print this message"}
echo "5 - Value of var is ${var}"
運行結果:
Variable is not set
1 - Value of var is
Variable is not set
2 - Value of var is Variable is not set
3 - Value of var is
This is default value
4 - Value of var is Prefix
Prefix
5 - Value of var is Prefix
Shell算數運算符
expr 是一款表達式計算工具,使用它能完成表達式的求值操作
如: a=`expr 2 + 2`
echo $a 結果為4 2與+之間是有去空格的。
如a=10 b=20
c=`expr $a + $b` echo $c 則顯示30 c=$[$a+$b+$c]
算術運算符列表 |
||
運算符 |
說明 |
舉例 |
+ |
加法 |
`expr $a + $b` 結果為 30。 |
- |
減法 |
`expr $a - $b` 結果為 10。 |
* |
乘法 |
`expr $a \* $b` 結果為 200。 |
/ |
除法 |
`expr $b / $a` 結果為 2。 |
% |
取余 |
`expr $b % $a` 結果為 0。 |
= |
賦值 |
a=$b 將把變量 b 的值賦給 a。 |
== |
相等。用於比較兩個數字,相同則返回 true。 |
[ $a == $b ] 返回 false。 |
!= |
不相等。用於比較兩個數字,不相同則返回 true。 |
[ $a != $b ] 返回 true。 |
乘號(*)前邊必須加反斜杠(\)才能實現乘法運算
Shell關系運算符
關系運算符只支持數字,不支持字符串,除非字符串的值是數字。
#!/bin/sh
a=10
b=20
if [ $a -eq $b ]
then
echo "$a -eq $b : a is equal to b"
else
echo "$a -eq $b: a is not equal to b"
fi
運行結果: -eq 20: a is not equal to b
關系運算符列表 |
||
運算符 |
說明 |
舉例 |
-eq |
檢測兩個數是否相等,相等返回 true。 |
[ $a -eq $b ] 返回 true。 |
-ne |
檢測兩個數是否相等,不相等返回 true。 |
[ $a -ne $b ] 返回 true。 |
-gt |
檢測左邊的數是否大於右邊的,如果是,則返回 true。 |
[ $a -gt $b ] 返回 false。 |
-lt |
檢測左邊的數是否小於右邊的,如果是,則返回 true。 |
[ $a -lt $b ] 返回 true。 |
-ge |
檢測左邊的數是否大等於右邊的,如果是,則返回 true。 |
[ $a -ge $b ] 返回 false。 |
-le |
檢測左邊的數是否小於等於右邊的,如果是,則返回 true。 |
[ $a -le $b ] 返回 true。 |
布爾運算符
布爾運算符列表 |
||
運算符 |
說明 |
舉例 |
! |
非運算,表達式為 true 則返回 false,否則返回 true。 |
[ ! false ] 返回 true。 |
-o |
或運算,有一個表達式為 true 則返回 true。 |
[ $a -lt 20 -o $b -gt 100 ] 返回 true。 |
-a |
與運算,兩個表達式都為 true 才返回 true。 |
[ $a -lt 20 -a $b -gt 100 ] 返回 false。 |
#!/bin/sh
a=10
b=20
if [ $a != $b ]
then
echo "$a != $b : a is not equal to b"
else
echo "$a != $b: a is equal to b"
fi
結果:!= 20 : a is not equal to b
字符串運算符
字符串運算符列表 |
||
運算符 |
說明 |
舉例 |
= |
檢測兩個字符串是否相等,相等返回 true。 |
[ $a = $b ] 返回 false。 |
!= |
檢測兩個字符串是否相等,不相等返回 true。 |
[ $a != $b ] 返回 true。 |
-z |
檢測字符串長度是否為0,為0返回 true。 |
[ -z $a ] 返回 false。 |
-n |
檢測字符串長度是否為0,不為0返回 true。 |
[ -z $a ] 返回 true。 |
str |
檢測字符串是否為空,不為空返回 true。 |
[ $a ] 返回 true。 |
#!/bin/sh
a="abc"
b="efg"
if [ -z $a ]
then
echo "-z $a : string length is zero"
else
echo "-z $a : string length is not zero"
fi
結果:-z abc : string length is not zero
文件測試運算符
變量 file 表示文件“/var/www/tutorialspoint/unix/test.sh”,它的大小為100字節,具有 rwx 權限。下面的代碼,將檢測該文件的各種屬性:
文件測試運算符列表 |
||
操作符 |
說明 |
舉例 |
-b file |
檢測文件是否是塊設備文件,如果是,則返回 true。 |
[ -b $file ] 返回 false。 |
-c file |
檢測文件是否是字符設備文件,如果是,則返回 true。 |
[ -b $file ] 返回 false。 |
-d file |
檢測文件是否是目錄,如果是,則返回 true。 |
[ -d $file ] 返回 false。 |
-f file |
檢測文件是否是普通文件(既不是目錄,也不是設備文件),如果是,則返回 true。 |
[ -f $file ] 返回 true。 |
-g file |
檢測文件是否設置了 SGID 位,如果是,則返回 true。 |
[ -g $file ] 返回 false。 |
-k file |
檢測文件是否設置了粘着位(Sticky Bit),如果是,則返回 true。 |
[ -k $file ] 返回 false。 |
-p file |
檢測文件是否是具名管道,如果是,則返回 true。 |
[ -p $file ] 返回 false。 |
-u file |
檢測文件是否設置了 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。 |
#!/bin/sh
file="/var/www/tutorialspoint/unix/test.sh"
if [ -r $file ]
then
echo "File has read access"
else
echo "File does not have read access"
fi
結果:File has read access
Shell注釋:
在想要注釋的行前加#號
shell如果在開發過程中,遇到大段的代碼需要臨時注釋起來,過一會兒又取消注釋,怎么辦呢?每一行加個#符號太費力了,可以把這一段要注釋的代碼用一對花括號括起來,定義成一個函數,沒有地方調用這個函數,這塊代碼就不會執行,達到了和注釋一樣的效果。
Shell字符串
單引號:單引號里的任何字符都會原樣輸出,單引號字符串中的變量是無效的
雙引號: 可以有變量,可以出現轉義字符。
str='this is a string'
str="Hello, I know your are \"$your_name\"! \n"
拼接字符串
your_name="qinjx"
greeting="hello, "$your_name" !"
獲取字符串的長度
string="abcd"
echo ${#string} #輸出 4
提取子字符串
string="alibaba is a great company"
echo ${string:1:4} #輸出liba
查找子字符串
string="alibaba is a great company"
echo `expr index "$string" is`
查找字符串is第一次出現的下標 結果為3 下標從0 開始。
數組
在Shell中,用括號來表示數組,數組元素用“空格”符號分割開。定義數組的一般形式為:
array_name=(value0 value1 value2 value3)
或者
array_name=(
value0
value1
value2
value3
)
單獨定義數組:
例如:
array_name[0]=value0
array_name[1]=value1
array_name[2]=value2
可以不使用連續的下標,而且下標的范圍沒有限制。
讀取數組格式:
${array_name[index]}
例如:Name[0]=”wang”
Name[2]=”yun”
Name[3]=”long”
echo “First Index: ${Name[1]}”
獲取數組里面所有元素用@或者*
獲取數組的長度
獲取數組的元素個數
Length=${#arrar_name[@]}
獲取單個元素的長度
Lengthn=${$arrar_name[n]}
shell printf命令:格式化輸出語句
printf函數稱為格式輸出函數,其關鍵字最末一個字母f即為“格式”(format)之意。其功能是按用戶指定的格式,把指定的數據顯示到顯示器屏幕上。在前面的例題中我們已多次使用過這個函數。
printf 命令的語法
printf(“格式控制字符串”, 輸出表列)
中格式控制字符串用於指定輸出格式。格式控制串可由格式字符串和非格式字符串兩種組成。格式字符串是以%開頭的字符串,在%后面跟有各種格式字符,以說明輸出數據的類型、形式、長度、小數位數等。如:
其中格式控制字符串用於指定輸出格式。格式控制串可由格式字符串和非格式字符串兩種組成。格式字符串是以%開頭的字符串,在%后面跟有各種格式字符,以說明輸出數據的類型、形式、長度、小數位數等。如:
“%d”表示按十進制整型輸出;
“%ld”表示按十進制長整型輸出;
“%c”表示按字符型輸出等。
非格式字符串原樣輸出,在顯示中起提示作用。輸出表列中給出了各個輸出項,要求格式字符串和各輸出項在數量和類型上應該一一對應。
【例4-3】printf函數舉例
格式化復制
#include <stdio.h>
int main(void){
int a=88,b=89;
printf("%d %d\n",a,b);
printf("%d,%d\n",a,b);
printf("%c,%c\n",a,b);
printf("a=%d,b=%d",a,b);
return 0;
}
本例中四次輸出了a、b的值,但由於格式控制串不同,輸出的結果也不相同。第3行的輸出語句格式控制串中,兩格式串%d 之間加了一個空格(非格式字符),所以輸出的a、b值之間有一個空格。第4行的printf語句格式控制串中加入的是非格式字符逗號,因此輸出的a、b值之間加了一個逗號。第5行的格式串要求按字符型輸出a、b值。第6行中為了提示輸出結果又增加了非格式字符串。
這里僅說明與C語言printf()函數的不同:
printf 命令不用加括號
format-string 可以沒有引號,但最好加上,單引號雙引號均可。
參數多於格式控制符(%)時,format-string 可以重用,可以將所有參數都轉換。
arguments 使用空格分隔,不用逗號。
f 語句通過關系運算符判斷表達式的真假來決定執行哪個分支。Shell 有三種 if ... else 語句:
if [ expression ].. then.xxxx ....fi 語句;
if [ expression ]..then xxx else xxxx.. fi 語句;
if [ expression ] then xxx elif then xxxx... else xxx... fi 語句。
解釋:(1)if [ expression ].. then.xxxx ....fi 語句;
if(如果) [ expression ]中expression表達式成立(true)then(那么)執行then后面的語句,反之不會執行。Fi表示結束,if和fi必須成對出現。注意:expression 和方括號([ ])之間必須有空格,否則會有語法錯誤。
例句:
#!/bin/sh
a=10
b=20
if [ $a == $b ]
then
echo "a is equal to b"
fi
if [ $a != $b ]
then
echo "a is not equal to b"
fi
運行結果:
a is not equal to b
解釋:(2)if(如果) [ expression ]..then xxx else(否則) xxxx.. fi 語句;
if [ expression ]
then
Statement(s) to be executed if expression is true
else
Statement(s) to be executed if expression is not true
fi
如果 expression 返回 成立(true),那么 then 后邊的語句將會被執行;否則,執行 else 后邊的語句。
#!/bin/sh
a=10
b=20
if [ $a == $b ]
then
echo "a is equal to b"
else
echo "a is not equal to b"
fi
執行結果:
a is not equal to b
解釋:(3)if [ expression ] then xxx elif then xxxx... else xxx... fi 語句。
哪一個expression表達式成立就只想對應的哪一個then后面的。反之就執行else后面的。
if [ expression ] then xxx elif then xxxx... fi
哪一個expression表達式成立就只想對應的哪一個then后面的。反之就不止執行。
舉例:
#!/bin/sh
a=10
b=20
if [ $a == $b ]
then
echo "a is equal to b"
elif [ $a -gt $b ]
then
echo "a is greater than b"
elif [ $a -lt $b ]
then
echo "a is less than b"
else
echo "None of the condition met"
fi
運行結果:
a is less than b
if ... else 語句也可以寫成一行,以命令的方式來運行,像這樣:
if test $[2*3] -eq $[1+5]; then echo 'The two numbers are equal!'; fi;
if ... else 語句也經常與 test 命令結合使用,如下所示:
num1=$[2*3]
num2=$[1+5]
if test $[num1] -eq $[num2]
then
echo 'The two numbers are equal!'
else
echo 'The two numbers are not equal!'
fi
輸出:
The two numbers are equal!
test 命令用於檢查某個條件是否成立,與方括號([ ])類似。
case 語句匹配一個值或一個模式,如果匹配成功,執行相匹配的命令。case語句格式如下:
case 值 in
模式1)
command1
command2
command3
;;
模式2)
command1
command2
command3
;;
*)
command1
command2
command3
;;
esac
case工作方式如上所示。取值后面必須為關鍵字 in,每一模式必須以右括號結束。取值可以為變量或常數。匹配發現取值符合某一模式后,其間所有命令開始執行直至 ;;。;; 與其他語言中的 break 類似,意思是跳到整個 case 語句的最后。
取值將檢測匹配的每一個模式。一旦模式匹配,則執行完匹配模式相應命令后不再繼續其他模式。如果無一匹配模式,使用星號 * 捕獲該值,再執行后面的命令。
下面的腳本提示輸入1到4,與每一種模式進行匹配:
echo 'Input a number between 1 to 4'
echo -e 'Your number is:\c'
read aNum
case $aNum in
1) echo 'You select 1'
;;
2) echo 'You select 2'
;;
3) echo 'You select 3'
;;
4) echo 'You select 4'
;;
*) echo 'You do not select a number between 1 to 4'
;;
esac
輸入不同的內容,會有不同的結果,例如:
Input a number between 1 to 4
Your number is:3
You select 3
for循環一般格式為:
for 變量 in 列表
do
command1
command2
...
commandN
done
列表是一組值(數字、字符串等)組成的序列,每個值通過空格分隔。每循環一次,就將列表中的下一個值賦給變量。
in 列表是可選的,如果不用它,for 循環使用命令行的位置參數。
例如,順序輸出當前列表中的數字:
for loop in 1 2 3 4 5
do
echo "The value is: $loop"
done
運行結果:
The value is: 1
The value is: 2
The value is: 3
The value is: 4
The value is: 5
順序輸出字符串中的字符:
for str in 'This is a string'
do
echo $str
done
運行結果:
This is a string
顯示主目錄下以 .bash 開頭的文件:
#!/bin/bash
for FILE in $HOME/.bash*
do
echo $FILE
done
運行結果:
/root/.bash_history
/root/.bash_logout
/root/.bash_profile
/root/.bashrc
while循環用於不斷執行一系列命令,也用於從輸入文件中讀取數據;命令通常為測試條件。其格式為:
while command
do
Statement(s) to be executed if command is true
done
命令執行完畢,控制返回循環頂部,從頭開始直至測試條件為假。
以下是一個基本的while循環,測試條件是:如果COUNTER小於5,那么返回 true。COUNTER從0開始,每次循環處理時,COUNTER加1。運行上述腳本,返回數字1到5,然后終止。
COUNTER=0
while [ $COUNTER -lt 5 ]
do
COUNTER='expr $COUNTER+1'
echo $COUNTER
done
運行腳本,輸出:
1
2
3
4
5
while循環可用於讀取鍵盤信息。下面的例子中,輸入信息被設置為變量FILM,按<Ctrl-D>結束循環。
echo 'type <CTRL-D> to terminate'
echo -n 'enter your most liked film: '
while read FILM
do
echo "Yeah! great film the $FILM"
done
運行腳本,輸出類似下面:
type <CTRL-D> to terminate
enter your most liked film: Sound of Music
Yeah! great film the Sound of Music
break命令
break命令允許跳出所有循環(終止執行后面的所有循環)
#!/bin/bash
while :
do
echo -n "Input a number between 1 to 5: "
read aNum
case $aNum in
1|2|3|4|5) echo "Your number is $aNum!"
;;
*) echo "You do not select a number between 1 to 5, game is over!"
break
;;
esac
done
continue命令
continue命令
continue命令與break命令類似,只有一點差別,它不會跳出所有循環,僅僅跳出當前循環。
對上面的例子進行修改:
#!/bin/bash
while :
do
echo -n "Input a number between 1 to 5: "
read aNum
case $aNum in
1|2|3|4|5) echo "Your number is $aNum!"
;;
*) echo "You do not select a number between 1 to 5!"
continue
echo "Game is over!"
;;
esac
done
運行代碼發現,當輸入大於5的數字時,該例中的循環不會結束,語句
純文本復制
echo "Game is over!"
永遠不會被執行。
函數就是把一段代碼整理到一個小單元中,並給這個小單元起一個名字,當用到這段代碼時直接調用這個小單元的名字即可
格式:function f_name {
commad
}
函數必須要放到最前面。
例1:
#!Bin/bash
sum(){
s=#[$1+$2+¥3]
echo $s
sum 1 2 3
}
說明:sum為一個加法運算函數,$1和$2 位第一個參數,第二個參數,sum 就是sum參數即:1+2+3。