2012-03-26 15 views
14

Tôi cần xuất một số văn bản dưới dạng tập lệnh bash, nhưng trong một tập lệnh. Tôi sử dụng con mèo cho việc này, nhưng nó có một nhược điểm. Nó diễn giải các biến và các công cụ trong khi đang được viết. Tôi muốn ngăn chặn điều này.Ngăn không cho bash giải thích mà không trích dẫn mọi thứ

Làm cách nào để thực hiện điều đó mà không trích dẫn tất cả các biến số (tập lệnh của tôi không dài)? Ví dụ

cat >/tmp/script << EOF 
    $HOSTNAME 
    # lots of other stuff I do NOT want to escape like \$VARIABLE 
    # ... 
EOF 

cat /tmp/script 
myhostname.mylan 

Tôi muốn:

cat /tmp/script 
$HOSTNAME 

Edit: Xin lưu ý kịch bản của tôi (ở đây chỉ $ HOSTNAME) là rất lâu, tôi không muốn thay đổi tất cả. Cũng single trích dẫn không hoạt động với < <

cat >/tmp/script '<< EOF 
    $HOSTNAME 
EOF' 
File not found: EOF' 

lừa là gì? Cảm ơn.

+0

Ai đó có thể cho biết lý do tại sao nó không được hiểu trong trường hợp của tôi? '$ echo $ HOSTNAME' ->' myhost'; '$ echo \ $ HOSTNAME' ->' $ HOSTNAME'; '$ echo \ $ HOSTNAME>/tmp/s; cat/tmp/s' -> '$ HOSTNAME' –

Trả lời

48

Nếu bạn muốn tất cả mọi thứ được trích dẫn:

cat << 'EOF' 
stuff here with $signs is OK 
as are `backquotes` 
EOF 

Xem phần trên "ở đây tài liệu" trong cuốn hướng dẫn.

+0

ĐÂY LÀ GÌ TÔI MUỐN, THANK YOU! :-) – lzap

+0

'mèo << EOF' không thoát' $ 'thứ và' mèo << 'EOF'', bắt được ở đây! –

+0

TUYỆT VỜI! Tôi chỉ muốn tôi có thể được cấp quyền chuyển lên phiếu bầu :-) –

1

Thoát khỏi $:

cat >/tmp/script << EOF 
    \$HOSTNAME 
EOF 
+0

Không, như được mô tả - Tôi có hàng nghìn dòng - tôi sẽ không làm điều đó. Điều này sẽ làm việc trong ví dụ đơn giản của tôi, có, nhưng tôi đang cố gắng tìm một giải pháp khác. Đó là lý do tại sao chủ đề. – lzap

+1

@lzap, 'sed 's/\ $/\\ $/g''? –

0

Hãy thử với echo:

echo ' 
$HOSTNAME 
... 
' >> /tmp/script 
1

Sử dụng sed:

sed -n '20,30p' "$0" 

in dòng từ 20 đến 30, SSCE:

#!/bin/bash 
cat >/dev/null << EOF 
3 
4 $HOSTNAME 
5 ls 
6 $(ls -l) 
7 
8 echo 'foo 
9 bar' 
10 
11 echo "Foo 
12 $((4+4)) Bar" 
EOF 
sed -n '3,12p' "$0" 
echo "fine?" 

làm việc với đầu/đuôi cũng nên hoạt động.

Bạn sẽ phải điều chỉnh các số, nếu bạn làm việc trên đó và chèn hoặc xóa các dòng.

+0

Upvoting, có một giải pháp ngay bây giờ, nhưng nỗ lực tốt đẹp! Cảm ơn! – lzap

Các vấn đề liên quan