我正在尝试编写一个执行此操作的函数:
$ 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 有关((...))
。你怎么做呢?
错误在这里:
该
if
构造需要一个可以评估为真或假的表达式。因此,例如,命令 (if ls; then echo yes;fi
) 或测试构造。您想使用测试构造,但没有使用测试运算符 ([
),而是使用了括号。括号只是打开一个子shell。因此,该表达式
( a == "-u" )
仅表示“在子shell中运行a
带有参数==
的命令"-u"
。您想要的是:或者,如果您想使用在
[[ ]]
中工作的不可移植结构,则bash
需要在 : 之后有一个空格[[
:您尝试过
if [[a == "-u" ]]
使外壳程序[[a
作为单个命令读取并失败。最后,
(( ))
同样不可移植但在 bash(和其他一些 shell)中工作的构造用于算术评估。来自man bash
:所以这不是你想在这种情况下使用的东西。把所有这些放在一起,你想要这样的东西:
尝试使用官方语法并使用
[
....]
进行test
调用。( ... )
创建一个子外壳(( ))
是一个特定于 ksh 的内部算术表达式,它喜欢数字而不是-u