我从命令中获取一些参数,希望通过 shell 脚本中 bash 的 select 语句将这些参数提供给用户。命令提供的参数可能包含空格,因此需要用引号保护。下面是一个简单的示例。
这按预期工作:
select opt in a b "c d"
do
echo $opt
break
done
输出符合预期:
1) a
2) b
3) c d
#?
但是,由于命令的输出位于变量中,因此它无法按预期工作:
opts="a b \"c d\""
select opt in $opts
do
echo $opt
break
done
尽管 $opts 包含与第一个选择示例中的硬编码类型相同的内容,但输出却不同:
1) a
2) b
3) "c
4) d"
#?
因此,并不是 bash 消耗了引号。它们被保留了下来,但引号并不像我硬编码时那样封装参数。正如我已经写过的,我将参数作为命令的输出。它们可能包含空格,因此已经受到引号的保护。我如何将它们完整地放入“select”语句中?这与单引号和双引号无关。使用单引号时也会发生同样的情况:
1) a
2) b
3) 'c
4) d'
#?
答案1
该解决方案应该可以帮助您:
#!/bin/bash
opts=(a b "c d");
select opt in "${opts[@]}"
do echo $opt;
break;
done
答案2
使用数组:
opts=("a" "b" "c d");select opt in "${opts[@]}"; do echo $opt; break; done