遅延拡張

遅延拡張

私はquine .shスクリプトを作成したいと思います。これが私がこれまでにしたことです
quine.sh。 ::

#!/bin/sh
q="#!/bin/sh\nq=$q;echo \$q";echo $q

この行に集中してください。

q="#!/bin/sh\nq=$q;echo \$q";echo $q

$q(in)\nq=$qが最初に発生した場合は、最初に変数の残りの部分を設定してから、この部分(setlocal enabledelayedexpansionバッチファイルの1行)を設定しようとします。shbash私は移植性が欲しいので、notまたは他のものに対するソリューションが欲しいです。。また、コードを短くする方法などのヒントを提供しないでください。上記の問題に対する解決策が欲しい。

ベストアンサー1

'初期文字列をsの代わりに"sで囲むと、$qすぐに拡張されません。その後、次のように拡張できますeval

#!/bin/sh
q='#!/bin/sh\nq=$q;eval "echo \"\$q\""';eval "echo \"$q\""

残念ながら、\n拡張がない場合、'sと"sは失われ、\"sは"sになります。

出力:

#!/bin/sh\nq=#!/bin/sh\nq=$q;eval "echo \"\$q\"";eval echo "$q"

我々はかなり親しかったが、脱出の問題を解決しようとする努力はsed結局かなり面倒だった。


jw013のリンクはかなり理解しやすいアプローチをお勧めします。

  • パート1:プログラムの2番目の部分を含む一部のデータ(変数など)の定義
  • パート2:データを使用してプログラムの最初の部分を出力し、データを使用してプログラムの2番目の部分を出力します。 (パート1で必要なラッピングとエスケープ処理はここで処理されます。)

おおよその最初の試みは次のとおりです。

#!/bin/sh
data="echo -e \"#!/bin/sh\ndata=\"\$data\"\"\\n\$data"
echo -e "#!/bin/sh\ndata=\"$data\"\n$data"

出力:

#!/bin/sh
data="echo -e "#!/bin/sh
data="$data""
$data"
echo -e "#!/bin/sh
data="$data""
$data

この試みには\n常に解釈され欠けている\問題があります。データ文字列を再印刷するときにそれをエスケープする方法が必要です。


echoこれは、s関連の問題を回避するために複数の呼び出しを使用する改善です\n

#!/bin/sh
data='echo "#!/bin/sh"\necho "data=$data"\necho -e "$data"'
echo "#!/bin/sh"
echo "data='$data'"
echo -e "$data"

克服しにくい小さな欠陥がありますが、出力に's(middle)が不足しているということです。echo

#!/bin/sh
data='echo "#!/bin/sh"\necho "data=$data"\necho -e "$data"'
echo "#!/bin/sh"
echo "data=$data"
echo -e "$data"

これが私があなたのために持っているすべてです。問題脱出のためのいくつかの出発点。頑張ってください!

おすすめ記事