使用空格扩展 bash 变量作为脚本中 bash 函数的参数

Chr*_*sNY 3 parameters bash shell parameter-expansion

并不重要 - 但我正在尝试更深入地了解 bash 脚本,这让我发疯!

我的目标 - 在 bash 脚本中:

  • 定义一个接受参数的函数
  • 使用函数名称和参数设置 bash 变量 (CMD)
  • 通过$CMD执行

如果 $args 中没有空格,没问题 - 但这里有一个最小的脚本来说明:

#!/bin/bash
function tstArgs () {
    echo "In tstArgs: ArgCnt:$#; Arg1:[$1]; Arg2:[$2]"
}
ARG1=today
ARG2=tomorrow
CMD1="tstArgs $ARG1 $ARG2"
$CMD1 #Output - As Desired: In tstArgs: ArgCnt:2; Arg1:[today]; Arg2:[tomorrow]

ARGWS1="'today with spaces'"
ARGWS2="'tomorrow with spaces'"
CMD2="tstArgs $ARGWS1 $ARGWS2"
$CMD2 #Output: In tstArgs: ArgCnt:6; Arg1:[today]; Arg2:[with]

#The dream:
ARGARR=($ARGWS1 $ARGWS2)
CMD3="tstArgs ${ARGARR[@]}"
$CMD3 #Output: In tstArgs: ArgCnt:6; Arg1:[today]; Arg2:[with]
#ETC, ETC, ETC...
Run Code Online (Sandbox Code Playgroud)

这并没有显示我尝试过的无数变体 - 单引号、双引号、转义引号、更改 IFS、使用参数转义运算符${ARG1@Q}、设置 args w。echo XXX- 还有更多 - 太多了,无法在此包含,但要明确的是,我并不是在没有先花几个小时的情况下就跳上 stackoverflow。

奇怪的是,我可以使用参数 w。如果我直接调用该函数,则为空格:

tstArgs $ARG1 $ARG2
#But no variation of anything like:
CMD="tstArgs $ARG1 $ARG2"
$CMD
Run Code Online (Sandbox Code Playgroud)

我确信这一定是可能的,而且可能很简单——但这是我无法破解的一些排列。

当然,我可以解决这个问题 - 但我很顽固,坚持不懈,不愿意放弃。如果有人有任何见解,我将非常感激,甚至可能终于可以睡个好觉了......

小智 5

不要将参数放入字符串中。将它们放入一个数组中。数组元素可以更优雅地处理空格:

declare -a ARGS
ARGS+=( "today with spaces" )
ARGS+=( "tomorrow with spaces" )
CMD="tstArgs"
${CMD} "${ARGS[@]}"
Run Code Online (Sandbox Code Playgroud)

或者:

declare -a ARGS
ARGS[0]="today with spaces"
ARGS[1]="tomorrow with spaces"
CMD="tstArgs"
${CMD} "${ARGS[@]}"
Run Code Online (Sandbox Code Playgroud)

在最后一行加上引号${ARGS[@]}可确保数组的每个元素都被引用,从而保留空格。