bash:如何在 select 中使用带引号的参数

bash:如何在 select 中使用带引号的参数

我从命令中获取一些参数,希望通过 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

相关内容