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",这根本不是您想要的。

颠倒函数和调用的顺序并修复变量引用,您应该会看到预期的结果。

你有很多问题:

  1. [=12=] 不是函数的第一个参数; </code> 是。 <code>[=12=]是当前脚本的名称。
  2. 您必须引用参数扩展以防止它们在嵌入的空格上被拆分成多个单词。
  3. 函数必须在使用前定义。

正确的脚本是

#!/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。)