truyền và thiết lập các biến trong một di truyền


17

Tôi có một kịch bản phải thực hiện nhiều thứ khác nhau trên nhiều máy từ xa khác nhau. Tôi nghĩ rằng một di truyền sẽ làm việc cho điều này, nhưng tôi không thể sử dụng một biến được định nghĩa ở nơi khác trong tập lệnh một biến được định nghĩa trong di truyền.

Đây là một số mã:

#!/bin/sh

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

Điều này chỉ in như sau:

THỰC SỰ =

Thanh = thanh

Tuy nhiên, nếu tôi trích dẫn dòng EOF như thế này: ssh some.remote.host << "EOF" thì nó chỉ in như sau:

FOO = foo

THANH =

Bất kỳ gợi ý về cách tôi có thể sử dụng cả hai biến trong di sản?

Cảm ơn.

Câu trả lời:


25

Tóm lại, sử dụng:

  • từ khóa heredoc không trích dẫn, ví dụ, EOF
  • char đô la thông thường cho các biến ngoài (tức là cục bộ ), ví dụ:$FOO
  • đã thoát đô la char cho các biến bên trong (tức là từ xa ), vd\$BAR

Nếu bạn để từ khóa heredoc (tức là EOF) không được trích dẫn thì cơ thể heredoc được xử lý cục bộ, do đó, nó $FOOđược mở rộng fooBARđược mở rộng thành chuỗi trống. Sau đó, sshlệnh của bạn trở thành:

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

Nếu bạn trích dẫn từ khóa heredoc thì mở rộng biến bị chặn, để sshlệnh của bạn trở thành thế này:

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

FOOcó lẽ không được xác định trong môi trường shell từ xa, biểu thức "FOO=$FOO"được ước tính là "FOO=''", tức FOOlà được đặt thành chuỗi rỗng.

Nếu bạn muốn sử dụng cả hai biến thì bạn sẽ không để từ khóa heredoc không được trích dẫn, để việc mở rộng biến diễn ra cho biến được xác định cục bộ và sau đó thoát (với dấu gạch chéo ngược) biến mà bạn muốn được mở rộng từ xa, nghĩa là :

#!/bin/sh

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

Trong trường hợp này, lệnh ssh của bạn (được nhận bởi máy chủ từ xa) sẽ như sau:

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

1
Điều đó thật tuyệt vời! Tôi đã dành nhiều năm cố gắng để tìm ra điều này. Cảm ơn bạn rất nhiều cho giải pháp này.
trubliphone
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.