web-dev-qa-db-ja.com

bashスクリプトを使用して新しいスクリプトを出力する:置換する変数と置換しない変数を混在させる必要があります

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」を引用しても機能しません。

私はこれを十分に説明していると思います。

私は別の解決策を知りません。私はどんなアイデアにも感謝しますが、私は本当に単純なアイデア/解決策を好みます。エレガントである必要はありません。

5
MountainX

DONOTREPLACEの前にある\をエスケープするには、$を使用する必要があります。以下の例と出力を参照してください

REPLACE=10
DONOTREPLACE=20
cat <<EOF
> echo $REPLACE
> echo \$DONOTREPLACE
> EOF

echo 10
echo $DONOTREPLACE
6
iruvar