ファイルまたはディレクトリ名を引数として使用し、そのファイルがディレクトリであるのか、通常のファイルであるのか、それとも別のものかを報告するBashスクリプトを作成しようとしています。また、スクリプトは、ユーザーがファイルまたはディレクトリに対する読み取り、書き込み、および実行権限を持っているかどうかを報告する必要があります。
明らかに、次の内容が元のメッセージを受け取ります。
#!/bin/sh
read -p "Enter a filename: " fname
file $fname
ls -la $fname
しかし、fileコマンドを完全に削除し、filename変数をlsに渡して、結果に応じてif、then、elseステートメントの種類を作成できるかどうか疑問に思います。 lsコマンドはファイルタイプの完全な分析とコマンドを実行するユーザーがファイルに対する権限を提供するため、lsコマンドの結果に応じて出力をカスタマイズできますか?
答え1
シェルテストを使用してファイルの種類と権限を確認できます。
#!/bin/sh
read -rp 'Enter a filename: ' fname
if [ -f "$fname" ]; then
echo 'File is a regular file'
elif [ -d "$fname" ]; then
echo 'File is a directory'
else
echo 'File is not a regular file or a directory'
fi
[ -r "$fname" ] && read=read
[ -w "$fname" ] && write=write
[ -x "$fname" ] && execute=execute
echo "User has ${read} ${write} ${execute} permissions" | tr -s ' '
-f
if構造は、ファイルタイプが通常のファイル()かディレクトリ()であるかを確認してファイルタイプを報告し-d
、そうでない場合は両方を報告しません。
-r
次に、読み取り()、書き込み(-w
)、実行(-x
)など、さまざまな権限を確認します。それぞれに変数を設定します。ユーザーがこれらの権限の1つを持っていない場合、その変数は設定されていないままになり、ユーザーがその権限を持っていない場合は、最後のエコー行で変数が空の状態に拡張されます。tr -s ' '
これは、存在しない権限に存在する可能性がある追加のスペース削除を呼び出すことによって最終的に行われます。