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

BASH选项覆盖重命名命令中的$2变量,bash,select,rename,options,Bash,Select,Rename,Options,我正在努力让这个程序工作,但我做不到。我想在Rename命令中使用的$2变量接受Select Opt指定的内容。在Select Opt结构中,有没有办法在Rename命令中使用$1、$2变量 OPTIONS="\"Quit\" \"Replace\"" echo $OPTIONS eval set $OPTIONS select opt in "$@"; do if [ "$opt" = "Quit" ]; then echo done exit e

我正在努力让这个程序工作,但我做不到。我想在Rename命令中使用的$2变量接受Select Opt指定的内容。在Select Opt结构中,有没有办法在Rename命令中使用$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是空的。重命名命令没有使用它们,代码仍然无法工作

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

简而言之,
eval set$OPTIONS
将覆盖您的
$1
$2
。请尝试在下一行中回显它们

现在,以下是一些可以改进脚本并使其不易出错的方法:

  • 使
    OPTIONS
    成为一个数组:
    OPTIONS=(“退出”“替换”)
    。这将允许您在选项名称中保留空格,而无需费心转义双引号。要回显选项,可以使用
    echo“${options[@]}”
  • 无需
    评估设置
    。这只会因为覆盖位置参数
    $1
    $2
    等而导致问题
  • 选择中使用
    “${OPTIONS[@]}”
    而不是
    中的
    “$@”
    ——这是必要的,因为
    设置将不再使用
  • 使用
    […]]
    而不是
    […]
    。在第一种情况下犯错误的可能性较小

  • 非常感谢你的评论。