シェルスクリプト(Bashスクリプト)で通常ファイルが存在した場合のみコマンドを実行するには、以下のように書きます。
#!/bin/bash
if [[ -f ~/path/to/file ]]; then
# 実行する処理、以下は例
ls -l ~/path/to/file
fi
通常ファイル以外の広義のファイル(ディレクトリやソケットなど)の場合は、「-f」で調べても「偽」となり、コマンドが実行されません。
ファイルタイプにかかわらず、存在すればコマンド実行する場合は「-e」を用います。
#!/bin/bash
if [[ -e ~/path/to/file ]]; then
# 実行する処理、以下は例
ls -l ~/path/to/file
fi
存在しない場合にコマンドを実行するには、以下のように書きます。
#!/bin/bash
if [[ ! -e ~/path/to/file ]]; then
# 実行する処理、以下は例
touch ~/path/to/file
fi
以下は、Bashのマニュアルページに記載されている、ファイル存在に関する条件式です。これらを組み合わせることで、ファイルの存在、非存在、種類に応じて処理を変えることができます。
-a file file が存在すれば真となります。 -b file file が存在し、かつブロック特殊ファイルならば真となります。 -c file file が存在し、かつキャラクター特殊ファイルならば真となります。 -d file file が存在し、かつディレクトリならば真となります。 -e file file が存在すれば真となります。 -f file file が存在し、かつ通常ファイルならば真となります。 -g file file が存在し、かつ set-group-id されていれば真となります。 -h file file が存在し、かつシンボリックリンクならば真となります。 -k file file が存在し、かつ ``sticky'' ビットが設定されていれば真となります。 -p file file が存在し、かつ名前付きパイプ (FIFO) ならば真となります。 -r file file が存在し、かつ読み込み可能ならば真となります。 -s file file が存在し、かつそのサイズが 0 より大きければ真となります。 -u file file が存在し、 かつ set-user-id ビットが設定されていれば真となります。 -w file file が存在し、かつ書き込み可能ならば真となります。 -x file file が存在し、かつ実行可能ならば真となります。 -G file file が存在し、かつ (実行中のシェルの) 実効グループ ID に所有されていれば真となります。 -L file file が存在し、かつシンボリックリンクならば真となります。 -N file file が存在し、 かつ前回読み込まれた以降に修正されていれば真となります。 -O file file が存在し、かつ (実行中のシェルの) 実効ユーザ ID に所有されていれば真となります。 -S file file が存在し、かつソケットならば真となります。
コメント
初めまして、シェルスクリプト、勉強させていただきます!
ブラケットは二重にする必要はないかと思います。( “/usr/bin/[” コマンドを実行しているだけなので)
if [ -f ~/path/to/file ] などでOKです。
二重ブラケットを用いたほうが高速で便利なので、そちらを紹介しています。
[ ] と書くと /usr/bin/[ が実行されますが、[[ ]] と書くとBashによって処理されます。
さらに[[ ]] は [ ] と異なり、値が空の変数を ” で囲わなくてもエラーにならなかったり、&& や ||が使えたり、=~ で正規表現にマッチするかどうかを判定したりできます。
なので、Bashスクリプトでは [ ] ではなく [[ ]] を用いることをお勧めします。
[[ はbash内蔵の機能なんですね。
いつも,shのことばかり意識していたので,
[[ のことはよく理解していませんでした。
勉強不足で見当違いなことを申し上げたこと,お詫びいたします。