複数のファイルをスキャンして読み取り可能であることを確認するスクリプトを作成する方法

複数のファイルをスキャンして読み取り可能であることを確認するスクリプトを作成する方法

[-r]を使ってファイルを読み込む方法を理解します。しかし、複数のファイルを入力として受け入れて確認するスクリプトはどうなりますか?

私が入るとしましょう。

./checkfile hi hello world

スクリプトは以下を返す必要があります。

hi is readable 
hello is readable
world is not readable 
summary: 2 of 3 files are readable

答え1

#! /bin/sh -
n=0
for file do
  if [ -r "$file" ]; then
    printf '"%s" is readable\n' "$file"
    n=$((n + 1))
  else
    printf '"%s" is not readable\n' "$file"
  fi
done
echo "$n out of $# files were readable"

[ -r file ]fileコマンドを呼び出すプロセス(通常はシステムコールを使用)を[ユーザー(スクリプトを実行しているユーザー)が読み取ることができるかどうかをテストしますaccess()

他のユーザーが読めるかどうかは言及されていません。それを読もうとはしません。たとえば、プライマリストアの欠陥のために読み取れないファイルは検出できません。

答え2

$@配列と同じ構造でスクリプトに渡されたすべての引数(位置引数)を格納する特殊変数です。

$1, $2, $3, ... are the positional parameters.
"$@" is an array-like construct of all positional parameters, {$1, $2, $3 ...}.

これについて詳しくは、次をご覧ください。バッシュリファレンスマニュアル

関連情報