这里,主要通过该脚本来练习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