Linux Bash スクリプトが特定のファイルまたはディレクトリの存在に依存している場合、それらが存在すると単純に想定することはできません。それらが確実に存在することを確認する必要があります。その方法は次のとおりです。
何も想定しないでください
スクリプトを作成するとき、コンピューター上に何が存在し、何が存在しないのかを推測することはできません。スクリプトが多くの異なるコンピュータに配布されて実行される場合、これは二重に当てはまります。遅かれ早かれ、スクリプトは想定を満たさないコンピューター上で実行されることになり、スクリプトは失敗するか、予期しない動作をすることになります。
私たちがコンピュータ上で価値のあるものや作成したものはすべて、何らかの形式のファイルに保存され、それらの ファイルはすべて ディレクトリ に存在します 。スクリプトは、ファイルとディレクトリの読み取り、書き込み、名前変更、削除、移動を実行できます。これらの操作はすべてコマンド ラインで実行できます。
人間としての利点は、ディレクトリの内容を確認でき、ファイルが存在するかどうか、あるいは予期したディレクトリが存在するかどうかがわかることです。ファイルの操作中にスクリプトに問題が発生すると、深刻で有害な結果が生じる可能性があります。
Bash は、ファイルとディレクトリを検出し、それらの属性の多くをテストするために使用できる包括的なテストのセットを提供します。これらをスクリプトに組み込むのは簡単ですが、堅牢性と細かい制御の点で大きなメリットがあります。
テストの範囲
if ステートメントとファイルおよびディレクトリのテストの大規模なコレクションからの適切なテストを組み合わせることで、ファイルが存在するかどうか、実行可能か書き込み可能かどうかなどを簡単に判断できます。
- -b : ファイルがブロック スペシャル ファイルの場合は true を返します。
- -c : ファイルが特殊文字の場合は true を返します。
- -d : 「ファイル」がディレクトリの場合は true を返します。
- -e : ファイルが存在する場合は true を返します。
- -f : ファイルが存在し、通常のファイルである場合は true を返します。
-
-g
: ファイルに
権限セット (setgid
)。chmod g+ - -h : ファイルが シンボリック リンク の場合は true を返します。
- -L : ファイルがシンボリック リンクの場合は true を返します。
-
-k
: スティッキー ビットが設定されている場合は true を返します (
)。chmod +t - -p : ファイルが名前付きパイプの場合は true を返します。
- -r : ファイルが読み取り可能な場合は true を返します。
- -s : ファイルが存在し、空でない場合は true を返します。
- -S : ファイルがソケットの場合は true を返します。
- -t : ファイル記述子が端末で開かれている場合は true を返します。
-
-u
: ファイルに
権限セット (setuid
)。chmod u+ - -w : ファイルが書き込み可能な場合は true を返します。
- -x : ファイルが実行可能であれば true を返します。
- -O : が自分によって所有されている場合は true を返します。
- -G : がグループによって所有されている場合は true を返します。
- -N : ファイルが最後に読み取られてから変更されている場合は true を返します。
- ! : 論理否定演算子。
- && : 論理 AND 演算子。
- || : 論理和演算子。
リストは次から始まります
-b
なぜなら
-a
テストは廃止され、次のものに置き換えられました。
-e
テスト。
スクリプトでのテストの使用
汎用ファイル テスト
if
ステートメントは、
単純なスクリプト構成です。二重括弧内の比較 ”
[[ ] ]
” は、
-f
テストを使用して、その名前の通常のファイルが存在するかどうかを判断します。
このスクリプトのテキストをエディタにコピーし、「script1.sh」というファイルに保存して、 使用します 。
chmod
実行可能にします。
#!/bin/bash
if [[ -f $1 ]]
それから
echo “ファイル $1 が存在します。”
それ以外
echo “ファイル $1 が見つかりません。”
フィ
コマンドラインでファイルの名前をスクリプトに渡す必要があります。
chmod +x script1.sh
この記事の他の例を試したい場合は、各スクリプトでこれを行う必要があります。
単純なテキスト ファイルでスクリプトを試してみましょう。
./script1.sh テストファイル.txt
ファイルは存在し、スクリプトはその事実を正しく報告します。ファイルを削除して再試行すると、テストは失敗し、スクリプトがそれを報告するはずです。
./script1.sh テストファイル.txt
実際の状況では、スクリプトは適切なアクションを実行する必要があります。おそらく、エラーのフラグが立てられて停止します。おそらくファイルを作成して続行します。バックアップ ディレクトリから何かをコピーして、不足しているファイルを置き換える場合があります。それはすべてスクリプトの目的によって異なります。しかし、少なくとも現在では、スクリプトはファイルが存在するかどうかの認識に基づいて決定を下すことができます。
-f
フラグは、ファイルが存在するかどうか、また「通常の」ファイルであるかどうかをテストします。つまり、デバイス ファイルなど、ファイルのように見えて実際はファイルではないものです。
ls を使用して「/dev/random」ファイルが存在することを確認し、スクリプトがそれをどのように扱うかを確認します。
ls -lh /dev/ランダム
./script /dev/random
このスクリプトは通常のファイルをテストしており、「/dev/random」は デバイス ファイルであるため、テストは失敗します。多くの場合、ファイルが存在するかどうかを突き止めるには、使用するテストを慎重に選択するか、複数のテストを使用する必要があります。
これは「script2.sh」で、通常のファイルとキャラクター デバイス ファイルをテストします。
#!/bin/bash
if [[ -f $1 ]]
それから
echo “ファイル $1 が存在します。”
それ以外
echo “ファイル $1 が見つからないか、通常のファイルではありません。”
フィ
if [[ -c $1 ]]
それから
echo “ファイル $1 はキャラクタ デバイス ファイルです。”
それ以外
echo “ファイル $1 が見つからないか、特別なファイルではありません。”
フィ
このスクリプトを「/dev/random」デバイス ファイルで実行すると、最初のテストは予想通り失敗し、2 番目のテストは成功します。ファイルをデバイスファイルとして認識します。
./script2.sh /dev/ランダム
実際にはキャラクターデバイスファイルとして認識します。一部のデバイス ファイルはブロック デバイス ファイルです。現状では、私たちのスクリプトはそれらに対応できません。
./script2.sh /dev/sda
論理
OR
演算子を使用して、2 番目の if ステートメントに別のテストを含めることができます。今回は、ファイルがキャラクタ デバイス ファイルであってもブロック デバイス ファイルであっても、テストは true を返します。これが「script3.sh」です。
#!/bin/bash
if [[ -f $1 ]]
それから
echo “ファイル $1 が存在します。”
それ以外
echo “ファイル $1 が見つからないか、通常のファイルではありません。”
フィ
if [[ -c $1 || -b $1 ]]
それから
echo “ファイル $1 はキャラクターまたはブロック デバイス ファイルです。”
それ以外
echo “ファイル $1 が見つからないか、特別なファイルではありません。”
フィ
このスクリプトは、キャラクタ デバイス ファイルとブロック デバイス ファイルの両方を認識します。
./script3.sh /dev/ランダム
./script3.sh /dev/sda
さまざまなタイプのデバイス ファイルを区別することが重要な場合は、ネストされた
if
ステートメントを使用できます。これが「script4.sh」です。
#!/bin/bash
if [[ -f $1 ]]
それから
echo “ファイル $1 が存在します。”
それ以外
echo “ファイル $1 が見つからないか、通常のファイルではありません。”
フィ
if [[ -c $1 ]]
それから
echo “ファイル $1 はキャラクタ デバイス ファイルです。”
それ以外
if [[ -b $1 ]]
それから
echo “ファイル $1 はブロック デバイス ファイルです。”
それ以外
echo “ファイル $1 が見つからないか、デバイス ファイルではありません。”
フィ
フィ
このスクリプトは、キャラクタ デバイス ファイルとブロック デバイス ファイルの両方を認識して分類します。
./script4.sh /dev/ランダム
./script4.sh /dev/sda
論理 AND 演算子を使用すると、複数の特性を一度にテストできます。これが「script5.sh」です。ファイルが存在すること、およびスクリプトにそのファイルに対する読み取りおよび書き込み権限があることを確認します。
#!/bin/bash
if [[ -f $1 && -r $1 && -w $1 ]]
それから
echo “ファイル $1 は存在し、読み取り/書き込み権限があります。”
それ以外
echo “ファイル $1 が見つかりません。通常のファイルではないか、読み書きできません。”
フィ
私たちに属するファイルと
root
に属するファイルに対してスクリプトを実行します。
./script5.sh .bashrc
./script5.sh /etc/fstab
ディレクトリの存在をテストするには、
-d
テストを使用します。これが「script6.sh」です。これはバックアップ スクリプトの一部です。最初に、コマンドラインで渡されたディレクトリが存在するかどうかを確認します。論理
NOT
演算子を使用します
!
if
ステートメントのテストで。
#!/bin/bash
もし [[ ! -d $1 ]]
それから
echo “バックアップ ディレクトリを作成しています:” $1
mkdir $1
もし [[ ! $? -eq 0 ]]
それから
echo “バックアップ ディレクトリを作成できませんでした:” $1
出口
フィ
それ以外
echo “バックアップ ディレクトリが存在します。”
フィ
# ファイルのバックアップを続行します
echo “バックアップ先: “$1
ディレクトリが存在しない場合は作成されます。ディレクトリがファイルを作成した場合、スクリプトは終了します。ディレクトリの作成が成功するか、ディレクトリがすでに存在する場合、スクリプトはバックアップ アクションを続行します。
スクリプトを実行し、
ls
と
-d
(ディレクトリ) オプションを使用して、バックアップ ディレクトリが存在するかどうかを確認します。
./script6.sh ドキュメント/プロジェクトバックアップ
ls -d ドキュメント/プロジェクトのバックアップ
バックアップディレクトリが作成されました。スクリプトを再度実行すると、ディレクトリがすでに存在していることが報告されるはずです。
./script6.sh
スクリプトはディレクトリを見つけて、バックアップの実行に進みます。
仮定しないでテストしてください
遅かれ早かれ、思い込みは悪いことを引き起こすことになります。まずテストして、それに応じて対応してください。
知識は力である。テストを使用して、スクリプトに必要な知識を与えます。





