「goodbye」というファイルが現在のディレクトリにあるかどうかをテストし、そのファイルが現在のディレクトリにある場合は、「I am here」を印刷する「test.sh」スクリプトを作成します。
事前の説明なしで「単語文書」でこの問題が発生しました。これが私が遭遇した問題です。 test.shを使用して、別れの挨拶ファイルが現在のディレクトリにあること、ファイルが次のようになっていることを確認するスクリプトを作成する必要があると思いました。そこに「I'm here」を印刷する必要があります。しかし、test.shの使い方がわかりません。
私が行ったコードはまだわかりません。
cisco@ubuntu:~$ > goodbye
if [ -f goodbye ]; then
echo "I am here"
fi
答え1
質問は思ったより簡単ではありません。まず、意味するものを定義する必要があるからです。文書そして存在する。
- それはディレクトリ、fifo、シンボリックリンク、デバイスです。文書。
-f
ユーティリティの演算子は[
trueのみを返します。一般ファイルあるいは、最終的に次に解決されるシンボリックリンクを決定することができる。一般ファイルそして上記の内容はすべて除外されます。 lstat()
存在を宣言するのに十分なほど、ディレクトリ内のその名前のディレクトリエントリを探していますか?または、ファイルにアクセスできる必要があります(パスが実際のファイルであることを確認するか)、またはstat()
(パスが後で実際のパスであることを確認する)シンボリックリンクを解決します。
それでは、現在のディレクトリを読み取れないか検索できない場合はどうなりますか?ファイルが存在しないと誤って記述するのではなく、エラーとして処理して中断する必要がありますか?
if [ -f file ]; then
echo I am here
fi
file
「I am here」は、シンボリックリンクの確認後に通常のファイルとして正常に識別できる場合に出力されます。file
存在しない場合、またはファイルが通常のファイルでない場合(シンボリックリンクの確認後に決定されます)、「I am here」は出力されません。 、または何らかの理由でファイル形式を確認できません。現在、作業ディレクトリへの検索アクセスが必要ですが、読み取りアクセスは必要ありません。
if [ -e file ]; then
echo I am here
fi
ファイルが任意のタイプである可能性があることを除いて同じです。上記のように「ここにあります」がfile
確認できないシンボリックリンクである場合(リンクが壊れているか、ユーザーがアクセス権のない領域を指しているため)、出力はありません。
if [ -e file ] || [ -L file ]; then
echo I am here
fi
file
同じですが、壊れたシンボリックリンクの場合も含まれます。
現在の作業ディレクトリを検索できない場合は、偽の肯定が発生する可能性があります。ディレクトリを入力した後にディレクトリの権限が変更された場合、またはプロセスの資格情報が変更された場合、cd
これが発生する可能性があります。
使用:
if ls -d file > /dev/null; then
echo I am here
fi
同じ操作を実行し[ -e file ] || [ -L file ]
てファイルが見つからない理由を説明するエラーが表示されます。
zsh
シェルでは、$ERRNO
特殊変数を使用して原因を見つけることもできます。
現在のディレクトリに対する検索権限はありませんが、読み取り権限があり、フルパスを知っている場合でも、そのディレクトリにfile
ファイルエントリがあることを確認できます(例:bashなどのPOSIXシェルなど)。
set -- "$PWD"/[f]ile
case $1 in
(*/file) echo "I am here"
esac
$PWD
(現在の作業ディレクトリへのパスが一致しない極端なケースがある可能性があり、これは誤った肯定を引き起こす可能性があります。)
バラよりこれはstackoverflowに関する同様の質問と答えに対する私の答えです。より多くの情報を知りたいです。
答え2
#!/bin/bash
[ -f goodbye ] && echo "I am here"