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
ancak dosya çıktısını kontrol ettiğimde şunu alıyorum:
!/bin/bash
curr=1634
if [ -lt 4477 ]; then
curr=406;
echo > /sys/class/backlight/intel_backlight/brightness;
fi
Tek tırnak işareti koymayı denedim ancak çıktı tek tırnak işaretini de beraberinde taşıyor. Bu sorunu nasıl önleyebilirim?
Sadece küçük bir değişikliğe ihtiyacınız var; <<
'den sonra here-document sınırlayıcısını tek tırnak içine alın.
cat <<'EOF' >> brightup.sh
ya da eşdeğer olarak ters eğik çizgi kaçışı:
cat <<\EOF >>brightup.sh
Tırnak içine almadan, buradaki belge keşfettiğiniz gibi değişken ikamesine tabi tutulacak, geri işaretler değerlendirilecek vb.
Tüm değerleri değil de bazılarını genişletmeniz gerekiyorsa, önlemek istediklerinizi tek tek kaçmanız gerekir.
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
üretecek
#!/bin/sh
# Created on Fri Feb 16 11:00:18 UTC 2018
echo "$HOME will not be evaluated because it is backslash-escaped"
Fredorqui](https://stackoverflow.com/a/27921346/874188) tarafından önerildiği gibi, man bash
bölümünden ilgili kısım aşağıda verilmiştir:
İşte Belgeler
Bu tür bir yönlendirme, kabuğa girdiyi sadece sınırlayıcı içeren bir satıra kadar mevcut kaynak (hiçbir sondaki boşluklar) görülür. O noktaya kadar okunan tüm satırlar daha sonra bir komut için standart girdi olarak kullanılır.
Here-documents'ın formatı şöyledir:
<<[-]word here-document sınırlayıcı
Parametre genişletme, komut değiştirme, aritmetik genişletme yok, veya yol adı genişletmesi sözcük üzerinde gerçekleştirilir. Eğer kelime içindeki herhangi bir karakter tırnak içine alınmışsa, sınırlayıcı sözcük üzerinde tırnak işaretinin kaldırılmasının sonucudur ve here-document içindeki satırlar genişletilmez. Eğer kelime tırnak içine alınmamışsa, here-document'in tüm satırları parametreye tabi tutulur genişletme, komut ikamesi ve aritmetik genişletme. İçinde ikinci durumda, \
karakter dizisi yok sayılır ve \ \, $ ve ` karakterlerini tırnak içine almak için kullanılmalıdır.
Ya da EOF işaretleyicilerinizi kullanarak, ilk işaretleyiciyi alıntılamanız gerekir, böylece genişletme yapılmaz:
#-----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
Bu işe yaramalı, az önce test ettim ve beklendiği gibi çalıştı: herhangi bir genişletme, ikame veya başka bir şey gerçekleşmedi.
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.
Aşağıdakileri kullanmak da işe yarar.
cat <<< ' > file
... code ...'
Ayrıca, `<< EOF' gibi heredoc'ları kullanırken, ikame ve değişken genişletme ve benzerlerinin gerçekleştiğini belirtmek gerekir. Yani şöyle bir şey yapmak:
cat << EOF > file
cd "$HOME"
echo "$PWD" # echo the current path
EOF
her zaman $HOME
ve $PWD
değişkenlerinin genişlemesiyle sonuçlanacaktır. Yani ev dizininiz /home/foobar
ve geçerli yolunuz /home/foobar/bin
ise, file
şöyle görünecektir:
cd "/home/foobar"
echo "/home/foobar/bin"
beklenen yerine:
cd "$HOME"
echo "$PWD"