Bourne シェル内のシングルクォートと変数

Bourne シェル内のシングルクォートと変数

Solaris 9 の Bourne Shell で実行しようとしているコマンドがあります。

find ${DATADIR} -name "check_*" -type f -exec sh -c '$0 | ${PARSEDATA}' {} \; >> ${TMP_1}

私の問題は、変数が${PARSEDATA}正しく機能しないことです。変数を二重引用符で囲んでみましたが、問題は$0コマンドを使用して見つかったファイルではなく、このコードを実行するスクリプトの名前にありますfind

おそらく簡単な問題ですが、この問題を解決するための提案があれば、非常に役立ちます。

前もって感謝します。

アップデート: $0はコマンドを使用して検索されたスクリプトの名前でfind、変数は${PARSEDATA}システム上のどこかにあるフィルターで、検索された各スクリプトの出力を変更します。ただし、問題は、両方を取得できず、$0適切${PARSEDATA}に展開できないことです。$0単一引用符を使用して適切に展開するか、二重引用符を使用して${PARSEDATA}適切に展開しますが、その後、$0このコマンドを実行する元のスクリプトの名前になりますfind

答え1

何をしようとしているのかよく分かりません。しかし、check_*という名前のスクリプトを探してそれを実行し、プログラム${PARSE_DATA}にパイプしたいのであれば、findで見つかったファイルはそうではないと思いますが$0{}

/var/ftp/mp3 を検索 -name "*.mp3" -type f -exec chmod 644 {} \; (Wikipedia)

したがって、二重引用符を使用できると思います。

find ${DATADIR} -name "check_*" -type f -exec sh -c '{} | ${PARSEDATA}' \; >> ${TMP_1}

成功しました:

PG='sed s/Blah/Bleh/'
find . -name "check_*" -type f -exec sh -c "{} | $PG" \;

> Bleh Blah

答え2

一重引用符はそのままにしておいてください。問題は PARSEDATA 変数をエクスポートしていないことが原因である可能性が非常に高いです。

export PARSEDATA
find ${DATADIR} -name "check_*" -type f -exec sh -c '$0 | ${PARSEDATA}' {} \; >> ${TMP_1}

答え3

$0 をシェルで展開しないようにし (一重引用符を使用)、${PARSEDATA} を展開したい場合は、それぞれに異なる引用符を使用すればよいでしょう。

find ${DATADIR} -name "check_*" -type f -exec sh -c '$0 | '"${PARSEDATA}" {} \; >> ${TMP_1}

引用符で囲まれた部分を結合したままにしておくと、シェルは ${PARSEDATA} を展開し、コマンド全体を単一のトークンとして検索に渡します。

関連情報