簡體   English   中英

遞增變量會觸發bash 4中的EXIT,但不會觸發bash 3中的EXIT

[英]Incrementing a variable triggers EXIT in bash 4, but not in bash 3

考慮這個(示例性)bash腳本:

#!/bin/bash -e
errorExit() {
    echo "" >&2
    echo "ERROR (${var_scriptfilename}):" >&2
    echo "An unhandled error occurred." >&2
    intentionalExit 1
}
intentionalExit () {
    trap - EXIT # Unregister the EXIT trap
    exit $1
}
trap errorExit EXIT # Trap script errors
var_scriptfilename="$(basename "$0")"
# ==== START OF TEST ====
var_counter=0
((var_counter++))
echo "var_counter is $var_counter" >&2
# ===== END OF TEST =====
intentionalExit 0

如果我在Cygwin的bash中運行它會產生預期的輸出:

var_counter is 1

但是,如果我在我的Debian Squeeze盒子上運行它,這是它的預定目的地,我最終進入了EXIT陷阱:

ERROR (test.increment.sh):
An unhandled error occurred.

...這是為什么?

如果我刪除了-e選項,它在兩個系統上都按預期工作,但顯然我想保持-e使用。

稍微繁瑣的“通用”變體var_counter=$(($var_counter+1)) ,在兩個shell上都設置了-e,但我更喜歡使用第一個符號(或類似的東西),因為它清楚在閱讀代碼時伸出作為增量操作。

bash --version在Cygwin bash上的bash --version說:

GNU bash, version 3.2.51(24)-release (i686-pc-cygwin)
Copyright (C) 2007 Free Software Foundation, Inc.

在Debian上,它是:

GNU bash, Version 4.1.5(1)-release (x86_64-pc-linux-gnu)
Copyright (C) 2009 Free Software Foundation, Inc.

我很感興趣為什么會這樣。 有人知道這種行為的原因嗎?

另外,是否有人知道在bash中增加變量的類似方法我可以使用?

來自Debian的bash4手冊頁:

((expression))
    The expression is evaluated according  to  the  rules  described
    below  under ARITHMETIC EVALUATION.  If the value of the expres‐
    sion is non-zero, the return status is 0; otherwise  the  return
    status is 1.  This is exactly equivalent to let "expression".

並且 ...

-e      Exit  immediately  if a pipeline (which may consist of a
        single simple command),  a subshell command enclosed  in
        parentheses,  or one of the commands executed as part of
        a command list enclosed by  braces  (see  SHELL  GRAMMAR
        above) exits with a non-zero status.

所以正在發生的是((var++)) var從0增加到1並返回0,導致整個表達式返回非零,從而觸發errexit

現在來看兩個不同的bash版本之間的區別:這個改變((行為似乎發生在4.0和4.1之間。在4.0中((顯然沒有觸發errexit。有關詳細信息,請參閱此NEWS文件。你必須滾動從源代碼發布的更改日志似乎證實了這一點。

如果您只想在不使用退出狀態的情況下增加變量,則有多種方法可以執行此操作。 也許其他人可以給出最好的建議,但有些可能性是:

  • var="$((var+1))" ,便攜式POSIX sh方法
  • ((var++)) || true ((var++)) || true ,強制語句始終具有零退出狀態(僅限bash)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM