bir heredoc içinde değişkenleri geçirme ve ayarlama


18

Birçok farklı uzak makinede çok farklı şeyler yapmak zorunda bir senaryom var. Bir heredoc bunun için çalışmak düşündüm, ama başka bir yerde komut dosyasında tanımlanan bir değişken kullanmak mümkün değilim ve bir yorumlu metin tanımlanan biri.

İşte bazı kod:

#!/bin/sh

FOO="foo"
ssh some.remote.host << EOF
  BAR="bar"
  echo "FOO=$FOO"
  echo "BAR=$BAR"
EOF

Bu yalnızca aşağıdakileri yazdırır:

FOO =

ÇUBUK bar =

Bununla birlikte, EOF satırını böyle teklif edersem: ssh some.remote.host << "EOF" o zaman sadece aşağıdakileri yazdırır:

FAN = FON

BAR =

Yorumlu metin içinde her iki değişkeni nasıl kullanabileceğime dair herhangi bir ipucu var mı?

Teşekkürler.

Yanıtlar:


27

Kısacası, şunu kullanın:

  • alıntılanmamış heredoc anahtar kelimeleri, ör. EOF
  • dış (yani yerel ) değişkenler için normal dolarlık karakter , ör.$FOO
  • kaçan ait dolar Char (yani uzak ) değişkenler, örneğin\$BAR

Eğer heredoc anahtar kelimesini bırakırsanız (yani EOF) böylece heredoc vücut, lokal olarak işlenir sonra tırnak içine $FOOkadar genişletilir foove BARboş dizeye genişletilir. Sonra sshkomutunuz:

BAR="bar"
echo "FOO=foo"
echo "BAR="

Heredoc anahtar sözcüğünü belirtirseniz, değişken genişletme bastırılır, böylece sshkomutunuz bu hale gelir:

BAR="bar"
echo "FOO=$FOO"
echo "BAR=$BAR"

Yana FOOmuhtemelen uzak kabuk ortamında tanımlı değil, ifade "FOO=$FOO"olarak değerlendirilir "FOO=''"yani FOOboş bir dizeye ayarlanır.

Her iki değişkeni de kullanmak istiyorsanız, heredoc anahtar sözcüğünü tırnaksız bırakmanız gerekir, böylece yerel olarak tanımlanan değişken için değişken genişletme gerçekleşir ve ardından uzaktan genişletmek istediğiniz değişkenten (ters eğik çizgi ile) kaçarsınız, yani :

#!/bin/sh

FOO="foo"
ssh some.remote.host << EOF
  BAR="bar"
  echo "FOO=$FOO"
  echo "BAR=\$BAR"
EOF

Bu durumda, ssh komutunuz (uzak sunucu tarafından alındığı gibi) aşağıdakiler olacaktır:

  BAR="bar"
  echo "FOO=foo"
  echo "BAR=$BAR"

1
Bu mükemmel! Yaşlarımı anlamaya çalışarak geçirdim. Bu çözüm için çok teşekkür ederim.
trubliphone
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.