我正在阅读 zsh 的手册,我知道我可以通过以下方式将整数值分配给参数:
(( val = 1 ))
如果我正在调用一个脚本,并且我的第一个参数是一个整数./scirpt.zsh $((val))
,例如 ,我如何在我的脚本中引用它来执行一些算术过程,例如重新分配、比较等?我希望代码如下:
#!/bin/zsh
(( {1} = $1++ ))
答案1
在zsh中,数组变量argv
是访问位置参数的另一种方法。所以:
((argv[1]++))
答案2
来补充@吉尔斯的回答,您还可以为位置参数赋值外部例如,算术表达式1=value
,因此这里要增加第一个位置参数,您也可以这样做:
1=$(($1 + 1))
但严格来说,如果$1
可能包含任意算术表达式,而不仅仅是文字数字常量(例如a=++x
),则需要1=$((($1) + 1))
两者相等。比较:
$ x=4 zsh -c '((argv[1]++)); echo "$1 $a $x"' zsh a=++x
6 5 5
$ x=4 zsh -c '1=$(($1 + 1)); echo "$1 $a $x"' zsh a=++x
6 6 5
$ x=4 zsh -c '1=$((($1) + 1)); echo "$1 $a $x"' zsh a=++x
6 5 5
$var
这是使用而不是var
内部算术表达式的常见问题之一。有了$1
,你显然不能用1
,但是有了zsh
,你就可以用了argv[1]
。
除了这些复杂的案例之外,这个问题还体现在现实生活中的案例中,例如:
$ zsh -c 'echo $((1-$1))' zsh -3
zsh:1: bad math expression: operator expected at `3'
因为这成为运算符1--3
的错误用法--
。您可以使用以下任一方法来解决它:
$ zsh -c 'echo $((1 - $1))' zsh -3
4
$ zsh -c 'echo $((1-($1)))' zsh -3
4
$ zsh -c 'echo $((1-argv[1]))' zsh -3
4
(尽管如此,第一个会对像这样的值给出不同的结果1 + 1
)。
1如果我们忽略在解析为 0((argv[1]++))
时返回非零退出状态的事实$1