Truyền một biến cho một tập lệnh bash sử dụng 'EOF' và coi biến đó là một chữ [đóng]


9

trong kịch bản này, tôi kết thúc với "$ 1" được lưu vào tập tin / test.

#!/bin/bash
cat > /test << 'EOF'
$1
EOF

sự thật là .. tôi cần phải giữ

'EOF'

là 'EOF' vì đối số của tôi ($ 1) chứa các ký hiệu đô la.

nhưng tôi cần đối số đó được lưu thay vì $ 1


1
'bởi vì đối số của tôi ( $1) chứa các ký hiệu đô la.' Không, nếu nó đề cập đến tham số dòng lệnh đầu tiên. Thay thế đã được thực hiện trên đó trước khi kịch bản của bạn được thực thi. Bạn phải thoát nó trên dòng lệnh.
goldilocks

Bạn đã hỏi một số câu hỏi liên quan về nhiệm vụ này mà bạn đang thực hiện và sự tiến triển của các câu hỏi cho thấy rằng bạn không thực sự hiểu những gì đang diễn ra và có lẽ không chọn cách tiếp cận dễ dàng nhất. Thật khó để giúp bạn mà không biết bạn đang cố gắng làm gì, vì vậy tôi khuyên bạn nên hỏi một câu hỏi trong đó bạn giải thích rõ ràng nhiệm vụ tổng thể của mình và không giới hạn câu trả lời để sử dụng một công cụ cụ thể. Ví dụ: đừng nói rằng tôi muốn sử dụng catvà giữ các ký hiệu đô la, nhưng tôi muốn sửa đổi httpd.confđể thay đổi <một số cài đặt> theo <cách này>.
Gilles 'SO- đừng trở nên xấu xa'

@Gilles, cuối cùng tôi quyết định ghi vào một tệp khác thông qua python và sau đó sử dụng tập lệnh bash để ghi tệp đó vào tệp gốc đã được chỉnh sửa. quá trình này dễ dàng hơn nhiều. mèo / temp_file> $ 1
user72685

@Gilles, lý do tại sao các câu hỏi của tôi không có ý nghĩa là vì cách các tập lệnh bash xử lý các biến được truyền cho chúng. có quá nhiều thứ phải được thoát ra và chưa có tính năng mã hóa và giải mã khi đang bay.
dùng72685

@Gilles, điều duy nhất có ý nghĩa với tôi một chút là cơ sở64 nhưng tại sao người ta phải mã hóa nội dung của họ để chuyển sang tập lệnh bash .. thoát khỏi mọi thứ và sau đó cố gắng xây dựng lại mọi thứ trong tập lệnh bash .. cả ba chém về phía trước để thoát khỏi một backtick và vv .. đối với tôi nó giống như một địa ngục mã
user72685

Câu trả lời:


15

Theo dõi câu hỏi trước của bạn , có vẻ như bạn muốn cả một số văn bản chưa được giải thích và một số văn bản được giải thích đi vào một tập tin. Trong trường hợp đó, sử dụng hai cats (hoặc echos) khác nhau :

cat > /test <<'EOF'
some uninterpreted text $(pwd)
not substituted: $1
EOF
cat >> /test <<EOF
but this will substitute: $1
EOF

Có một vài điều đang diễn ra ở đây: đầu tiên, cú pháp heredoc với <<. Nếu bạn bao gồm các trích dẫn trong chuỗi terminator đó, như trong chuỗi đầu tiên ở trên, toàn bộ di truyền sẽ không được giải thích - không có tham số và không có sự thay thế. Nếu bạn không sử dụng bất kỳ dấu ngoặc kép nào, như trong phần hai cat ở trên, các biến như $1sẽ được thay thế bằng các giá trị của chúng và các thay thế lệnh sẽ được đưa vào văn bản. Bạn chọn giữa việc có nên trích dẫn chuỗi "EOF" hay không dựa trên việc bạn có muốn thay thế hay không.

Để đặt cả hai catvào cùng một tệp, chúng tôi đang sử dụng >> chuyển hướng cho lần chuyển hướng thứ hai (và bất kỳ lần sau nào): có nghĩa là nối thêm vào tệp. Đối với lần đầu tiên, chúng tôi sử dụng một lần duy nhất >để xóa tệp và bắt đầu mới.

Lưu ý rằng, ngay cả khi các biến được thay thế , bất kỳ dấu đô la bổ sung nào trong giá trị của biến đó sẽ không được tự thay thế:

foo='$bar'
bar=hello
cat <<EOF
$foo
EOF

sẽ xuất ra:

$bar

mà không thay thế $bargiá trị của.

Tuy nhiên, nếu bạn đang cung cấp "$" trong đối số cho toàn bộ tập lệnh này, bạn cần thoát nó trên dòng lệnh hoặc gửi toàn bộ nội dung trong các dấu ngoặc đơn. Ngoài ra, thay thế lệnh như trong câu hỏi khác của bạn cho phép bạn đặt nội dung của toàn bộ tệp trực tiếp, bao gồm mọi ký hiệu đô la trong nội dung tệp. Hãy chắc chắn rằng bạn trích dẫn chuỗi thay thế ở đó:

oo.sh "$(cat myfile)"

sẽ có được cơ thể myfilenhư $1và sau đó cathoặc echonó theo yêu cầu. Những hạn chế tương tự như trong câu trả lời của tôi có áp dụng: có giới hạn về thời gian đối số dòng lệnh có thể kéo dài và nếu tệp của bạn có thể dài hơn thời gian đó, bạn nên tìm cách tiếp cận khác. Bạn có thể tìm hiểu giới hạn trên hệ thống của bạn là gìgetconf ARG_MAX


1

Âm thanh như bạn chỉ đơn giản là muốn xuất một biến vào tệp. Trong trường hợp đó, điều này sẽ hoạt động:

echo $1 >/test

Lưu ý rằng /testtrong thư mục gốc, người dùng thông thường không có quyền ghi.

EDIT: Hãy nhớ rằng bạn cần trích dẫn chuỗi chứa ký hiệu đô la trong dòng lệnh . Đó là nơi thay thế xảy ra, và kịch bản không thể làm bất cứ điều gì về nó sau thực tế.


Tôi nghĩ rằng bạn có câu trả lời chính xác bây giờ. +1
goldilocks

Câu trả lời của @ MichaelHomer hoàn chỉnh hơn nhiều và bao gồm thông tin hữu ích về các tài liệu ở đây mà tôi đã quên. Câu trả lời của anh ấy nên được chấp nhận (tất nhiên trừ khi người khác đăng bài thậm chí tốt hơn).
Tom Zych
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.