cshでメタ文字、find、およびその他の変数を含む文字列に変数を設定中に問題が発生しました。

cshでメタ文字、find、およびその他の変数を含む文字列に変数を設定中に問題が発生しました。

私はプロジェクトでcshを使用しています(申し訳ありませんが、強制的に使用する必要があります)、私のスクリプトのコンポーネントはほとんどの機能に次のバリエーションを使用します。

find . -maxdepth 1 -not -type d | awk '{gsub(/.\//,"")}1' | grep $userID

これは私のスクリプトで期待どおりに機能しますが、式とgrepの結果を変更できるように変数に設定する必要があります(この文字列を変更する大きなスイッチステートメントがあります)。たくさん試してみましたが、うまくいかないようです。そのため、CSHを使用する代わりにコマンドを変数にロードしましたが(もう一度申し訳ありませんが)、これが非常に特定の場合は、可能であれば動作するようにしたいと思いました。私はそれが引用/形式の問題であるように感じます。そうでなければ完全にあきらめたでしょう。

私がしたことは次のとおりです。

二重引用符:

set findString = "find . -maxdepth 1 -not -type d | awk '{gsub(/.\//,"")}1' | grep $userID"

これはうまくいきますが、findを実行すると次のエラーが発生します。

検索:パスは式の前になければなりません。 |

シェルがコマンドを実行する前にコマンドを拡張しようとしていることはわかっていますが、この問題を解決する方法がわかりません(操作するために引用できないようです)。私は次のように引用符で囲んでみました。

set findString = "find . -maxdepth 1 -not -type d \"|\" awk '{gsub(/.\//,"")}1' | grep $userID"
set findString = "find . -maxdepth 1 -not -type d \"| awk '{gsub(/.\//,"")}1' | grep $userID\""
set findString = "find \". -maxdepth 1 -not -type d | awk '{gsub(/.\//,"")}1' | grep $userID\""
set findString = "\"find . -maxdepth 1 -not -type d | awk '{gsub(/.\//,"")}1 | grep $userID'\""

そして以下をそれぞれ受け取りました:

我慢できない」。

それから一重引用符を試しましたが、エコーできないようです。

set findString = 'find . -maxdepth 1 -not -type d | awk \'{gsub(/.\//,"")}1\' | grep $userID'
echo $findString

もう一度:比較できない」。

この時点で二重引用符を試しましたが、すべてのcshメタ文字をエスケープしました。

set findString = "find\ .\ \-maxdepth\ 1\ \-not\ \-type\ d\ \|\ awk\ \'\{gsub(/.\\//,\"\"\)}1\'\ \|\ grep\ \$userID"

いいえ。だから私は参照した別のスレッドを見つけました。この便利なドキュメント引用し、さまざまな方法で実装してみてください。最後に、変数を取り出し、find変数の残りの文字列を検索オプションとしてロードしました。私もgrepそれをゼロにするためにチューブを剥がしました。それは次のとおりです。

set findString = ( \( -maxdepth 1 -not -type d | awk '{gsub(/.\//,"")}1' \) )
echo $findString
find . "${findString}"

find動作しても正しく評価されません。私はこれを行う方法があるべきだと思います。

ついています。これにご協力いただきありがとうございます。 CSHを使用して二重残留行為を実行し、このコマンド文字列をvarにロードしたことをもう一度お詫び申し上げます。

ベストアンサー1

|変数にaを入れて変数が展開された後は、使用されないと解釈することはできないと思いますeval

したがって、あなたができることは、パラメータをfind1つの変数に入れ、awkコマンドを別の変数に入れることです。

これは私にとって効果的なようです(tcshから):

> mkdir dir; touch dir/file
> set findopts = '-type f'
> set awkcmd = '{gsub(/.\//,"")}1'
> find . $findopts | awk "$awkcmd" 
difile

しかし、./後にスラッシュが続くすべての文字が一致するので、点もエスケープしたいかもしれません。

> set awkcmd = '{gsub(/\.\//,"")}1'
> find . $findopts | awk "$awkcmd"
dir/file

または、eval以下を主張する場合を使用してください。

> set cmd = 'find . -type f | awk '\''{gsub(/\.\//,"" ) }1'\'
> eval "$cmd"
dir/file

正直言って、私はcshの引用の微妙さを知りません(そしてそれを見つけることに興味はありません)。上記はPOSIXファミリーシェルと同様に動作するようですが、自分で確認してください。

おすすめ記事