2013-02-09 24 views
7
$ cat test.sh 
set -eu 
echo "`wc -l < $DNE`" 
echo should not get here 

$ /bin/bash test.sh 
test.sh: line 2: DNE: unbound variable 

should not get here 

我正在運行bash版本4.1.2。有沒有辦法確保子shell中所有這些未綁定變量的使用都會導致腳本退出而不必修改每個涉及子shell的調用?bash未綁定變量不會導致從子shell設置時退出-eu

+0

@菲爾的回答在Linux,OS X和Solaris的工作。你可能會考慮接受它。 – jww 2016-11-09 20:31:40

+0

這是一個體面的選擇,但沒有解決原始問題的「不必修改每個電話」的要求。如果標誌符合要求,那麼在某種情況下,每次使用變量時都必須記住做某件事情,這樣更容易設置和忘記。 – Jason 2016-11-10 21:49:46

回答

2

使用臨時變量以讓test.sh進程知道wc的失敗。你可以把它改成:

#!/bin/bash 
set -eu 
out=$(wc -l < $DNE) 
echo $out 
echo should not get here 

現在,你將看不到should not get here如果WC失敗。

+1

謝謝,但如果我總是可以記得正確地做事情,我就不需要-eu選項來捕捉bash會以其他方式通過的錯誤:)我正在尋找一種方法來告訴bash不那麼寬容錯誤而不更改所有代碼-eu適用於。 – Jason 2013-02-10 15:35:42

+0

您檢查每個命令的返回代碼並打印適當的消息/錯誤處理。 -e是退出任何故障時的一個選項。 Bash是一種解釋型語言,所以這種喜悅只有在編譯語言:)但它提供了合理的選項,例如-e這裏。 – 2013-02-10 15:48:30

+0

你相信有一些方法可以在不使用'-e'的情況下做到這一點嗎? – 2014-07-22 16:59:12

4

更好的解決方案,以確保變量禁制

#!/usr/bin/env bash 

set -eu 

if [[ ${1-} ]]; then 
    DNE=$1 
else 
    echo "ERROR: Please enter a valid filename" 1>&2 
    exit 1 
fi 

通過將一個連字符的變量名花括號內像這樣的bash允許向三立處理變量是不確定的。我也強烈建議看谷歌的外殼風格指南,這是一個很大的參考https://google.github.io/styleguide/shell.xml

[[ -z ${variable-} ]] \ 
    && echo "ERROR: Unset variable \${variable}" \ 
    && exit 1 \ 
    || echo "INFO: Using variable (${variable})"