我正在尝试使这个程序工作,我不能。我想在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保持为空且没有文本。
答案 0 :(得分:0)
简而言之,eval set $OPTIONS
会覆盖您的$1
和$2
。在下一行中尝试echo
。
现在,您可以通过以下方式改进脚本并减少错误:
OPTIONS
成为一个数组:OPTIONS=("Quit" "Replace")
。这将允许您在选项名称中保留空格,而无需转义双引号。要回应这些选项,您可以使用echo "${OPTIONS[@]}"
。eval set
。这只会通过覆盖位置参数$1
,$2
等来导致问题。"${OPTIONS[@]}"
中使用"$@"
代替select
- 这将变得必要,因为将不再使用set
。[[..]]
代替[..]
。在第一种情况下犯错的可能性较小。