cat <
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"
@fedorquiさんの提案で、man bash
から該当する部分を紹介します。
ここのドキュメント**」を参照してください。 となっています。
このタイプのリダイレクトは、シェルが入力を このタイプのリダイレクトは、シェルが現在のソースから入力を読み、デリミタのみを含む行(末尾に空白はない)まで このタイプのリダイレクトは、シェルに現在のソースからの入力を、デリミタのみを含む行(末尾の空白はなし)まで読むように指示します。 その時点までに読み込まれたすべての行は その後、コマンドの標準入力として使用されます。
ヒアドキュメントのフォーマットは次のとおりです。
<<[-]ワード ヒアドキュメント デリミタ
wordに対して、パラメータの展開、コマンドの置換、算術演算の展開は行いません。 またはパス名の展開は行われません。 wordの中に引用符で囲まれた文字がある場合 の文字が引用されている場合、デリミタはワードの引用符を除去したものとなります。 ヒアドキュメントの行は展開されません。 もし、wordが が引用符で囲まれていない場合は、ここの文書のすべての行がパラメータ 展開、コマンド置換、算術展開を行います。 後者の場合は 後者の場合、文字列 ˶ˆ꒳ˆ˵ 無視され、˶ˆ꒳ˆ˵ 無視されます。 は引用符で囲む必要があります。
また、EOFマーカーを使用する場合は、最初のマーカーを引用する必要があるため、展開が行われません'。
#-----v---v------
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
IHTH
これはうまくいくはずです。私も試してみましたが、期待通りの結果が得られました。
cat <<< '
#!/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' > file # use overwrite mode so that you don't keep on appending the same script to that file over and over again, unless that's what you want.
以下のようにしても動作します。
cat <<< ' > file
... code ...'
また、<<EOF
などのヒアドキュメントを使用する場合、置換や変数の展開などが行われることに注意してください。 そのため、次のようにします。
cat << EOF > file
cd "$HOME"
echo "$PWD" # echo the current path
EOF
とすると、必ず変数 $HOME
と $PWD
が展開されます。 つまり、ホームディレクトリが /home/foobar
で、カレントパスが /home/foobar/bin
の場合、file
は次のようになります。
cd "/home/foobar"
echo "/home/foobar/bin"
となります。
cd "$HOME"
echo "$PWD"