バッシュスクリプトヘルプ

バッシュスクリプトヘルプ

私はNewbamの「Learning the Bash Shell」の本を通してbashスクリプトを独学しています。私は本の仕事をうまくやっていますが、以下のスクリプトについて少し混乱しています。これは for ループを使用してディレクトリを反復処理し、$PATHそのディレクトリに関する情報を印刷するスクリプトです。スクリプトは

IFS=:
for dir in $PATH; do
 if [ -z "$dir" ]; then dir=.; fi
 if ! [ -e "$dir" ]; then
 echo "$dir doesn't exist"
 elif ! [ -d "$dir" ]; then
 echo "$dir isn't a directory"
 else
  ls -ld $dir
done

私が混乱しているのは、dirが0または存在しない場合にこのnull値を現在のディレクトリに設定する理由です。それとも、dirを現在のディレクトリ(私たちがいるディレクトリ)に変更しますか?その後、スクリプトはdirが存在するか、それがディレクトリであるかをテストするように見えます。

スクリプトのこの側面を説明するのに役立つ人はいますか?[ -z "$dir" ]これが真であれば、ディレクトリが存在せず、ディレクトリではないことを示すと思いました。

答え1

テストでは、実際のディレクトリに関連する内容ではなく、-z長さゼロの値をテストします。この条件は、$dir変数にシーケンスがある場合にトリガーされ、この時点で現在のディレクトリを表すように変数値を設定してから、標準の2つのテストを実行します。::PATH$dir.

答え2

$dirが空の場合(-zテスト)、$dirはに設定されます。 (起動スクリプトの現在のディレクトリ)

これで、$ PATHがPATH = / bin::/ usr / bin:/ usr / local / binなどの形式が正しくないと推測します。 2番目のレベルには空のフィールドがあります。したがって、フィールドが空の場合、起動スクリプトの現在のディレクトリ(以降dir =。)に置き換えられます。

答え3

たぶんelif(else if)が見つからない可能性があります。

ただし、このスクリプトは$dirの内容をリストするためのものですが、最初に確認してください。

  1. $dir存在するif ! [ -e "$dir" ]
  2. $dirファイル、パイプ、開発者以外のディレクトリです。elif ! [ -d "$dir" ]

$dirにnull値を使用してこれらのテストを実行することはできないため、最初の行(if [ -z "$dir" ]; then dir=.; fi)を使用して空の文字列をに置き換えます。これはディレクトリであり、存在します。

空の$dir文字列は2つの方法で使用できます。

  • PATH=/usr/bin:/sbin::$HOME/bin
  • PATH=/usr/bin:/sbin:$MYAPPBINDIR:$HOME/bin$MYAPPBINDIR空の場所)。

答え4

~からPOSIX仕様PATH(スクロールを少し下にする必要があります):

(強調は私のもの)

この変数は、ファイル名でのみ知られている実行可能ファイルを検索するときに特定の機能とユーティリティーが適用する一連のパスプレフィックスを表す必要があります。接頭辞は ( ':' ) で区切る必要があります。このファイル名に長さゼロ以外のプレフィックスが適用されているときにプレフィックスが.で終わらない場合は、プレフィックスとファイル名の間にaを挿入する必要があります。長さゼロのプレフィックスは、現在の作業ディレクトリを表す古い機能です。 2つの隣接する文字( "::")、リストの残りの部分の前の最初の文字、またはリストの残りの部分の後の末尾の文字として表示されます。厳密に互換性のあるアプリケーションは、実際のパス名(例:.)を使用してPATHの現在の作業ディレクトリを表す必要があります。指定された名前と適切な実行権限を持つ実行可能ファイルが見つかるまで、各プレフィックスにファイル名を適用してリストを最初から最後まで検索する必要があります。探しているパス名に以下が含まれている場合は、パスプレフィックスで検索しないでください。パス名がで始まると、指定されたパスが解決されます(パス名の確認を参照)。 PATH が設定されていない場合、または null に設定されている場合、パス検索は実装によって定義されます。 PATHで使用できるディレクトリ名はこのコンテキストでは区切り文字であるため、文字を含めることはできません。

私の仮定は、POSIX仕様が.現在の作業ディレクトリ名として特別な名前を使用しないか、または持っていないシステムに対応するために空の文字列を許可することです。

関連情報