Jeg ønsker å skrive ut kode i en fil ved hjelp av 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
men når jeg sjekker filutskriften, får jeg dette:
!/bin/bash
curr=1634
if [ -lt 4477 ]; then
curr=406;
echo > /sys/class/backlight/intel_backlight/brightness;
fi
Jeg prøvde å sette enkle anførselstegn, men utdataene tar også med seg de enkle anførselstegnene. Hvordan kan jeg unngå dette problemet?
Du trenger bare å gjøre en minimal endring, nemlig å sette anførselstegn etter <<
.
cat <<'EOF' >> brightup.sh
eller tilsvarende backslash-escape:
cat <<\EOF >>brightup.sh
Uten anførselstegn vil dokumentet her gjennomgå variabelsubstitusjon, backticks vil bli evaluert osv, slik du oppdaget.
Hvis du trenger å utvide noen, men ikke alle, verdier, må du escape de verdiene du vil forhindre, hver for seg.
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
vil produsere
#!/bin/sh
# Created on Fri Feb 16 11:00:18 UTC 2018
echo "$HOME will not be evaluated because it is backslash-escaped"
Som foreslått av @fedorqui, her er det relevante avsnittet fra man bash
:
Her dokumenter
Denne typen omdirigering instruerer skallet til å lese inndata fra den til en linje som bare inneholder skilletegn (uten etterfølgende blanktegn). (uten etterfølgende blanktegn). Alle linjene som er lest frem til dette punktet, blir > brukt som standardinput. deretter brukt som standardinndata for en kommando.
Formatet for her-dokumenter er:
<< <[-]ord her-dokument skilletegn
Ingen parameterutvidelse, kommandosubstitusjon, aritmetisk utvidelse, eller utvidelse av banenavn utføres på word. Hvis noen av tegnene i word er i anførselstegn, er skilletegnet resultatet av fjerning av anførselstegn på word, og linjene i her-dokumentet blir ikke utvidet. Hvis ordet er uten anførselstegn, blir alle linjene i her-dokumentet utsatt for parameterutvidelse parameterekspansjon, kommandosubstitusjon og aritmetisk ekspansjon. I det sistnevnte tilfelle ignoreres tegnsekvensen \
, og \ må brukes til å sitere. må brukes til å sitere tegnene \, $ og `.
Eller, hvis du bruker EOF-markører, må du sitere den første markøren slik at utvidelsen ikke blir gjort:
#-----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
Dette burde fungere, jeg testet det nettopp, og det fungerte som forventet: ingen utvidelse, erstatning eller lignende fant sted.
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.
Følgende fungerer også.
cat <<< ' > file
... code ...'
Det er også verdt å merke seg at når du bruker heredocs, for eksempel << EOF
, skjer det substitusjon og variabelutvidelse og lignende. Så hvis du gjør noe sånt som dette:
cat << EOF > file
cd "$HOME"
echo "$PWD" # echo the current path
EOF
vil alltid resultere i utvidelse av variablene $HOME
og $PWD
. Så hvis hjemmekatalogen din er /home/foobar
og den aktuelle banen er /home/foobar/bin
, vil file
se slik ut:
cd "/home/foobar"
echo "/home/foobar/bin"
i stedet for det forventede:
cd "$HOME"
echo "$PWD"