我有一个脚本 print.sh:
#!/bin/bash
echo printing provided args:
for i in "$@"; do
echo -e "\t${i}"
done
如果我在提示符下执行此操作,a=$(. print.sh ); echo "${a}"
那么我将获得printing provided args:
存储的输出
我测试命令替换的主要脚本如下所示:
#!/bin/bash
function func_to_call_sub_scrp
{
# Call sub-script
capture="$(. $1 $2 $3)"
echo -e "captured output:
\t\t${capture}"
}
echo "Run function to call sub script without parameters passed. "
func_to_call_sub_scrp print.sh
echo ""
echo "Run function to call sub script with parameters passed."
func_to_call_sub_scrp print.sh xx yy
这输出:
Run function to call sub script without parameters passed.
captured output:
printing provided args:
print.sh
Run function to call sub script with parameters passed.
captured output:
printing provided args:
xx
yy
第二个调用将 xx 和 yy 发送到 print.sh,这与预期的一样。但是,当我发送“print.sh”“”“”命令替换调用 print.sh 并将它作为它的 $1 发送 print.sh 而不是发送它“”和“”
我的问题是,当没有其他输入时,如何将 $1 作为参数传递给打印脚本?我期望"$(. $1 $2 $3)"
成为"$(. print.sh )"
或"printing provided args:"
曾经返回。
请注意,您没有
. "print.sh" "" ""
在第一个示例中运行。您正在运行,. print.sh
因为您没有引用$2
或$3
.从
bash
手册中,关于source
(和.
),我强调:当您调用 时
. print.sh
,您不向 dot-script 提供参数,print.sh
因此位置参数不变。但它们是什么?点脚本中的位置参数将在第一次调用中成为您的函数的位置参数,它是由单个字符串组成的列表
print.sh
。这就是为什么"$@"
扩展print.sh
到点脚本内部的原因。只是评论:
使用制表符缩进输出所有位置参数的更好方法:
这避免了其他地方
echo
描述的问题。可以对您在函数中的输出方式做出类似的评论。$capture
您还需要引用, 和, 的扩展名
$1
,除非您希望外壳程序将它们拆分为字符并在结果单词上应用文件名通配符。请参阅何时需要双引号?.$2
$3
$IFS