2013-11-20 72 views
2

我有一个奇怪的问题增加了一个bash变量,看起来 在我第一次尝试增量时不能破坏,我不能 固定下来,这里是我正在做的一个示例和调试输出, 任何人看到任何理由,这不应该工作?Bash增量破坏脚本

我目前GNU bash, version 4.2.45(1)-release (i686-pc-linux-gnu)

#!/bin/bash 
set -ex 
declare -i elem=0 
echo $elem # 0 
    ((elem++)) # breaks 
echo $elem # 1 but never encountered 
while IFS=$'\n' read -r line || [[ -n "$line" ]]; do 
    ((elem++)) 
    echo $elem 
done <"${1}" # foo\nbar\nbaz 

输出

./incr.sh test 
+ declare -i elem=0 
+ echo 0 
0 
+ (( elem++ )) 

最怪异的部分是整个程序的增量正确更改初始增量器来((elem+=1)) ,这似乎非常马车的眼球。 ..

#!/bin/bash 
set -ex 
declare -i elem=0 
echo $elem 
    ((elem+=1)) 
echo $elem 
while IFS=$'\n' read -r line || [[ -n "$line" ]]; do 
    ((elem++)) 
    echo $elem 
done <"${1}" # foo\nbar\nbaz 

输出

+ declare -i elem=0 
+ echo 0 
0 
+ (( elem+=1 )) 
+ echo 1 
1 
+ IFS=' 
' 
+ read -r line 
+ (( elem++ )) 
+ echo 2 
2 
+ IFS=' 
' 
+ read -r line 
+ (( elem++ )) 
+ echo 3 
3 
+ IFS=' 
' 
+ read -r line 
+ (( elem++ )) 
+ echo 4 
4 
+ IFS=' 
' 
+ read -r line 
+ [[ -n '' ]] 
+0

哪里是'文件名= test'来自哪里?我在脚本中没有看到。 – Barmar

+0

对不起,我改变了代码,只是使用'$ 1'作为输入文件,如果你再看看我改变了输入,sry我使用的是旧版本的输出 – ehime

+0

我无法复制它:http://ideone.com/ jm3CQR – Barmar

回答

3

set -e使任何命令返回失败时脚本退出。

((0)),等价地elem=0; ((elem++))返回失败。

因此,脚本退出。

如果set -e,并希望其运行状态,你不关心命令一下,你可以使用

((elem++)) || true 
+0

Awesome anwer,等待接受=)谢谢你,很棒的捕获,没有看到 – ehime

+0

+1很好的捕获 – anubhava

+0

为什么'((elem ++))'返回失败? – Barmar