Bash 函数 if then 返回命令未找到

Bash 函数 if then 返回命令未找到

我正在尝试编写一个函数来执行此操作:

$ test-function -u {local-path} {destination}

如果第一个参数是-u,则执行一个函数,该函数将接下来的 2 个参数作为要上传/复制/rsync 的文件的路径和目标。

$ test-function -d {local-path} {destination}

如果第一个参数不是-u(或者是-d),则执行一个函数,该函数将接下来的 2 个参数作为要下载/复制/rsync 的文件的路径(假设我位于当前文件夹)和目的地。

我找到了建议解决方案的答案这里这里。但是,我的函数返回.bash_profile如下错误:

function test_func {
    local a="$1"
    local a="$2"

    if ( a == "-u" ); then
        echo "This means upload"
    else
        echo "This means download"
    fi
}

alias test-function="test_func"

然后:

$ test-function -u
-bash: a: command not found
This means download
$ test-function -d
-bash: a: command not found
This means download

如果我将代码更改为:

if [[a == "-u"]]; then
...

有时候是这样的:

$ test-function -u
-bash: [[a: command not found
This means download

如果我根据我找到的答案之一更改代码:

if ((a == "-u")); then
...

有时候是这样的:

line 53: syntax error near unexpected token `}'

我猜这个错误与 double 有关((...))。你怎么做呢?

答案1

错误在这里:

if ( a == "-u" ); then
    echo "This means upload"
else
    echo "This means download"
fi

if构造需要一个可以计算为 true 或 false 的表达式。例如,命令 ( if ls; then echo yes;fi) 或测试结构。您想要使用测试构造,但没有使用测试运算符 ( [),而是使用括号。

括号只是打开一个子shell。因此,该表达式仅表示“在子 shell 中使用参数( a == "-u" )运行命令。您想要的是:a=="-u"

if [ "$a" = "-u" ]; then  ## you also need the $ here
    echo "This means upload"
else
    echo "This means download"
fi

[[ ]]或者,如果您想使用在 中工作的不可移植构造bash,则需要在 后加一个空格[[

if [[ "$a" == "-u" ]]; then
    echo "This means upload"
else
    echo "This means download"
fi

您尝试if [[a == "-u" ]]将 shell 读取[[a为单个命令,但失败了。

最后,该(( ))结构同样不可移植,但可以在 bash(和其他一些 shell)中工作,用于算术评估。从man bash

  ((expression))
          The  expression is evaluated according to the rules described below under
          ARITHMETIC EVALUATION.  If the value of the expression is  non-zero,  the
          return  status  is  0; otherwise the return status is 1.  This is exactly
          equivalent to let "expression".

所以这不是你想在这种情况下使用的东西。把所有这些放在一起,你想要这样的东西:

function test_func {
    local a="$1"

    if [ "$a" = "-u" ]; then
        echo "This means upload"
    else
        echo "This means download"
    fi
}

alias test-function="test_func"

答案2

尝试使用官方语法并使用[....]进行test调用。

  • ( ... )创建一个子 shell

  • (( ))是 ksh 特定的内部算术表达式,喜欢数字而不是-u

相关内容