【发布时间】:2019-09-09 15:14:10
【问题描述】:
我有一个脚本,当直接调用它时,可以使用以下参数组合正常工作:
--path=/path/to/a\ folder\ with\ spaces
--path='/path/to/a folder with spaces'
--path="/path/to/a folder with spaces"
但我在将参数从帮助脚本传递给它时遇到了困难。
我已经尝试了很多东西,但在每种情况下,我的脚本都收到以下内容:--path=/path/to/a folder with spaces 这使我的脚本感到困惑,并且好像/path/to/a 是路径(即 --path 的参数)和 @ 987654326@ with spaces 是附加参数。
作为一个最小示例,以下都不会产生所需的结果(将以下内容保存到所需的工作目录中,为 ./so_example.sh 和 chmod +x ./so_example.sh):
#!/usr/bin/env bash
set -x
printf "%s\n" "$@"
echo "$@"
echo -e "$@"
printf "%s\n" $@
echo $@
echo -e $@
当以下列方式调用时:
./so_example.sh --path=/path/to/a\ folder\ with\ spaces
./so_example.sh --path='/path/to/a folder with spaces'
./so_example.sh --path="/path/to/a folder with spaces"
我得到以下输出:
+ printf '%s\n' '--path=/path/to/a folder with spaces'
--path=/path/to/a folder with spaces
+ echo '--path=/path/to/a folder with spaces'
--path=/path/to/a folder with spaces
+ echo -e '--path=/path/to/a folder with spaces'
--path=/path/to/a folder with spaces
+ printf '%s\n' --path=/path/to/a folder with spaces
--path=/path/to/a
folder
with
spaces
+ echo --path=/path/to/a folder with spaces
--path=/path/to/a folder with spaces
+ echo -e --path=/path/to/a folder with spaces
--path=/path/to/a folder with spaces
我希望得到以下输出之一以获得正确的解决方案:
--path=/path/to/a\ folder\ with\ spaces`
--path='/path/to/a folder with spaces'`
--path="/path/to/a folder with spaces"`
【问题讨论】:
-
我确实花了一些时间在 Stackoverflow 上寻找答案。我的搜索词肯定是不充分的,因为直到现在我才找到stackoverflow.com/questions/21820240/…,我认为它描述了我面临的问题。
-
在
"$@"两边加上双引号,但您可能会发现"$*"更合适,请参阅unix.stackexchange.com/questions/41571/… -
我确实演示了在问题中使用双引号,但这不起作用。不过,
printf "%q\n" "$@"确实以合适的方式打印出来。我真正的问题一定与此无关,但现在我至少有更好的调试方法。 -
我不确定问题是什么;如果引用参数扩展,则保留给定值。但是,用于创建值的引用不是。 (因为您的脚本从未看到该字符串;它在调用脚本之前由 调用者 进行评估。)如果您在将此类参数传递给帮助脚本时遇到问题,您可能在应该使用数组的地方使用常规变量。其他语言不存在类似问题,因为它们不依赖参数扩展。
-
我认为我在脚本的错误区域发现了问题。道歉。我有更好的方法来准确调试内部脚本现在看到的内容。
标签: linux bash shell parameter-passing