bash 語法 小結

原文:http://bbs.chinaunix.net/viewthread.php?tid=838702

shell腳本基本語法大全:http://bbs.chinaunix.net/viewthread.php?tid=557642

sed參數大全: http://bbs.chinaunix.net/viewthread.php?tid=553339

find命令大全: http://www.linuxsir.org/main/?q=node/137#2.4

1.變量賦值
a=123
read name
b=$(ls /home) 把命令的執行結果賦值給變量
2.使用變量(前面用$)
echo $a
let a=a+1
系統變量

$0 這個程序的執行名字
  $n  這個程序的第n個參數值,n=1...9
  $*  這個程序的所有參數
  $# 這個程序的參數個數
  $$ 這個程序的PID
  $! 執行上一個背景指令的PID
  $? 上一個指令的返回值


3.if語句

if [ "22" -lt "33" ]注意空格
then
echo "22 less than 33"
else
echo "no"
fi


4.case語句

#!/bin/bash
echo "enter a number"
read ans
case $ans in
1)
echo  "you numer is $ans"
;;
2)
echo "you number is 2"
;;
[3-9])
echo "you number is $ans"
esac


5.比較運算符
運算符        描述        示例
文件比較運算符
-e filename         如果 filename 存在,則爲真        [ -e /var/log/syslog ]
-d filename         如果 filename 爲目錄,則爲真        [ -d /tmp/mydir ]
-f filename         如果 filename 爲常規文件,則爲真        [ -f /usr/bin/grep ]
-L filename         如果 filename 爲符號鏈接,則爲真        [ -L /usr/bin/grep ]
-r filename         如果 filename 可讀,則爲真        [ -r /var/log/syslog ]
-w filename         如果 filename 可寫,則爲真        [ -w /var/mytmp.txt ]
-x filename         如果 filename 可執行,則爲真        [ -L /usr/bin/grep ]
filename1 -nt filename2         如果 filename1 比 filename2 新,則爲真        [ /tmp/install/etc/services -nt /etc/services ]
filename1 -ot filename2         如果 filename1 比 filename2 舊,則爲真        [ /boot/bzImage -ot arch/i386/boot/bzImage ]
字符串比較運算符 (請注意引號的使用,這是防止空格擾亂代碼的好方法)
-z string         如果 string 長度爲零,則爲真        [ -z "$myvar" ]
-n string         如果 string 長度非零,則爲真        [ -n "$myvar" ]
string1 = string2        如果 string1 與 string2 相同,則爲真        [ "$myvar" = "one two three" ]
string1 != string2        如果 string1 與 string2 不同,則爲真        [ "$myvar" != "one two three" ]
算術比較運算符
num1 -eq num2        等於        [ 3 -eq $mynum ]
num1 -ne num2        不等於        [ 3 -ne $mynum ]
num1 -lt num2        小於        [ 3 -lt $mynum ]
num1 -le num2        小於或等於        [ 3 -le $mynum ]
num1 -gt num2        大於        [ 3 -gt $mynum ]
num1 -ge num2        大於或等於        [ 3 -ge $mynum ]
6.while語句

$ X=1

$ while [ $x -le 10 ]

> do

>   echo hello X is $X

>   let X=X+1

> done
bash中的for循環有幾種方式:
1.for name [ in word ] ; do list ; done
2.for (( expr1 ; expr2 ; expr3 )) ; do list ; done//注意有2層括號

其中list簡單說就是一串由操作符(operator ;、&、&&、||)分隔開的管道(pipeline)序列,詳情參看man bash
各給出一個簡單例子:

1.
for filename in `ls`
do
cat $filename
done

2.
for((i=0; i<10; i++))
do
echo $i
done
1.條件變量替換:
Bash Shell可以進行變量的條件替換,既只有某種條件發生時才進行替換,替換
條件放在{}中.
(1) ${value:-word}
當變量未定義或者值爲空時,返回值爲word的內容,否則返回變量的值.
(2) ${value:=word}
與前者類似,只是若變量未定義或者值爲空時,在返回word的值的同時將
word賦值給value
(3) ${value:?message}
若變量以賦值的話,正常替換.否則將消息message送到標準錯誤輸出(若
此替換出現在Shell程序中,那麼該程序將終止運行)
(4) ${value:+word}
若變量以賦值的話,其值才用word替換,否則不進行任何替換
(5) ${value:offset}
${value:offset:length}
從變量中提取子串,這裏offset和length可以是算術表達式.
(6) ${#value}
變量的字符個數
(7) ${value#pattern}
${value##pattern}
去掉value中與pattern相匹配的部分,條件是value的開頭與pattern相匹配
#與##的區別在於一個是最短匹配模式,一個是最長匹配模式.
(8) ${value%pattern}
${value%%pattern}
於(7)類似,只是是從value的尾部於pattern相匹配,%與%%的區別與#與##一樣
(9) ${value/pattern/string}
${value//pattern/string}
進行變量內容的替換,把與pattern匹配的部分替換爲string的內容,/與//的區
別與上同

注意:上述條件變量替換中,除(2)外,其餘均不影響變量本身的值


2.變量的算術運算
在Bash Shell中,只能進行兩個整數間的運算,其結果仍爲整數.要進行算術
運算,需要使用let命令,語法爲:
let expr
expr是一個包含項和操作符的表達式,項可以是一個變量或是一個整數常數,
當使用整數常數時,其默認爲十進制整數,用戶可以用radio#number來指定其它
形式的整數,其中radio定義了整數是幾進製表示的,number是該整數的值.若
radio>10,那麼數字字符可從0-9和A-Z.
在表達式中支持的操作符及其含義爲:
+,-,*,/,% 加,減,乘,除,取模
>>,<<,&,^,| 左移,右移,位與,位異或,位或
?: 三元運算符.與C語言中的定義一致
~ 取補碼
!,>=,<=,>,<,==,!=,&&,||
=,+=,-=,*=,/=,%=,<<=,>>=,&=,^=,|=
表達式式中也可以使用括號.括號或運算優先級的定義與一般計算機語言中的
相同.
let命令具有返回值.當計算結果(若有多個表達式時,以最後一個爲準)爲0時,
返回值爲1,否則爲0.
當表達式中含有shell的特殊字符(如|)時,需要用引用符('或")將其引用起來.
使用let時還需要注意的時,對於let x+y這樣的式子,shell雖然計算了x+y的值
但卻將結果丟棄,若不想這樣,可以使用let sum=x+y將x+y的結果保存在變量sum中
另外還可以使用((和))操作符取代let命令,而且這樣的話,還可以省去對算術
表達式的引用,如果想返回表達式的值,則需用$(())的格式
使用set命令可以設置各種shell選項或者列出shell變量.單個選項設置常用的特性.
在某些選項之後-o參數將特殊特性打開.在某些選項之後使用+o參數將關閉某些特性,
不帶任何參數的set命令將顯示shell的全部變量.除非遇到非法的選項,否則set總是
返回ture.
當BASH shell被調用時,可以列出全部的選項.當前的選項集列在$-中.在option參數
被處理後,其他的參數被賦值到位置參數中($1,$2,...,$n)

set [--abefhkmnptuvxldCHP] [-o option name] [arguments ...]


源碼:


選項 說明
-a 自動向已經修改的變量或爲導出後序命令的變量作出標誌
-b 不是在原提示符之前,而是立即引發終止後臺任務的狀態表表
-e 如果命令帶非零值返回,立即退出
-f 禁止帶擴展名的路徑
-h 定義函數時,定位和存儲函數命令,當函數被執行時,通常查詢
函數命令
-k 所有的關鍵詞參數,而不只是那些命令名前的關鍵詞參數,被放
在環境命令中
-m 監視器模式,啓動任務控制.此選項默認支持系統shell交互.後
臺進程以單獨的進程組運行,在每次完成任務時顯示包含退出的
狀態行
-n 讀取命令但不執行命令.通常監查shell腳本的句法錯誤.交互
shell被忽略

-o option-name 選項名可以是下列之一:
選項 說明
allexport 同-a選項
braceexpand shell執行花括號擴展,在默認情況下起作用
emacs 使用emacs風格命令行編輯接口.除非shell以-noline-editing
選項啓動,否則當shell交互時,通過默認啓動該選項
errexit 同-e選項
histexpand 同-H選項
ignoreeof 其結果是好像shell命令IGNOREEOF=10被執行
interactive 允許單詞前帶#號,以使得在交互shell中忽略命令行的全部字符
-commands
monitor 同-m選項
noclobber 同-C選項
noexec 同-n選項
noglob 同-f選項
nohash 同-d選項
notify 同-b選項
nounset 同-u選項
physical 同-p選項
posix 改變BASH屬性以匹配標準,默認操作不同於POSIX1003.2標準
verbose 同-v選項
vi 使用vi風格的命令行編輯器
XTRACE 同-x選項,如果沒有給出選項名,顯示當前選項值
-p 打開特權模式(在此模式,$ENV文件被處理,不能從環境中繼承
shell函數.如果是有效用戶ID而不是實用戶組則自動啓動.關閉
此選項將使得有效用戶和組IDs設置實用戶和組IDs)
-t 在讀取命令並執行之後退出
-u 當執行參數括展時,把非設置變量作爲錯誤處理(如果擴展企圖
出現在非設置變量中,shell顯示錯誤信息.如果不是交互式,則
帶非凌值退出)
-v 輸入行被讀取時,顯示shell輸入行
-x 在每個簡單命令被擴展之後,顯示PS4擴展值,之後是要執行的命令
-l 保存和恢復綁定在命令中的名稱
-d 禁止執行查找散列命令(通常,命令被保存在散列表中,一旦被找到
就不再繼續查找)
-C 效果好像是執行了noclobber=shell命令
-H 使用!風格的歷史替代(當shell交互時,在默認情況下,此選項有效)
-P 如果設置此參數,當執行改變目錄命令cd時,不遵循符號鏈接,而是
使用實際的目錄
-- 如果在選項後沒有參數,不設置位置參數.否則,即使一些參數以a
選項開始,也要把位置參數設置爲argument
- 結束選項的信號,將引發其餘的參數被賦值到位置參數中(-x和-v
選項被關閉.如果沒有argument,位置參數將保留未改變的參數)
函數

函數的使用
BASH 是一個相對簡單的腳本語言,不過爲了方便結構化的設計,BASH 中也提供了函數定義的功能。BASH 中的函數定義很簡單,只要向下面這樣寫就可以了:
function my_funcname {
 code block
}

或者

my_funcname() {
 code block
}

上面的第二種寫法更接近於 C 語言中的寫法。BASH 中要求函數的定義必須在函數使用之前,這是和 C 語言用頭文件說明函數方法的不同。

更進一步的問題是如何給函數傳遞參數和獲得返回值。BASH 中函數參數的定義並不需要在函數定義處就制定,而只需要在函數被調用時用 BASH 的保留變量 $1 $2 ... 來引用就可以了;BASH 的返回值可以用 return 語句來指定返回一個特定的整數,如果沒有 return 語句顯式的返回一個返回值,則返回值就是該函數最後一條語句執行的結果(一般爲 0,如果執行失敗返回錯誤碼)。函數的返回值在調用該函數的程序體中通過 $? 保留字來獲得。下面我們就來看一個用函數來計算整數平方的例子:

#!/bin/bash

square() {
 let "res = $1 * $1"
 return $res
}

square $1
result=$?
echo $result

exit 0
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章