Shell script」カテゴリーアーカイブ

Linuxで使えるシェルスクリプトに関するカテゴリーです。

bashのスクリプトでif節やelif節を空にするとエラー

bashのスクリプトでifを使う時、thenfi間に何のコマンドも含んでいないスクリプトはエラーになってしまいます。

if [ $value = "abc" ]
then
  # 何もしない
fi

エラーの内容

bash: syntax error near unexpected token `fi'

何もしない分岐は削除すればいいだけですが、elif節やelse節での条件を簡略化したい場合など、何もしない分岐を作りたくなることもあるかなと思います。

そんな時はコロン:というBUILTIN COMMANDを使うと良いみたいです。

次のような感じで使います。

if [ $value = "abc" ]
then
  :
fi

elif節やelse節でも同様です。
困っている方は試してみてください。

Shellスクリプトでcase文の使い方メモ

bash(sh)でcase文を書くときの基本は次のような感じです。

case $変数 in
  パターン1)
    実行したい内容1
    ;;
  パターン2)
    実行したい内容2
    ;;
esac

ということで、case文でよく使われるパターンを2つほど紹介してみようと思います。

曜日ごとに異なる内容を実行したい場合(cronで便利です)

case `date +%a` in
  'Sun')
    日曜日に実行したい内容
    ;;
  'Mon')
    月曜日に実行したい内容
    ;;
  'Tue')
    火曜日に実行したい内容
    ;;
  'Wed')
    水曜日に実行したい内容
    ;;
  'Thu')
    木曜日に実行したい内容
    ;;
  'Fri')
    金曜日に実行したい内容
    ;;
  'Sat')
    土曜日に実行したい内容
    ;;
esac

ランダムで何か実行したい場合

case `expr $RANDOM % 3` in
  0)
    3分の1の確率で実行したい内容
    ;;
  1)
    3分の1の確率で実行したい内容
    ;;
  2)
    3分の1の確率で実行したい内容
    ;;
esac

Makefileにforループを書く方法

シェルスクリプトのforをMakefileに書くと次のようなエラーになってしまいます。

example0:
--TAB-- for i in 1 2 3 4 5;
--TAB-- do
--TAB--   echo $$i
--TAB-- done

実行結果

$ make example0
for i in 1 2 3 4 5;
/bin/sh: -c: line 1: syntax error: unexpected end of file
make: *** [makefile:2: example0] Error 1

Makefileは基本的に1行ずつのコマンドを書くようになっていることが原因みたいです。ということで、Makefileでforループを使いたい場合は1行で書くようにすると良いみたいです。

example1: 1行でforループを書く方法

example1:
--TAB-- for i in 1 2 3 4 5; do echo $$i; done

実行結果

$ make example1
for i in 1 2 3 4 5; do echo $i; done
1
2
3
4
5

example2: バックスラッシュ\を使って1行にする方法

example2:
--TAB-- for i in 6 7 8 9 10; do \
--TAB--   echo $$i; \
--TAB-- done

実行結果

$ make example2
for i in 6 7 8 9 10; do \
  echo $i; \
done
6
7
8
9
10

どちらも結果は同じになりますので、読み易い書き方を使ってみてください。

※変数参照は$でなく$$にしないと使えないので気を付けてください。

リンク

Multiline bash commands in makefile – Stack Overflow
https://stackoverflow.com/questions/10121182/multiline-bash-commands-in-makefile

How to write loop in a Makefile? – Stack Overflow
https://stackoverflow.com/questions/1490949/how-to-write-loop-in-a-makefile