実行内容を表示しながらシェルスクリプトを実行する方法

「-x」オプションを付けてシェルスクリプトを実行すると、実行前のコマンドが標準エラー出力に送られます。

以下のようなシェルスクリプトがあるとします。

#!/bin/bash
for i in {0..10}
do
  if [ $(($i % 3)) -eq 0 ]; then
    echo $i "÷ 3 =" $(($i / 3))
  else
    echo $i "÷ 3 =" $(($i / 3)) "あまり" $(($i % 3))
  fi
done

bashで普通に実行すると、以下のようになります。

$ bash test.sh
0 ÷ 3 = 0
1 ÷ 3 = 0 あまり 1
2 ÷ 3 = 0 あまり 2
3 ÷ 3 = 1
4 ÷ 3 = 1 あまり 1
5 ÷ 3 = 1 あまり 2
6 ÷ 3 = 2
7 ÷ 3 = 2 あまり 1
8 ÷ 3 = 2 あまり 2
9 ÷ 3 = 3
10 ÷ 3 = 3 あまり 1

「-x」オプションを使うと、以下のような出力になります。

$ bash -x test.sh
+ for i in {0..10}
+ '[' 0 -eq 0 ']'
+ echo 0 '÷ 3 =' 0
0 ÷ 3 = 0
+ for i in {0..10}
+ '[' 1 -eq 0 ']'
+ echo 1 '÷ 3 =' 0 あまり 1
1 ÷ 3 = 0 あまり 1
+ for i in {0..10}
+ '[' 2 -eq 0 ']'
+ echo 2 '÷ 3 =' 0 あまり 2
2 ÷ 3 = 0 あまり 2
+ for i in {0..10}
+ '[' 0 -eq 0 ']'
+ echo 3 '÷ 3 =' 1
3 ÷ 3 = 1
+ for i in {0..10}
+ '[' 1 -eq 0 ']'
+ echo 4 '÷ 3 =' 1 あまり 1
4 ÷ 3 = 1 あまり 1
+ for i in {0..10}
+ '[' 2 -eq 0 ']'
+ echo 5 '÷ 3 =' 1 あまり 2
5 ÷ 3 = 1 あまり 2
+ for i in {0..10}
+ '[' 0 -eq 0 ']'
+ echo 6 '÷ 3 =' 2
6 ÷ 3 = 2
+ for i in {0..10}
+ '[' 1 -eq 0 ']'
+ echo 7 '÷ 3 =' 2 あまり 1
7 ÷ 3 = 2 あまり 1
+ for i in {0..10}
+ '[' 2 -eq 0 ']'
+ echo 8 '÷ 3 =' 2 あまり 2
8 ÷ 3 = 2 あまり 2
+ for i in {0..10}
+ '[' 0 -eq 0 ']'
+ echo 9 '÷ 3 =' 3
9 ÷ 3 = 3
+ for i in {0..10}
+ '[' 1 -eq 0 ']'
+ echo 10 '÷ 3 =' 3 あまり 1
10 ÷ 3 = 3 あまり 1

このように、実行される行が「+ 」に続けて出力されます。この例のように、「$変数名」(変数展開)や、「$((算術式))」(算術式展開)は展開してから出力されます。また、パス名などの展開も行われてから出力されます。実際に実行されるコマンドがそのまま表示される、というわけですね。この「-x」は、シェルスクリプトを実行した時に、コマンドがどんな引数で、どういう順番で実行されているのかを確かめたい場合に役に立ちます。