1. “:” 命令
Shell命令總是有一些奇怪的命令符,比如之前看到的“[”;這里又來了一個。你沒有看錯,“:”這貨也是有特殊含義的。
在shell中 “:”是true的別名,就是表示真,如以下代碼:
#!/bin/bash
if : # 有木有看到
then
echo ": is true"
fi
if true
then
echo "true is true"
fi
就是這樣的了,由于“:”是內(nèi)置命令,所以它的運(yùn)行速度比true快。
2. eval命令
eval命令允許對參數(shù)進(jìn)行求值,它的格式如下:
eval [arg ...]
把參數(shù)當(dāng)做一個Shell命令來執(zhí)行。這是對eval最簡單的解釋了。eval命令會將參數(shù)連接為一個整的字符串,然后將這個字符串作為一個新的Shell輸入進(jìn)行執(zhí)行。
當(dāng)我們將一些字符串作為eval的參數(shù)時,Shell在執(zhí)行整個eval命令時,它會對eval命令的參數(shù)進(jìn)行兩次掃描。例如以下示例代碼:
#!/bin/bash
a=10
x=a
eval y='$'$x
echo $y
exit 0
在eval執(zhí)行的過程中,先對y='$'$x進(jìn)行第一次掃描,得到y(tǒng)=$a;然后再進(jìn)行第二次掃描,也就是執(zhí)行y=$a,得到了y=10;當(dāng)執(zhí)行echo $y的時候,就輸出結(jié)果10。
3. exit n命令
exit命令使腳本以退出碼n結(jié)束運(yùn)行。如果允許自己的腳本程序在退出時不指定一個退出狀態(tài),那么該腳本中最后一條被執(zhí)行命令的狀態(tài)將被用作為返回值。在腳本程序中提供一個退出碼總是一個良好的習(xí)慣。
在Shell腳本編程中,退出碼0表示成功,退出碼1~125是腳本程序可以使用的錯誤代碼。其余數(shù)字具有保留的含義,具體請Google。
可以使用$? 來讀取shell的退出碼
注意:$?只能用一次,第二次再用$?時結(jié)果就是上次$?的返回值,其實(shí)就是0
4. expr命令
expr命令是一個手工命令行計(jì)數(shù)器,用于在UNIX/LINUX下求表達(dá)式變量的值,一般用于整數(shù)值,也可用于字符串。以下通過實(shí)際的簡單代碼來看看expr的使用。
#!/bin/bash
# 獲取字符串的長度
expr length "http://www.jellythink.com"
#截取子串
expr substr "http://www.jellythink.com" 12 21
#整數(shù)運(yùn)算
var=`expr 10 / 2`
echo $var
var=$(expr 10 \* 2)
echo $var
exit 0
在上面的腳本中,使用了反引號(`),使用了該引號,就可以使expr的執(zhí)行結(jié)果賦值給var變量,當(dāng)然了,我們在腳本中也看到了$()來替換反引號的用法,這都是可以的。
expr命令的功能比較簡單、單一,但是很強(qiáng)大。但是需要注意的是,在進(jìn)行乘法運(yùn)算時,如果寫成:
expr 10 * 2
這樣就會報(bào)錯,這是由于*號在Shell有特殊意義,我們需要加上轉(zhuǎn)義字符\。
5. set命令
set命令作用主要是顯示系統(tǒng)中已經(jīng)存在的shell變量,以及為已經(jīng)存在的shell變量設(shè)定新的值。使用set更改shell特性時,符號”+”和”-“的作用分別是打開和關(guān)閉指定的模式。set命令不能夠定義新的shell變量。如果要定義新的變量,可以使用declare命令以變量名=值的格式進(jìn)行定義即可。
當(dāng)使用set命令不帶任何參數(shù)時,它會輸出系統(tǒng)中已經(jīng)存在的所有Shell變量;我們可以使用set設(shè)置我們本地的Shell變量,當(dāng)退出Shell時,這些本地的Shell變量就會失效,如果需要永久的保存這些Shell變量,則需要寫入配置文件中。
6. return命令
return命令的作用是使函數(shù)返回。return命令有一個數(shù)值參數(shù),這個參數(shù)在調(diào)用該函數(shù)的腳本程序中被看做是該函數(shù)的返回值;如果沒有指定參數(shù),return命令默認(rèn)返回最后一條命令的退出碼。
7. shift命令
shift命令把所有參數(shù)變量左移一個位置,使2變成1,3變成2,以此類推;而2占領(lǐng)1的位置之后,原來$1的值就會被丟棄。
在掃描處理腳本程序的時候,經(jīng)常要用到shift命令。如果你的腳本命令程序需要10個或10個以上的參數(shù),我們就需要使用shift命令來訪問第十個及其后面的參數(shù)。
8. trap命令
trap命令用于指定在接收到信號后將要采取的行動。trap命令的一種常見用途是在腳本程序中斷時完成清理工作。在Linux系統(tǒng)中定義了許多信號,它們被定在頭文件signal.h中,在使用信號名時需要省略SIG前綴。我們在命令行下可以使用trap -l查看所有的信號量定義,及其對應(yīng)的數(shù)字。
trap有兩個參數(shù),第一個參數(shù)是接收到指定信號時將要采取的行動,第二個參數(shù)是要處理的信號名。格式如下:
trap command signal
下面就通過一個簡單的實(shí)例來學(xué)習(xí)一下trap命令的使用,代碼如下:
# !/bin/bash
# 當(dāng)按下ctrl+c觸發(fā)中斷信號以后,就刪除臨時文件
trap 'rm -f /tmp/my_tmp_file_$$' INT
echo creating file /tmp/my_tmp_file_$$
date > /tmp/my_tmp_file_$$
echo "Press interrupt (ctrl + c) to interrupt..."
while [ -f /tmp/my_tmp_file_$$ ]
do
echo file exists
sleep 1
done
echo file is no longer exists
#取消INT信號對應(yīng)的處理
trap INT
echo creating file /tmp/my_tmp_file_$$
date > /tmp/my_tmp_file_$$
echo "Press interrupt (ctrl + c) to interrupt..."
while [ -f /tmp/my_tmp_file_$$ ]
do
echo file exists
sleep 1
done
echo I never get here
exit 0
當(dāng)按下ctrl + c組合鍵時,就會觸發(fā)INT中斷,然后就會刪除創(chuàng)建的臨時文件。
9. unset命令
unset命令的作用是從環(huán)境中刪除變量或函數(shù),這個命令不能刪除shell本身定義的只讀變量。
10. 命令的執(zhí)行
我們在編寫腳本的時候,經(jīng)常需要捕獲一條命令的執(zhí)行結(jié)果,然后將這個結(jié)果保存在另一個變量中。在總結(jié)expr命令時,說到可以使用`符號。是的,不錯,使用反引號確實(shí)可以完成,但是我們更建議使用$(command)來完成這項(xiàng)工作。
$(command)的結(jié)果就是其中命令的輸出。注意,這不是該命令的退出狀態(tài),而是它的字符串形式的輸出結(jié)果。比如以下腳本代碼:
x=$(date)
echo $x
我們將date命令的輸出結(jié)果保存在x變量中,然后就可以輸出對應(yīng)的結(jié)果。
這種把命令的執(zhí)行結(jié)果存儲到變量中的功能是巨大的,它使得在腳本程序中使用現(xiàn)有命令并捕獲其輸出變得很容易;這樣我們可以配合xargs命令,將標(biāo)準(zhǔn)輸出作為另一個程序的參數(shù)。
轉(zhuǎn)自:http://www.jellythink.com/archives/785