1. ホーム
  2. linux

[解決済み] コードを含むファイルをcat <<EOF >>する方法は?

2022-03-07 04:19:10

質問

を使用して、コードをファイルに印刷したい。 cat <<EOF >> :

cat <<EOF >> brightup.sh
!/bin/bash
curr=`cat /sys/class/backlight/intel_backlight/actual_brightness`
if [ $curr -lt 4477 ]; then
   curr=$((curr+406));
   echo $curr  > /sys/class/backlight/intel_backlight/brightness;
fi
EOF

が、ファイル出力を確認すると、こうなる。

!/bin/bash
curr=1634
if [  -lt 4477 ]; then
   curr=406;
   echo   > /sys/class/backlight/intel_backlight/brightness;
fi

シングルクォートを付けてみましたが、出力にはシングルクォートも一緒に出てきます。どうすればこの問題を回避できますか?

解決方法を教えてください。

の後のヒアドキュメントデリミタをシングルクオートで囲むだけです。 << .

cat <<'EOF' >> brightup.sh

またはバックスラッシュ・エスケープする。

cat <<\EOF >>brightup.sh

クォートしないと、ここにある文書は変数の置換を受け、バックティックが評価されるなど、あなたが発見したようなことが起こります。

もし、すべての値ではなく、いくつかの値を展開する必要がある場合は、防ぎたい値を個別にエスケープする必要があります。

cat <<EOF >>brightup.sh
#!/bin/sh
# Created on $(date # : <<-- this will be evaluated before cat;)
echo "\$HOME will not be evaluated because it is backslash-escaped"
EOF

を生成します。

#!/bin/sh
# Created on Fri Feb 16 11:00:18 UTC 2018
echo "$HOME will not be evaluated because it is backslash-escaped"

で提案されているように フェドーキー の該当部分です。 man bash :

ここにある書類

このタイプのリダイレクションは、シェルに対して、入力が 現在のソースは、デリミタのみを含む行まで(デリミタがない)。 が表示される。 その時点までに読み込まれたすべての行が コマンドの標準入力として使用されます。

here-documentsのフォーマットは。

      <<[-]word
              here-document
      delimiter

パラメータ展開、コマンド置換、算術展開は行いません。 またはパス名展開が行われる。 wordの中に文字がある場合 が引用されている場合、デリミタは単語の引用除去の結果であり、また の行は展開されません。 ワードが 引用符で囲まれていない場合、Here-Document のすべての行は、パラメータ 展開、コマンド置換、算術展開 . この場合 後者の場合、文字列 \<newline> は無視され \ は引用符で囲む必要があります。 \ , $ および ` .