本篇內(nèi)容均摘自《Linux命令行與shell腳本編程大全》琼掠,個(gè)人認(rèn)為需要重點(diǎn)學(xué)習(xí)的章節(jié)。【免費(fèi)】Linux命令行與Shell腳本編程大全 第3版 PDF全本 21MB 百度網(wǎng)盤下載 - 今夕是何夕 - 博客園
在shell腳本中眉枕,你可以對(duì)循環(huán)的輸出使用管道或進(jìn)行重定向。這可以通過在done命令之后添加一個(gè)處理命令來實(shí)現(xiàn)速挑。
for file in /home/rich/*
do
if [ -d "$file" ]
then
echo "$file is a directory"
elif
echo "$file is a file"
fi
done > output.txt
shell會(huì)將for命令的結(jié)果重定向到文件output.txt中,而不是顯示在屏幕上翅萤。
考慮下面將for命令的輸出重定向到文件的例子:
$ cat test23
#!/bin/bash
for (( a = 1; a < 10; a++ ))
do
echo "The number is $a"
done > test23.txt
echo "The command is finished."
$ ./test23
The command is finished.
$ cat test23.txt
The number is 1
The number is 2
The number is 3
The number is 4
The number is 5
The number is 6
The number is 7
The number is 8
The number is 9
shell創(chuàng)建了文件test23.txt并將for命令的輸出重定向到這個(gè)文件腊满。 shell在for命令之后正常顯示了echo語句。
這種方法同樣適用于將循環(huán)的結(jié)果管接給另一個(gè)命令:
$ cat test24
#!/bin/bash
for state in "North Dakota" Connecticut Illinois Alabama Tennessee
do
echo "$state is the next place to go"
done | sort
echo "This completes our travels"
$ ./test24
Alabama is the next place to go
Connecticut is the next place to go
Illinois is the next place to go
North Dakota is the next place to go
Tennessee is the next place to go
This completes our travels
state值并沒有在for命令列表中以特定次序列出碳蛋。 for命令的輸出傳給了sort命令,該命令會(huì)改變for命令輸出結(jié)果的順序玷室。運(yùn)行這個(gè)腳本實(shí)際上說明了結(jié)果已經(jīng)在腳本內(nèi)部排好序了。
查找可執(zhí)行文件
當(dāng)你從命令行中運(yùn)行一個(gè)程序的時(shí)候穷缤, Linux系統(tǒng)會(huì)搜索一系列目錄來查找對(duì)應(yīng)的文件箩兽。這些目錄被定義在環(huán)境變量PATH中。如果你想找出系統(tǒng)中有哪些可執(zhí)行文件可供使用汗贫,只需要掃描PATH環(huán)境變量中所有的目錄就行了。如果要徒手查找的話芳绩,就得花點(diǎn)時(shí)間了。不過我們可以編寫一個(gè)小小的腳本搪花,輕而易舉地搞定這件事。首先是創(chuàng)建一個(gè)for循環(huán)撮竿,對(duì)環(huán)境變量PATH中的目錄進(jìn)行迭代。處理的時(shí)候別忘了設(shè)置IFS分隔符幢踏。
IFS=:
for folder in $PATH
do
現(xiàn)在你已經(jīng)將各個(gè)目錄存放在了變量folder中,可以使用另一個(gè)for循環(huán)來迭代特定目錄中的所有文件僚匆。
for file in $folder/*
do
最后一步是檢查各個(gè)文件是否具有可執(zhí)行權(quán)限,你可以使用if-then測(cè)試功能來實(shí)現(xiàn)咧擂。
if [ -x $file ]
then
echo " $file"
fi
將這些代碼片段組合成腳本就行了檀蹋。
$ cat test25
#!/bin/bash
# finding files in the PATH
IFS=:
for folder in $PATH
do
echo "$folder:"
for file in $folder/*
do
if [ -x $file ]
then
echo " $file"
fi
done
done
運(yùn)行這段代碼時(shí),你會(huì)得到一個(gè)可以在命令行中使用的可執(zhí)行文件的列表俯逾。
$ ./test25 | more
/usr/local/bin:
/usr/bin:
/usr/bin/Mail
/usr/bin/Thunar
/usr/bin/X
/usr/bin/Xorg
/usr/bin/[
/usr/bin/a2p
/usr/bin/abiword
/usr/bin/ac
/usr/bin/activation-client
/usr/bin/addr2line
輸出顯示了在環(huán)境變量PATH所包含的所有目錄中找到的全部可執(zhí)行文件。