• ベストアンサー

Bashシェルスクリプトの書き方

Bashシェルスクリプトの書き方 ↓のx.shはどこが間違っているのでしょうか? $ cat x.sh #!/bin/bash function x() { local dir if $1; then dir=$1 else dir="." fi `find $dir -type d` } ↓こうなります $ source x.sh $ x dir dir: command not found bash: .: ./dir: はディレクトリです

質問者が選んだベストアンサー

  • ベストアンサー
  • kmee
  • ベストアンサー率55% (1857/3366)
回答No.1

まず > if $1; then bashの if 文は 「コマンドを実行した結果」 の終了ステータスで分岐します。 この場合、 $1 (を展開した内容) をコマンドとして実行します。 x dir としたなら $1はdirですから、「dir」コマンドを実行しようとします。Windowsではないので、dirは標準コマンドではありません。よって、 > dir: command not found となります。 $1が空だということを判定したいのなら、testコマンドを利用して if test "$dir" ; then 等とします。testコマンドの詳細は man test とでもして調べてください。 次に たとえば、 dir dir/subdirA dir/subdirB とディレクトリがあったとしたら > `find $dir -type d` → find $dir -type d の実行結果に置きかわるので function x() { ./dir ./dir/subdirA ./dir/subdirB } ...となる → 「./dir」 という[コマンド]を実行しようとするので > bash: .: ./dir: はディレクトリです とエラーになります。 find $dir -type d というコマンドを実行したいのなら、そのまま書けばいいのです。 #!/bin/bash function x() { local dir if [ "$1" ] ; then # [ は test の別名 dir="$1" else dir="." fi # 空白文字を含むディレクトリ対策 find "$dir" -type d }

gotoumak
質問者

お礼

たいへんお詳しい解説ありがとうございます!! バッチリ動作いたしました!!! 素晴らしいご回答ありがとうございました!! m(_ _)m

関連するQ&A