#!/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アドインですか?わかりません。
答え2
まあ、思ったより簡単です:
-e
the演算子はif
bourneシェル(sh)には定義されておらず、bourne Againシェル(bash)でのみ定義されているようです。
私はif [ -e ...
に置き換えてif [ -r ...
動作します。