BASH选项在重命名命令中覆盖$ 2变量

时间:2015-02-26 17:15:56

标签: bash select rename options

我正在尝试使这个程序工作,我不能。我想在Rename命令中使用的$ 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,字符串“Replace”而不是(。*)部分。

感谢您的帮助。

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

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保持为空且没有文本。

1 个答案:

答案 0 :(得分:0)

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

现在,您可以通过以下方式改进脚本并减少错误:

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