Bash変数の置換に問題があります。これが私がやろうとしていることのばかげた例です。 bashスクリプトから新しいスクリプトを出力する必要があります。行(私の例ではecho
を参照)には、置換すべきでない変数と置換すべき変数が混在しています。
#!/bin/bash
REPLACE=`whoami`
cat << EOF > mynewscript.sh
read DONTREPLACE < /home/$REPLACE/localinput.txt
echo $DONTREPLACE > /home/$REPLACE/somefile.log
EOF
exit 0
これは実際の例ではありませんが、問題を示しています。絶対パスを事前に知っておく必要があり、元のスクリプトで$ REPLACEを評価したいとします。しかし、スクリプトで$ DONTREPLACEを評価/置換したくありません。 $DONTREPLACE
は、まったく同じように新しいスクリプトに出力されます。
したがって、ヒアドキュメントを作成する際に「EOF」を引用しても機能しません。
私はこれを十分に説明していると思います。
私は別の解決策を知りません。私はどんなアイデアにも感謝しますが、私は本当に単純なアイデア/解決策を好みます。エレガントである必要はありません。
DONOTREPLACE
の前にある\
をエスケープするには、$
を使用する必要があります。以下の例と出力を参照してください
REPLACE=10
DONOTREPLACE=20
cat <<EOF
> echo $REPLACE
> echo \$DONOTREPLACE
> EOF
echo 10
echo $DONOTREPLACE