2017-08-01 82 views
0

我不是bash專家,無法真正描述我的問題。這就是爲什麼我會告訴你我的腳本:bash try/catch行爲bash -ex << EOF ... EOF或Here文檔和變量擴展

#!/bin/bash -x 
bash -ex << TRY 
    VAR1="123" 
    echo "$VAR1" 
TRY 
echo "exit code: $?" 

當我運行該腳本,它產生以下輸出:

+ bash -ex 
+ VAR1=123 
+ echo '' 

+ echo 'exit code: 0' 
exit code: 0 

我的問題:爲什麼變量VAR1沒有echo命令分配?我希望下面的輸出:

+ bash -ex 
+ VAR1=123 
+ echo '' 
123 
+ echo 'exit code: 0' 
exit code: 0 
+0

這不是真正的異常處理。這只是一個單獨的程序,可以提前中止,而且只有在傳遞給'bash'的腳本根本不需要從標準輸入中讀取的情況下才有效。 – chepner

+0

這就是我需要的用例,謝謝澄清 – hellomichibye

回答

1

這是因爲$VAR1變得更加進入bash的情況下,當前shell之前擴大。

如果您不想從外部擴展變量,請按如下所示報價TRY。 (您可以使用單或雙引號)。

bash -ex << "TRY" 
    VAR1="123" 
    echo "$VAR1" 
TRY 

Bash manual

3.6.6這裏文檔

這種類型的重定向指示shell從當前 讀取輸入直到只看到包含單詞的行(沒有尾隨 空白)。所有到此爲止讀取的行然後被用作 命令的標準輸入(或文件描述符n,如果指定n),則使用 。

這裏的文檔的格式是:

[n]的< < [ - ]字01​​這裏文檔定界符

無參數和變量擴展,命令替換算術 膨脹,或文件名擴展在單詞上執行。如果引用 單詞的任何部分,則分隔符是單詞 上的引號刪除的結果,並且此文檔中的行不會展開。如果單詞是 未加引號,則此文檔中的所有行均受參數 擴展,命令替換和算術擴展的限制, 字符序列\換行符將被忽略,並且'\'必須用於引用 字符'\ ','$'和'`'。

如果重定向操作符爲'< < - ',則所有前導製表符 從輸入行和包含分隔符的行中剝離。這個 允許在這裏 - 外殼腳本內的文件以自然的方式縮進。

0

由於您的Try/Catch是heredoc,因此shell會進行可變擴展。
試試這個:

#!/bin/bash -x 
bash -ex << \TRY 
    VAR1="123" 
    echo "$VAR1" 
TRY 
echo "exit code: $?" 

這可太引述的定界符標記來實現。但是,如果要執行變量替換,請不要引用它。