ある変数は拡張しますが、他の変数は拡張しないファイルを作成します

ある変数は拡張しますが、他の変数は拡張しないファイルを作成します

Bashスクリプトからファイルを作成したいです。しかし、いくつかの変数を拡張して他の変数を文字通り印刷する必要がありますが、これは可能ですか?

cat <<EOF >  file.sh
$EXPAND
$PRINTLITERALLY
EOF

また、非常に大きなファイルを生成しようとしていますが、テスト用に端末に貼り付けようとすると、次のエラーが発生します。

-bash: urlencode: command not found

それではbashが解釈する内容があるようです。これは私のbashスクリプトランタイムに影響しますか?私はbashスクリプトからファイルを生成するより良い方法があるべきだと思います。

ベストアンサー1

EXPAND=value
cat <<EOF >  file.sh
$EXPAND
\$PRINTLITERALLY
EOF

file.shによって生成されます

value
$PRINTLITERALLY

コンテンツとして。

(毎回発生したり、パラメータの拡張、算術拡張、またはコマンド置換を拡張したくない場所にバックスラッシュを追加する必要があります。また、一部のバックスラッシュ文字をエスケープする必要があります。$`

別の方法:

cat - << EXPANDED /dev/fd/3 3<< 'NOT-EXPANDED' /dev/fd/4 4<< EXPANDED-AGAIN > file.sh
$EXPAND
`echo test`
...
EXPANDED
$PRINTLITERALLY
`echo test`
...
NOT-EXPANDED
$EXPAND
...
EXPANDED-AGAIN

ここで区切り文字を参照する文書(上記に示す3<< 'NOT-EXPANDED')はシェル拡張を実行しないため、実行する操作と実行しない操作を決定できます。

上記のようにすると、次のようになります。

value
test
...
$PRINTLITERALLY
`echo test`
...
value
...

他のすべてのパラメータ拡張、コマンド置換、算術拡張は拡張せずにそのままにして、特定の変数セットのみを拡張したい場合は、envsubstGNUに付属のユーティリティを使用できますgettext

ただし、これは合計のみを拡張し、変数$var(例えば、...)に${var}関連する他の型の引数拡張は拡張しないことに注意してください。$var${var#?}${var[x]}

EXPAND=value EXPAND_AS_WELL=othervalue
export EXPAND EXPAND_AS_WELL
envsubst '$EXPAND$EXPAND_AS_WELL' << '__end_of_envsubst__' > file.sh
$EXPAND ${EXPAND} ${EXPAND#?} ${EXPAND[0]} $EXPAND[0] $EXPANDÉ \$EXPAND
$PRINTLITERALLY $EXPAND_AS_WELL
`echo test`
__end_of_envsubst__

以下を提供します。

value value ${EXPAND#?} ${EXPAND[0]} value[0] valueÉ \value
$PRINTLITERALLY othervalue
`echo test`

info gettext envsubst詳細は参照してください。

おすすめ記事