Bash Shell丢弃参数

Bash Shell丢弃参数,所有的正式脚本可能都要有两种参数:修改脚本行为的选项以及要处理的真正参数。你需要用一种方法在处理完选项后将其丢弃。

例如,现在有如下脚本。

for FN in "$@"
do
    echo changing $FN
    chmod 0750 "$FN"
done

脚本内容非常简单,它会显示正在处理的文件名,然后修改文件权限。但有时你希望脚本静悄悄地工作,不要显示文件名。如何在保留 for 循环的同时添加一个能够关闭文件名显示的选项呢?

解决方案

用 shift 删除处理过的参数,如下例所示。

#!/usr/bin/env bash
# 实例文件:use_up_option
#
# 使用并丢弃一个选项
#
# 解析可选参数
VERBOSE=0
if [[ $1 = -v ]]
then
    VERBOSE=1
    shift
fi
#
# 实际工作如下
#
for FN in "$@"
do
    if (( VERBOSE == 1 ))
    then
        echo changing $FN
    fi
    chmod 0750 "$FN"
done

讨论

我们添加了标记变量 $VERBOSE,借此了解是否应该输出所处理的文件名。可是一旦 shell 脚本发现 -v 选项并设置好标记,我们就用不着参数列表中的 -v 了。shift 语句告诉 bash 将命令行参数挪动一个位置,使 $2 变成 $1$3 变成 $2,以此类推,这样就丢弃了第一个参数($1)。

如此一来,当 for 循环启动时,参数列表($@)中就再也没有 -v,剩下的是紧随其后的那些参数。

这种解析参数的方法在处理单个选项时完全没问题,但要想应对多个选项,那就得多花点心思了。按照惯例,shell 脚本的选项应该不区分位置,也就是说,myscript -a -p 应该等同于 myscript -p -a。而且,稳健的脚本还应该能处理重复选项,要么忽略,要么报错。

酷客网相关文章:

赞(0)

评论 抢沙发

评论前必须登录!