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 cat
s (hoặc echo
s) 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ư $1
sẽ đượ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 cat
và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ế $bar
giá 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ể myfile
như $1
và sau đó cat
hoặc echo
nó 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
) 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.