【问题标题】:BASH option overrides $2 Variable in Rename commandBASH 选项覆盖重命名命令中的 $2 变量
【发布时间】:2015-02-26 17:15:55
【问题描述】:

我正在尝试使该程序正常运行,但我做不到。我想在重命名命令中使用的 $2 变量采用 Select Opt 分配的内容。在 Select Opt 结构中,有什么方法可以在重命名命令中使用 $1、$2 变量?

OPTIONS="\"Quit\" \"Replace\""
echo $OPTIONS
eval set $OPTIONS

select opt in "$@"; do
    if [ "$opt" = "Quit" ]; then
       echo done
       exit
    elif [ "$opt" = "Replace" ]; then
       ls
       echo "old pattern"
       read OLD
       echo "new one"
       read NEW
       rename -n "s/($OLD)(.*)/$NEW$2/" *.jpg

最终结果在

rename -n "s/($OLD)(.*)/$NEW$2/" *.jpg

是 $NEW 和字符串“替换”而不是 (.*) 部分。

感谢您的帮助。

编辑:我已根据 skmrx 的建议修改了代码。现在结果不同了,$1, $2 是空的。重命名命令没有使用它们,代码仍然不起作用。

OPTIONS=("Quit" "Replace")
echo "${OPTIONS[@]}"

select opt in "${OPTIONS[@]}"; do
    if [[ "$opt" = "Quit" ]]; then
           echo done
           exit
    elif [[ "$opt" = "Replace" ]]; then
       ls
       echo "old pattern"
       read OLD
       echo "new one"
       read NEW
       rename -n "s/($OLD)(.*)/$NEW$2/" *.jpg
    else
       clear
       echo bad option
    fi
done

说明

rename -n "s/($OLD)(.*)/$NEW$2/" *.jpg

仅使用 $NEW 变量的内容执行,并且 $2 保持为空且没有文本。

【问题讨论】:

    标签: bash select rename options


    【解决方案1】:

    简而言之,eval set $OPTIONS 将覆盖您的 $1$2。在下一行尝试echo他们。

    现在,您可以通过以下方式改进脚本并使其更不容易出错:

    1. 使OPTIONS 成为一个数组:OPTIONS=("Quit" "Replace")。这将允许您在选项名称中保留空格,而无需转义双引号。要回显选项,您可以使用echo "${OPTIONS[@]}"
    2. 不需要eval set。这只会通过覆盖位置参数$1$2 等引起问题。
    3. select 中使用"${OPTIONS[@]}" 代替"$@" - 这是必要的,因为将不再使用set
    4. 使用[[..]] 而不是[..]。在第一种情况下出错的可能性较小。

    【讨论】:

    • 非常感谢您的 cmets。
    猜你喜欢
    • 2011-06-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-03
    • 1970-01-01
    • 2015-02-15
    相关资源
    最近更新 更多