0

ユーザーにいくつかのオプションを要求し、一連のechoステートメントを介して、別のスクリプトファイルを作成して書き込むスクリプトを作成しています。そのスクリプトは、実行時に少なくとも1つのコマンドライン引数にも依存します。

元のステートメントが与えられた

if [ "` echo $1 | egrep ^[[:digit:]]+$`" = "" ]

最初の引数($1)が整数であるかどうかを判断する場合、コマンドライン引数へのアクセスを維持しながら、新しいファイルに書き込まれるechoステートメントにそれを含めるにはどうすればよいですか?

二重引用符とドル記号を次のようにエスケープしようとしました

echo "if [ \"` echo \$1 | egrep ^[[:digit:]]+\$`\" = \"\" ]" >> generatePanos

しかし、それはちょうど結果になりました

if [ "" = "" ]

ただし、echo "\$1"結果として$1ファイルに出力されます。

4

4 に答える 4

1

bashを使用しているので、bashの組み込み正規表現を使用できます。

if [[ $1 =~ ^[[:digit:]]+$ ]]; then 
   ...
fi

bashに組み込まれている正規表現がなくても、テストコマンド([)、またはecho:は必要ありません。

if grep -q -E '^[[:digit:]]+$' <<< "$1"; then
   ...
fi

これがbash以外のシェルでも機能する必要がある場合は、echo:を保持できます。

if echo "$1" | grep -q -E '^[[:digit:]]+$'; then
   ...
fi

最後の2つifは、コマンドの終了ステータスをテストするために機能します。grep一致するものが見つからない場合、コマンドはゼロ以外を返します。

于 2012-06-21T22:35:17.683 に答える
0

すべての問題のある文字の前にバックスラッシュを置きます:echo if [\ "` echo $ 1 \ | egrep ^ [[:digit:]] + $ `\" = \ "\"]

于 2012-06-21T22:33:55.430 に答える
0

私はあなたが何を意味するのか完全にはわかりませんが、ここにあなたが試すことができる2つのことがあります:

行全体(を含む$1)をそのまま印刷する場合は、一重引用符を使用して、echo何も解釈しないように指示します。

$ echo 'if [ "` echo $1 | egrep ^[[:digit:]]+$`" = "" ]'
if [ "` echo $1 | egrep ^[[:digit:]]+$`" = "" ]

行全体を印刷しようとしているが、現在の値を次の代わりに使用する場合$1

$ echo "if [ \"\` echo $1 | egrep ^[[:digit:]]+\$\`\" = \"\" ]"
if [ "` echo <<some value>> | egrep ^[[:digit:]]+$`" = "" ]

バッククォート(の現在の値を使用して評価)にあるコマンドの部分全体を置換しようとしている場合は$1、中間変数を使用するのがおそらく最善です。

temp=$(echo $1 | egrep ^[[:digit:]]+$)
echo "if [ \"$temp\" = \"\" ]"
于 2012-06-21T22:35:27.023 に答える
-1

echo "\ $ 1"は、あなたが言ったことを正確に実行するはずです。
'1'の内容をエコーするには、$ 1をエコーし​​ます(バックスラッシュなし)。
bashスクリプトで変数を使用する場合は、変数を二重引用符で囲むか(echo "$ 1"、func_name "$ 1"など)、エスケープする(echo "$ {1}")ことをお勧めします。

最初の部分に関して、「if」ステートメント全体をファイルにエコーしますか?それはそれがどのように見えるかです。そうでない場合は、次のようにする必要があります。

if [ conditions ]; then echo "$1" >> $filename
于 2012-06-21T22:39:02.570 に答える