私はシェルに比較的新しい人です(今は基本だけを知っています)。私はバグを修正するためにスクリプトを理解しようとしていますが、私は誤ってGoogleで答えを見つけることができなかったことを発見しました(おそらく正しいものを検索せずに)。
if [ -r "$1" ] ;
私は制御フローについて非常によく知っており、これが$1
スクリプトに渡されるパラメータであることも知っています。私たちが評価している実際の式が何であるかわかりません。-r
どんな助けでも大変感謝します!
答え1
演算子と最初の位置引数(または位置引数が設定されていない場合は空の文字列)の内容を演算子のオペランド(および対称のクロージャ)として[
使用してコマンドを実行します。-r
-r
]
この[
コマンドは、Bourneに似たすべてのシェル(およびfish
)に組み込まれています。したがって、その文書は通常、そのシェルマニュアルにあります。としても知られていますtest
。
シェルに応じて、以下を試してください。
info zsh test
info bash '['
fish -c 'help test'
- または
man ksh
/...man dash
情報ページがないシェルの場合。
(一部のシステムでは、これらのシェルでドキュメント形式を使用できるようにするか、bash-doc
パッケージをインストールする必要があります。)zsh-doc
info
また、システムには、スタンドアロンコマンドや[
他test
の種類のシェルやシェル以外のもので使用できる同様のインタフェースを持つコマンドがあることが多く、コマンドを実行するためにシェルを使用しません(たとえばenv
... find -exec
)。文書はinfo test
またはman test
(man '['
おそらく)にあります。
特に、-r
オペレータは、コマンドを実行するプロセス[
(組み込みシェル[
)で指定されたファイルを開く権限があるかどうかをテストします。読む。 true の場合、[
コマンドは以下を返します。成功if
ステートメントのこの部分が実行された場合の終了状態ですthen
。
access(argv[1], R_OK)
これはCの状況と同じです。
答え2
Q -r
:ユーザーに$1
オペランドとして識別されたファイルに対する読み取り権限がありますか?
test
このユーティリティのPOSIX仕様すべての標準演算子を含むリストです。
そのうちのいくつかは次のとおりです。
-e file exists
-f file is a regular file (not a directory or device file)
-s file is not zero size
-d file is a directory
-b file is a block device
-c file is a character device
-p file is a pipe
-L file is a symbolic link
-S file is a socket
-t file (descriptor) is associated with a terminal device
-r file has read permission (for the user running the test)
-w file has write permission (for the user running the test)
-x file has execute permission (for the user running the test)