鍍金池/ 教程/ Linux/ shell 學習三十六天---命令替換
shell 學習四十五天---xargs
shell學習第三天
shell 學習十五天---join 連接字段
shell 學習第二天
shell 學習四十三天---臨時性文件的建立與使用
shell 學習第六天---小結(jié)
shell 學習三十三天---關(guān)于重定向
shell 學習二十九天---循環(huán)
shell 學習二十四天---提取開頭或結(jié)尾數(shù)行
shell 學習第十天---sed 查找與替換
shell 學習第十一天---sed 正則的精確控制
shell 學習三十天---break,continue,shift,getopts
shell 學習---小結(jié)
shell 學習三十一天---函數(shù)問題
shell 學習第四天---華麗的 printf 輸出
shell 學習三十五天---波浪號展開與通配符
shell 學習十九天---文本塊排序
shell 學習十二天---行與字符串
shell 學習二十一天---重新格式化段落
shell 學習十八天---文本排序
shell 學習十三天---sed 案例分析
shell 學習四十一天---列出文件 ls 和 od 命令
shell 學習十七天---awk 命令
shell 學習三十六天---命令替換
shell 學習十六天---join 練習
shell 學習三十二天---read 讀取一行
shell 學習二十二天---計算行數(shù),字數(shù)以及字符數(shù)
shell 學習小總結(jié)---本章小結(jié)
shell 學習第八天---擴展正則表達式(ERE)
shell 學習四十二天---使用 touch 更新文件時間
shell 學習二十八天---case 語句
shell 學習三十九天---內(nèi)建命令
shell 學習第一天
shell 學習三十四天---printf 詳解
shell 學習二十六天---變量與算數(shù)
shell 學習三十八天---執(zhí)行順序和 eval
shell 學習四十四天---尋找文件
shell 學習二十五天---神器的管道符
shell 學習十四天---使用 cut 選定字段
shell 學習第五天---基本的I/O重定向
shell 學習四十天---awk 的驚人表現(xiàn)
shell 學習二十天---sort 的其他內(nèi)容以及 uniq 命令
shell 學習二十三天---打印
shell 學習第九天---分組
shell 學習四十八天---文件校驗和匹配
shell 學習二十七天---退出狀態(tài)和 if 語句
shell 學習四十七天---文件比較 cmp,diff,patch
shell 學習第七天---基礎(chǔ)正則表達式(BRE)
shell 學習四十六天---文件系統(tǒng)的空間信息 df 和 du 命令
shell 學習三十七天---引用
shell 學習小結(jié)

shell 學習三十六天---命令替換

命令替換是指 shell 可以先執(zhí)行命令,將輸出結(jié)果暫時保存,在適當?shù)牡胤捷敵?
命令替換的語法:
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í)行結(jié)果:

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 "$@"  

當調(diào)用這個腳本時,使用命令./head.sh -10 /etc/passwd調(diào)用這個腳本時,sed 最終是以 sed 10q /etc/passwd 被引用.

案例:發(fā)一封郵件信息給當前已登錄的所有用戶:
mail $(who | cut -d ' ' -f1)
使用 who 命令獲得當前在線用戶,使用 cut 獲得用戶的名稱,把括號內(nèi)命令生成的結(jié)果先執(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ù),計算它的值,然后
將結(jié)果寫入到標準輸出)–參數(shù)應用規(guī)則:
用空格隔開每個項;
用 / (反斜杠) 放在 shell 特定的字符前面;
對包含空格和其他特殊字符的字符串要用引號括起來
expr 主要用于 shell 的算術(shù)運算.expr 的語法很麻煩:運算數(shù)與運算符必須是單個的命令行參數(shù);因此建議在這里大量使用空格間隔它們.很多 expr 的運算符同時也是 shell 的 meta 字符,所以必須謹慎使用引號.
expr 被設(shè)置用在命令替換之內(nèi).這樣,它會通過打印的方式把值返回到標準輸出,而非通過使用退出碼(也就是 shell 內(nèi)的$?).

????????????expr運算符(優(yōu)先級由小至大)

表達式

意義

e1?|?e2

如果e1是非零值或非null,則使用它的值.否則如果e2是非零值或非null,則使用它的值.如果兩者都不是,則最后值為零

e1&e2

如果e1e2都非零值或非null,則返回e1的值.否則,最后值為零

e1=e2

等于

e1!=e2

不等于

e1<e2

小于

e1<=e2

小于或等于

e1>e2

大于

e1>=e2

大于或等于

以上這些運算符,如果指示的比較為真,則會使得expr顯示1,否則顯示0.如果兩個運算符都為整數(shù),則以數(shù)字方式比較;如果不是,則以字符串方式比較

e1+e2

e1e2的加和

e1-e2

e1e2的相減

e1*e2

e1e2的相乘

e1/e2

e1除以e2的整數(shù)結(jié)果(取整)

e1%e2

e1除以e2的整數(shù)結(jié)果(取余)

e1:e2

e1e2BRE匹配

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  

這類的算術(shù)運算,已經(jīng)給出了可能遇到的 expr 的使用方式 99%.故意在這里使用 test (別名用法為[...])以及反引號的命令替換,因為這是 expr 的傳統(tǒng)用法.
在新的代碼里,使用 shell 的內(nèi)建算術(shù)替換應該會更好:

 #!/bin/bash  
i=1  
while [ "$i" -le 5 ]  
do  
        echo i is $i  
        i=$(($i+1))  
done  
echo $i  

無論 expr 的價值如何,它支持 32 位的算術(shù)運算,也支持 64 位的算術(shù)運算----在很多系統(tǒng)上都可以,因此,幾乎不會有計數(shù)器溢出的問題.