私は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行)を設定しようとします。sh
bash
私は移植性が欲しいので、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"
これが私があなたのために持っているすべてです。問題脱出のためのいくつかの出発点。頑張ってください!