解析嵌套参数

解析嵌套参数

我无法正确解析脚本的参数。下面解释该场景。

第一个脚本(test2.sh):

#! /bin/sh
arg_part1="./test1.sh '123 789'"
arg_part2=456

#Option 1
${arg_part1} ${arg_part2} 

#Option 2
$("$arg_part1" arg_part2)

第二个脚本(test1.sh):

#! /bin/sh
echo "Hello World $1 $2"

输出:

Hello World '123 789'
./test1.sh '123 789': No such file or directory

期望的输出:

Hello World 123 789 456

“123 789”应该作为第一个参数处理,456应该是我的第二个参数。笔记:我无法选择将 arg_part1 分解为两个不同的变量。

答案1

您可以继续使用 split+glob 运算符(那些未加引号的${arg_part1}${arg_part2}),但对分割部分使用不同的分隔符(因为某些元素包含默认分隔符(空格)之一)。您还想禁用 glob 部分。

#! /bin/sh -
arg_part1='./test1.sh|123 789'
arg_part2=456

IFS='|'  # split unquoted expansions on | instead of default SPC+TAB+NL
set -o noglob # disable the glob part (not that it would have any effect
              # in this particular case).

$arg_part1 $arg_part2 # invoke split+glob

# or since you're not intending to split $arg_part2
$arg_part1 "$arg_part2"

对于存储代码,函数通常比变量更合适:

arg_part1() { ./test1.sh '123 789' "$@"; }
arg_part2=456

arg_part1 "$arg_part2"

并且您不必搞乱 split+glob 运算符,或使用危险的eval.

答案2

我认为您“卡住”了,需要在这里使用eval,以便 arg_part1 被重新解释为命令字符串,然后将其解析为命令和参数:

#! /bin/sh
arg_part1="./test1.sh '123 789'"
arg_part2=456
eval "${arg_part1}" "${arg_part2}"

输出:

Hello World 123 789 456

调试输出:

$ sh -x test2.sh
+ arg_part1='./test1.sh '\''123 789'\'''
+ arg_part2=456
+ eval './test1.sh '\''123 789'\''' 456
++ ./test1.sh '123 789' 456
Hello World 123 789 456

请注意,由于您已内部引用'123 789',因此它们显示为 test1.sh 的单个$1参数。

相关内容