ボーンシェル if [ -e $directory/file.$suffix ]

ボーンシェル if [ -e $directory/file.$suffix ]
#!/bin/sh
CONFIG_DIR="/var/opt/SUNWldm/"
read option
if [ $option -eq 9 ]; then
        ret=1
elif [ -e ${CONFIG_DIR}file.xml.${option} ]; then
        echo "TRUE"
fi

オプションのリストを表示するために、whileループで上記のコードを使用しました。残念ながら、声明に問題がありますelfi

から:初心者なら-e は、ファイルが存在する場合は true を返します。

構文を再確認し、デバッグモード(set -xスクリプトの先頭に設定)でスクリプトを実行しましたが、ifインラインに示すように置換が正しく行われたことを確認できました。

+ [ 201301271355 -eq 9 ]
+ [ -e /var/opt/SUNWldm/file.xml.201301271355 ]
./ldm_recover.sh: test: argument expected

これまで探してみましたが、失敗の原因を見つけられませんでしたが、私が何を間違っているのかご存知ですか?

ベストアンサー1

Bourneシェルはアンティークです。 Solarisバージョン-eでは、Bourneシェルのライフサイクルの後半に導入され、POSIXで大切にする組み込み関数の演算子はありません。test[

-f回避策として、通常のファイルが存在するか、-r読み取れないファイルに興味がないかをテストするために使用できます。

より良い方法は、POSIXシェルに変更または購入すること#!/bin/shです#!/usr/xpg4/bin/sh#!/bin/ksh

これは[ $option -eq 9 ]おそらく間違っているかもしれません。-eq数値比較演算子ですが、$option実際には数値ではありません。日付です。 32ビットシステムで201301271355数値として解釈されると、モジュロ2 32です。偶然にも、21世紀には0モジュロ2 32に非常に近い日付はありませんが、それに依存することは非常に脆弱です。代わりにこれを作成してください[ "$option" = 9 ]

一般的なシェルプログラミングの原則として、変数とコマンドの置換には常に二重引用符を使用してください。"$foo"、、"$(foo)"。そうしないと、シェルは結果を各空白文字に分割し、各結果単語をファイル名ワイルドカードパターンとして扱います。したがって、$foo値にスペースやが含まれていないfoo場合にのみ保護されないことが安全です\[?*。慎重に進んで、常に二重引用符を使用してください(分割とパターンのマッチングを実行する予定がない限り)。

それともBourneに移植されていないkshアドインですかわかりません。

おすすめ記事