命令替換是指 shell 可以先執(zhí)行命令,將輸出結果暫時保存,在適當?shù)牡胤捷敵觥?/p>
命令替換的語法:
command
注意這是反引號,而不是單引號,這個鍵位于 ESC 鍵的下方。
案例:
\#!/bin/bash
DATE=`date`
echo "Date is $DATE"
\
USERS=`who | wc -l`
echo "Logged in user are $USERS"
UP=`date ;uptime`
echo "Uptime is $UP"
執(zhí)行結果:
Date is 2015 年 07 月 04 日 星期六 10:54:22 CST
Logged in user are 1
Uptime is 2015 年 07 月 04 日 星期六 10:54:22 CST
10:54:22 up 1:22, 1 user, load average:0.00,0.00,0.00
為 head
命令使用 sed
使用 sed 的 head
命令來顯示文件的前 n 行。真實的 head
命令可加上選項,以指定要顯示多少行。例如 head -n 10 /etc/passwd
。
使用命令替換與 sed,使其與原始的 head 版本的工作方式相同:
\#!/bin/bash
count=$(echo $1 | sed's/^-//') #截去前置的負號
shift #移除 $1
sed ${count}q "$@"
當調用這個腳本時,使用命令./head.sh -10 /etc/passwd
調用這個腳本時,sed 最終是以 sed 10q /etc/passwd
被引用。
案例:發(fā)一封郵件信息給當前已登錄的所有用戶:
mail $(who | cut -d' '-f1)
使用 who
命令獲得當前在線用戶,使用 cut
獲得用戶的名稱,把括號內命令生成的結果先執(zhí)行,然后作為 mail 參數(shù)。
回顧一下 cut 命令:
語法:cut
選項 參數(shù)
主要是用來從一個文本文件或者文本流中提取文本列。
主要選項:
-b
,-c
,-f
分別表示字節(jié),字符,字段 (即 byte,character,field)-d
:使用指定分界符代替制表符作為區(qū)域分界-f
:只選中指定的這些域;并打印所有不包含分界符的行,除非 -s 選項被指定。-s
:不打印沒有分界符的行--output-delimiter= 字符串
// 使用指定的字符串作為輸出分界符,默認采用輸入的分界符。簡易教學:expr
expr
命令是一個手工命令行計數(shù)器,用于在 UNIX/LINUX 下求表達式變量的值,一般用于整數(shù)值,也可用于字符串。
expr Expression
(命令讀入 Expression 參數(shù),計算它的值,然后將結果寫入到標準輸出)expr 主要用于 shell 的算術運算。expr 的語法很麻煩:運算數(shù)與運算符必須是單個的命令行參數(shù);因此建議在這里大量使用空格間隔它們。很多 expr 的運算符同時也是 shell 的 meta 字符,所以必須謹慎使用引號。
expr 被設置用在命令替換之內。這樣,它會通過打印的方式把值返回到標準輸出,而非通過使用退出碼 (也就是 shell 內的 $?
)。
expr 運算符 (優(yōu)先級由小至大)
表達式
意義
e1 | e2
如果 e1 是非零值或非 null,則使用它的值。否則如果 e2 是非零值或非 null,則使用它的值。如果兩者都不是,則最后值為零
e1&e2
如果 e1 與 e2 都非零值或非 null,則返回 e1 的值。否則,最后值為零
e1=e2
等于
e1!=e2
不等于
e1<e2
小于
e1<=e2
小于或等于
e1>e2
大于
e1>=e2
大于或等于
以上這些運算符,如果指示的比較為真,則會使得 expr 顯示 1,否則顯示 0。如果兩個運算符都為整數(shù),則以數(shù)字方式比較;如果不是,則以字符串方式比較
e1+e2
e1 與 e2 的加和
e1-e2
e1 與 e2 的相減
e1*e2
e1 與 e2 的相乘
e1/e2
e1 除以 e2 的整數(shù)結果 (取整)
e1%e2
e1 除以 e2 的整數(shù)結果 (取余)
e1:e2
e1 與 e2 的 BRE 匹配
integer
一個只包含數(shù)字的數(shù)目,允許前置負號,但卻不支持一元的正號string
字符串值,不允許被誤用為數(shù)字或運算符在新的代碼里,可以使用 test
或 $((...))
進行這里所有運算。正則表達式的匹配與提取,也可搭配 sed 或是 shell 的 case 語句來完成。
案例一:計算字符串長度
expr length "this is a test"
輸出:14
案例二:抓取字串
expr substr "this is a test"
輸出:is is
案例三:抓取第一個字符數(shù)字串出現(xiàn)的位置
expr index "qweasdzxcasdqwe" a
輸出:4
案例四:整數(shù)運算
expr 14 % 9
(空格隔開)
輸出:5
其他運算符相同
案例五:增量計算
test=0
test=`expr $LOOP + 1`(這里的是反引號,ESC 下面的那個鍵)
案例六:數(shù)值測試
說明:用 expr
測試一個數(shù)。如果試圖計算非整數(shù),則會返回錯誤。
rr=3.4
expr $rr + 1
expr:non-numeric argument
rr=5
expr $rr + 1
6
案例七:
$ a=2
$ b=3
$ c=`expr $a + $b`//` 是 Tab 上面的那個按鍵,意思在這行里面
兩個 `` 之間的命令最先執(zhí)行
$ echo $c
你還可以用這種方面來計算:
$ a=2
$ b=3
$ c=$(($a+$b))
$ echo $c
解釋一下:$((里面能進行運算))
更詳細的參考:
http://blog.csdn.net/guhong5153/article/details/6542995
案例:
\#!/bin/bash
i=1
while ["$i" -le 5]
do
echo i is $i
i=`expr $i + 1`
done
echo $i
輸出:
i is 1
i is 2
i is 3
i is 4
i is 5
6
這類的算術運算,已經給出了可能遇到的 expr 的使用方式 99%。故意在這里使用 test(別名用法為 [...]) 以及反引號的命令替換,因為這是 expr 的傳統(tǒng)用法。
在新的代碼里,使用 shell 的內建算術替換應該會更好:
\#!/bin/bash
i=1
while ["$i" -le 5]
do
echo i is $i
i=$(($i+1))
done
echo $i
無論 expr 的價值如何,它支持 32 位的算術運算,也支持 64 位的算術運算----在很多系統(tǒng)上都可以,因此,幾乎不會有計數(shù)器溢出的問題。