Bash Shell遍历传入脚本的参数

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 之间的语句。列表中的其他值会重复执行该过程。

别急,还没完!如果文件名中不包含空格,该脚本则万事大吉,但有时难免碰上带有空格的文件名。

酷客网相关文章:

赞(0)

评论 抢沙发

评论前必须登录!