如何在没有eval的情况下将包含引号的参数字符串传递给命令

时间:2018-06-12 00:12:05

标签: shell sh

在这种情况下,我将使用对话框或whiptail。

我想要做的命令就像这样

whiptail --radiolist 'Example Prompt' 24 80 16 ???

现在,对于???,这是"OPTION" "Description of option" Off|On

形式的一系列选项

所以我正在尝试构建一个看起来像是字符串的字符串(提前) "Option 1" "Description 1" Off "Option 2" "Description 2" Off "Option 3" "Description 3" Off 等等。

我如何传递包括引号?

我尝试过的东西不起作用:

whiptail --radiolist 'Example Prompt' 24 80 16 ${varWithOptions}
whiptail --radiolist 'Example Prompt' 24 80 16 "${varWithOptions}"

我尝试过DID的工作:

eval "whiptail --radiolist 'Example Prompt' 24 80 16 ${varWithOptions}"

如果可能的话,我想避免评估。有没有办法这样做呢? (除了调用外部命令,我想保持POSIX ,并避免任何基本命令或类似。)

我想强调我正在使用的字符串"Option 1" "Description 1" Off "Option 2" "Description 2" Off "Option 3" "Description 3" Off WILL 在一个变量中,因为它是在脚本执行期间生成的,所以任何要求我拥有它的东西字符串硬编码作为命令的一部分将无法工作。

1 个答案:

答案 0 :(得分:2)

当引用变量eval时,没有Option 1 Description 1 Off Option 2 Description 2 Off Option 3 Description 3的内容会传递一长串文字"${varWithOptions}"。如果没有引号,变量就会受到分词的影响。

您需要的是一系列单词,其中“选项1”是其中一个数组成员。要创建数组变量,您只需要将单词括起来。

varWithOptions=("Option 1" "Description 1" Off "Option 2" "Description 2" Off "Option 3" "Description 3" Off)

然后,您可以在适当的引用中使用它。

whiptail --radiolist 'Example Prompt' 24 80 16 "${varWithOptions[@]}"

免责声明 :这不适用于POSIX shell。如果您仍然需要POSIX,这是最简单的方法,假设您没有使用参数,或者您已经使用了任何参数。

set -- "Option 1" "Description 1" Off "Option 2" "Description 2" Off "Option 3" "Description 3" Off

这会有效地将$1设置为$9。然后你可以运行

whiptail --radiolist 'Example Prompt' 24 80 16 "$@"