我正在尝试编写一个函数来执行此操作:
$ 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