私はプロジェクト用のテンプレートシェルスクリプトを作成していますが、必須の機能の1つは、テンプレート構成ファイルのコピーを新しいファイルとして作成することです。ただし、これは静的に処理されるのではなく、ランタイム変数を作成して設定します。($modloader
)これはシェルスクリプトのファイル名から取得され、テンプレートをこの同じ名前でコピーします。静的ファイル名でいくつかのテストを行いましたが、cp
問題なく動作しますが、ファイルがすでに存在するかどうかを確認すると失敗するようです。(5行目)これをターミナルで実行すると、チェックしているファイルが見つかりません。より文字通りの文脈で探しているのだと思いますが、'理解する'変数を使用しています。
#!/bin/sh
modloader=`basename -s .sh "$0"`
if "./Settings/$modloader.ini"; then
cp "./Settings/Template.ini" "./Settings/$modloader.ini"
fi
答え1
ファイルがすでに存在するかどうかを確認するときに失敗するようです
ファイルがすでに存在するかどうかを確認していないようですif "./Settings/$modloader.ini";
。走るini ファイル。一般に、ファイルがこのように実行され、テストしたい内容に応じて終了ステータスを返すように設計されている場合、これは何かの有効なテストになる可能性があります。
問題のファイルを実行できたとしても、そのファイルを自身の存在 (非存在) のテスターにするのは意味がありません。
シェルでファイルが存在するかどうかを確認する正しい方法は次のとおりです。
test -e "./Settings/$modloader.ini"
# or equivalently
[ -e "./Settings/$modloader.ini" ]
ノート:
test -e
ファイルのテストいかなるタイプ。test -e
または、関連するディレクトリ (たとえば、Settings
あなたの場合) の権限によりファイルが存在するかどうかの確認が許可されていない場合は、偽陰性 (つまり、ゼロ以外の終了ステータス) が返されます。
さらに、テストを否定したいとします。コード内の行は次のようになります。
if ! [ -e "./Settings/$modloader.ini" ]; then
if
ただし、必須ではありません。GNUcp
と-n
( --no-clobber
) は、これの代わりに必要なものすべてかもしれません。このオプションは移植性がなく、ターゲットがディレクトリ (へのシンボリックリンク) であることが判明した場合に備えて、別の移植性のないオプション( )if … fi
が必要になる可能性が高くなります。-T
--no-target-directory
cp -nT "./Settings/Template.ini" "./Settings/$modloader.ini"
ターゲットがすでに存在し、cp -n
何もしない場合は、終了ステータスは になります0
。ターゲットが存在せず、コピーが成功した場合も、同じ終了ステータスになります。つまり、cp
ファイルが存在するかどうかに応じて 以上の操作を実行したい場合は、if
いずれにしても prior が必要です。