Bash 函数参数未按预期传递
Bash function arguments not passed as expected
我的脚本出现意外行为:
#!/bin/bash
checkFolders "first folder"
checkFolders() {
checkEmptyVar "folder to be copied"
}
checkEmptyVar() {
echo "0: [=11=] 1: 2: "
[[ $(isNotEmpty ) = false ]] && (echo "Specify a path for ") && exit
echo "post exit"
}
函数 checkEmptyVar 回显以下内容:
0: ./lcp.sh 1: folder to be copied 2:
我本以为 checkEmptyVar
的
已经超过了 "folder-to-be-copied",发生了什么事?
此脚本未按照您的想法运行。您的函数定义发生得太晚了。
当您在第一行调用 checkFolders
时,您是从预先存在的环境中调用该函数的一个版本,而不是稍后在该脚本中定义的版本。
如果你从 shell 运行 command -V checkFolders
你正在 运行 宁这个脚本我希望你会得到类似的输出:
checkFolders is a function
checkFolder ()
{
checkEmptyVar "folder to be copied"
}
虽然一切皆有可能。
您还应该始终在使用变量时引用变量以防止shell分词其内容。
当您调用 checkFolders "first folder"
时不这样做,最终会调用 checkFolders first folder "folder to be copied"
,这根本不是您想要的。
颠倒函数和调用的顺序并修复变量引用,您应该会看到预期的结果。
你有很多问题:
[=12=]
不是函数的第一个参数; </code> 是。 <code>[=12=]
是当前脚本的名称。
- 您必须引用参数扩展以防止它们在嵌入的空格上被拆分成多个单词。
- 函数必须在使用前定义。
正确的脚本是
#!/bin/bash
checkFolders() {
checkEmptyVar "" "folder to be copied"
}
checkEmptyVar() {
[[ $(isNotEmpty "") = false ]] && echo "Specify a path for " && exit
echo "post exit"
}
checkFolders "first folder"
此外,最好让isNotEmpty
return一个非零值而不是输出字符串false
,这样你就可以写
checkEmptyVar () {
if isNotEmpty ""; then
echo "Specify a path for " >&2 # Use standard error, not standard output
exit 1
fi
echo "post exit"
}
(我怀疑你可以用 [[ -n ]]
替换 isNotEmpty
。)
我的脚本出现意外行为:
#!/bin/bash
checkFolders "first folder"
checkFolders() {
checkEmptyVar "folder to be copied"
}
checkEmptyVar() {
echo "0: [=11=] 1: 2: "
[[ $(isNotEmpty ) = false ]] && (echo "Specify a path for ") && exit
echo "post exit"
}
函数 checkEmptyVar 回显以下内容:
0: ./lcp.sh 1: folder to be copied 2:
我本以为 checkEmptyVar
的 已经超过了 "folder-to-be-copied",发生了什么事?
此脚本未按照您的想法运行。您的函数定义发生得太晚了。
当您在第一行调用 checkFolders
时,您是从预先存在的环境中调用该函数的一个版本,而不是稍后在该脚本中定义的版本。
如果你从 shell 运行 command -V checkFolders
你正在 运行 宁这个脚本我希望你会得到类似的输出:
checkFolders is a function
checkFolder ()
{
checkEmptyVar "folder to be copied"
}
虽然一切皆有可能。
您还应该始终在使用变量时引用变量以防止shell分词其内容。
当您调用 checkFolders "first folder"
时不这样做,最终会调用 checkFolders first folder "folder to be copied"
,这根本不是您想要的。
颠倒函数和调用的顺序并修复变量引用,您应该会看到预期的结果。
你有很多问题:
[=12=]
不是函数的第一个参数;</code> 是。 <code>[=12=]
是当前脚本的名称。- 您必须引用参数扩展以防止它们在嵌入的空格上被拆分成多个单词。
- 函数必须在使用前定义。
正确的脚本是
#!/bin/bash
checkFolders() {
checkEmptyVar "" "folder to be copied"
}
checkEmptyVar() {
[[ $(isNotEmpty "") = false ]] && echo "Specify a path for " && exit
echo "post exit"
}
checkFolders "first folder"
此外,最好让isNotEmpty
return一个非零值而不是输出字符串false
,这样你就可以写
checkEmptyVar () {
if isNotEmpty ""; then
echo "Specify a path for " >&2 # Use standard error, not standard output
exit 1
fi
echo "post exit"
}
(我怀疑你可以用 [[ -n ]]
替换 isNotEmpty
。)