もっと丈夫なシェル

1853 ワード

bash -u/set -o nounset (set -u)
basn -e/set -o errexit (set -e)
-eを使用して$をチェックできないことに注意してください.なぜなら$ゼロでないとbashはこの値を得ることができません
command
if [ "$?"-ne 0]; then echo "command failed"; exit 1; fi
     :
command || { echo "command failed"; exit 1; }
   :
if ! command; then echo "command failed"; exit 1; fi

       ,          set +e

パイプを使用する場合は、command 1|command 2....|commandn結果はfalse...|true...|false....結果は正しいと考えられます.
このような状況を回避するには、オプションset-o pipefailを使用します.
ファイル名またはコマンドラインパラメータにスペースを使用するのが好きな場合は、shellスクリプトで「」を使用してラップしてください.
if[$filename="foo"]filenameにスペースがある場合、失敗する場合はif[$filename"="foo"]で置き換えることができます.
特に、コマンドラインパラメータに1つのパラメータにスペースが含まれている場合は、$@を取り外すときに2つのパラメータとして扱われます.「$@」を使用します.
david% foo() { for i in $@; do echo $i; done }; foo bar "baz quux"
bar
baz
quux
david% foo() { for i in "$@"; do echo $i; done }; foo bar "baz quux"
bar
baz quux

プログラムの実行中にエラーが発生して戻ってくると、一時ファイルを残すなど、システムの状態が破壊されます.trapコマンドを使用して改善することができます.
trap command signal[signal]
signalを受信するとcommandが実行され、これらの傍受を除去するにはtrap-signal
  $()  (`)
# both commands below print out: A-B-C-D
echo "A-`echo B-\`echo C-\\\`echo D\\\`\``"
echo "A-$(echo B-$(echo C-$(echo D)))"

 [[]](     )  []
  [[]]                 ,             ,           :
       
||      or(        )    
&&      and(        )    
<         (          )    
-lt            
=             
==     Globbing         (        ,    )    
=~                 (        ,    )    
-n             
-z            
-eq            
-ne            
    :
[ "${name}" \> "a" -o ${name} \< "m" ]
    
[[ "${name}" > "a" && "${name}" < "m"  ]]