Làm thế nào để bảo toàn ngắt dòng khi lưu trữ đầu ra lệnh cho một biến?


104

Tôi đang sử dụng bash shell trên Linux. Tôi có tập lệnh đơn giản này…

#!/bin/bash

TEMP=`sed -n '/'"Starting deployment of"'/,/'"Failed to start context"'/p' "/usr/java/jboss/standalone/log/server.log" | tac | awk '/'"Starting deployment of"'/ {print;exit} 1' | tac`
echo $TEMP

Tuy nhiên, khi tôi chạy tập lệnh này

./temp.sh

tất cả đầu ra được in mà không có dấu xuống dòng / dòng mới. Không chắc đó là cách tôi lưu trữ đầu ra vào $ TEMP hay chính lệnh echo.

Làm cách nào để lưu trữ kết quả đầu ra của lệnh vào một biến và giữ nguyên các dấu ngắt dòng / ký tự xuống dòng?


3
Chúng được duy trì trong biến tốt (ngoại trừ biến cuối cùng); đó là tiếng vang của bạn đã bị phá vỡ. Xem mywiki.wooledge.org/BashPitfalls mục nhập # 14
Charles Duffy

1
ngoài ra, don'tlưu trữ commandstrong variables. Usemột functionthay
Han Solo

Câu trả lời:


204

Trích dẫn các biến của bạn. Đây là lý do tại sao:

$ f="fafafda
> adffd
> adfadf
> adfafd
> afd"

$ echo $f
fafafda adffd adfadf adfafd afd

$ echo "$f"
fafafda
adffd
adfadf
adfafd
afd

Nếu không có dấu ngoặc kép, trình bao sẽ thay thế $TEMPbằng các ký tự mà nó chứa (một trong số đó là dòng mới). Sau đó, trước khi gọi trình echobao, hãy chia chuỗi đó thành nhiều đối số bằng cách sử dụng Internal Field Separator(IFS) và chuyển danh sách đối số kết quả đó tới echo. Theo mặc định, giá trị IFSđược đặt thành khoảng trắng (dấu cách, tab và dòng mới), do đó, shell cắt $TEMPchuỗi của bạn thành các đối số và nó không bao giờ nhìn thấy dòng mới, vì shell coi nó là một dấu phân cách, giống như một khoảng trắng .


xdotool type "$myVar"không hoạt động. nó vẫn gõ nội dung của biến mà không cần dòng mới
azerafati

Điều gì xảy ra nếu bạn muốn làm điều gì đó như FOO="$(echo $VAR)"; làm thế nào để bạn trích dẫn $VARđúng cách khi nó đã nằm trong dấu ngoặc kép?
weberc2

@ weberc2 Bạn chỉ cần trích dẫn lại một lần nữa: "$(echo "$VAR")". Vâng, thật kỳ lạ để phân tích cú pháp, nhưng có vẻ dễ dàng hơn đối với shell hơn là đối với chúng tôi.
OJFord

3

Tôi đã gặp phải vấn đề tương tự, một trích dẫn sẽ giúp

ubuntu@host:~/apps$ apps="abc
> def"
ubuntu@host:~/apps$ echo $apps
abc def
ubuntu@host:~/apps$ echo "$apps"
abc
def

2
Trả lời một câu hỏi gần 5 năm sau mà không thêm bất kỳ chi tiết mới nào vào (các) câu trả lời trước đó hoặc cung cấp một giải pháp mới không phải là một ý kiến ​​hay; xin vui lòng tránh đăng những loại câu trả lời.
MAChitgarha

1
Yêu thích độ chính xác của "gần 5 năm" của bạn, @MAChitgarha, :)
Neil Gatenby
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.