Chr*_*sNY 3 parameters bash shell parameter-expansion
并不重要 - 但我正在尝试更深入地了解 bash 脚本,这让我发疯!
我的目标 - 在 bash 脚本中:
如果 $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[@]}可确保数组的每个元素都被引用,从而保留空格。
| 归档时间: |
|
| 查看次数: |
359 次 |
| 最近记录: |