【问题标题】:Shell variable expansion: Storing multiple command arguments that include spaces in one variableShell 变量扩展:在一个变量中存储多个包含空格的命令参数
【发布时间】:2021-09-15 22:57:35
【问题描述】:

我正在编写一个 shell 脚本来驱动 xcodebuild,即 Xcode 命令行前端。

xcodebuild 通过以下方式在命令行上进行构建设置:

$ xcodebuild a=value b=value

value 可能包含空格,例如它可能是路径列表。

所以我会这样调用它:

$ xcodebuild "a=value1 value2 value3" "b=value4 value5"

xcodebuild 将按预期报告设置:

Build settings from command line:
    a = value1 value2 value3
    b = value4 value5

但是当如下调用时:

$ xcodebuild "a=value1 b=value2"

这将被解释为单个参数,为构建设置分配一个值:

Build settings from command line:
    a = value1 b=value2

现在,真正的问题是我想编写一个 shell 脚本,它将所有构建设置都放在一个变量中,例如我可以这样做:

SETTING_A="a=value1 value2 value3"
SETTING_B="b=value4 value5"

xcodebuild "${SETTING_A}" "${SETTING_B}"

但是这并不能扩展。

我想做这样的事情:

SETTING_A="a=value1 value2 value3"
SETTING_B="b=value4 value5"
SETTINGS=${SETTING_A} ${SETTING_B}

xcodebuild ${SETTINGS}

但是上述方法不起作用,无论我尝试了何种变体,我都不能将 SETTING_A 和 SETTING_B 作为命令的两个单独的单词/参数。如果我使用 "$SETTINGS",则为 1;如果我仅使用 $SETTINGS,则为 5。

我正在寻找标准的 unix shell 解决方案,但如果这在标准 sh 中不可行,我会接受 Bash 或 Zsh 特定的解决方案。

【问题讨论】:

标签: sh


【解决方案1】:

使用标准 sh (POSIX),只需在单个设置扩展上使用 set 并调用 "$@" 传递它们,即

SETTING_A="a=value1 value2 value3"
SETTING_B="b=value4 value5"

set -- "${SETTING_A}" "${SETTING_B}"
xcodebuild "$@"

【讨论】:

  • 这行得通,但不是真的。当脚本多次调用具有相同设置的 xcodebuild 时,它不会扩展。而且我认为我不能为整个脚本占用 $@ 。如果set 命令的结果会影响SETTINGS 变量,而不是特殊的@ 变量,那就太好了。
  • @Droopycom:如果你想采用没有数组的解决方案,位置参数是 $@ 的方式。你为什么说而且我不认为我可以为整个脚本占用$@。。您可以随时使用所需的设置值重新set-ting $@ 任意次数来自定义您的设置
  • 嗯,脚本很复杂,一开始就定义了SETTINGS,但实际上定义了不止一个,每个平台一个。然后它们会在以后多次使用。例如,我可能有 SETTINGS_IOS 和 SETTINGS_MACOS。所以如果只有一个 $@ 可以使用,我有点卡住了。我还可以想象脚本的其他部分想要对不同的命令执行相同的技巧并重新定义 $@
  • 这一切都归结为使用 sh 仅功能或使用数组的其他 shell 功能的可能性
猜你喜欢
  • 1970-01-01
  • 2017-03-23
  • 2017-01-27
  • 2018-08-22
  • 2016-10-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-12-25
相关资源
最近更新 更多