這里,主要通過該腳本來練習Shell函數的寫法,其功能主要是用來遞歸地遍歷Unix目錄,列出其中的文件和目錄,并且能夠通過縮進來展示文件的目錄層級關系。
tree.sh:
function listFiles()
{
#1st param, the dir name
#2nd param, the aligning space
for file in `ls $1`;
do
if [ -d "$1/$file" ]; then
echo "$2$file"
listFiles "$1/$file" " $2"
else
echo "$2$file"
fi
done
}
listFiles $1 ""
通過該腳本主要掌握下面幾點:
-
Shell腳本中定義函數的方法。
注意,在訪問函數參數時的方法。
$n
的含義是取第n個參數。 -
Shell腳本中雙引號的作用。
命令行中的字符可以分為兩類:文本字符(literal)和元字符(meta)。 literal也就是普通純文字,對 shell 來說沒特殊功能;meta對shell來說,具有特定功能的特殊保留字符。
最常見的保留字符有兩個:
IFS
由<space>
或<tab>
或<enter>
三者之一組成(我們常用space
),IFS
是用來拆解 command line的每一個詞(word)用的,因為shell command line是 按詞來處理的;CR
則是用來結束command line用的,這也是為何我們敲<enter>
命令就會跑的原因。有時候,我們希望shell將meta字符作為普通的literal字符處理,也求是去掉原有的shell保留字符的語義,僅僅作為一個文本字符處理。這時候就需要對這些字符進行
quoting
處理。常用的 quoting 有如下三種方法:hard quote,' ' (單引號),凡在hard quote中的所有meta均被關閉;soft quote," " (雙引號),在 soft quoe 中大部份meta都會被關閉,但某
些則保留(如$);escape,\ (反斜線),只有緊接在escape(跳脫字符)之后的單一meta才被關閉。
運行效果:
$ sh tree.sh .
test
a.txt
b.txt
good
game
of
thrones
hah.txt
tree.sh