Bash Shell遍历传入脚本的参数,你想对指定的一系列参数执行某些操作。编写 shell 脚本,对单个参数进行处理不是什么问题,只需要用 $1
引用这个参数即可。但如果面对的是一大批文件呢?你可能想这样调用脚本。
./actall *.txt
shell 会进行模式匹配,生成匹配 *.txt
模式(以 .txt
结尾的文件名)的文件名列表。
解决方案
特殊的 shell 变量 $* 能够引用所有的参数,可以将其用于 for 循环,如例所示。
#!/usr/bin/env bash
# 实例文件:chmod_all.1
#
# 批量修改文件权限
#
for FN in $*
do
echo changing $FN
chmod 0750 $FN
done
讨论
变量 $FN
是我们自己挑选的;使用别的变量名也没有任何问题。$*
引用的是命令行上出现的所有参数。假如用户输入:
./actall abc.txt another.txt allmynotes.txt
调用该脚本时,$1
等于 abc.txt、$2
等于 another.txt、$3 等于 allmynotes.txt,而 $*
等于整个参数列表。换句话说,shell 替换 for 语句中的 $*
后,脚本就变成了如下这样:
for FN in abc.txt another.txt allmynotes.txt
do
echo changing $FN
chmod 0750 $FN
done
for 循环从列表中获取第一个值,并将其赋给变量 $FN
,然后执行 do 和 done 之间的语句。列表中的其他值会重复执行该过程。
别急,还没完!如果文件名中不包含空格,该脚本则万事大吉,但有时难免碰上带有空格的文件名。
酷客网相关文章:
评论前必须登录!
注册