是否可以为 zsh 中的位置参数分配整数值?

是否可以为 zsh 中的位置参数分配整数值?

我正在阅读 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

相关内容