2013-01-09 34 views

Trả lời

12

Bạn cần báo giá biến số $res để giữ khoảng trắng.

$ cat file 
a  b e  c  d 

$ res=$(cat file) 

$ echo $res 
a b e c d 

$ echo "$res" 
a  b e  c  d 

Từ man bash dưới QUOTING:

trích dẫn được sử dụng để loại bỏ các ý nghĩa đặc biệt của một số nhân vật hoặc từ vào vỏ. Trích dẫn có thể được sử dụng để vô hiệu hóa điều trị đặc biệt cho các ký tự đặc biệt, để ngăn chặn các từ dành riêng được nhận dạng như vậy và để ngăn chặn việc mở rộng tham số.

Mỗi siêu ký tự được liệt kê ở trên theo DEFINITIONS có ý nghĩa đặc biệt đối với vỏ và phải được trích dẫn nếu nó đại diện cho chính nó.

... 

\a  alert (bell) 
\b  backspace 
\e 
\E  an escape character 
\f  form feed 
\n  new line 
\r  carriage return 
\t  horizontal tab 
\v  vertical tab 
\\  backslash 
\'  single quote 
\"  double quote 
\nnn the eight-bit character whose value is the octal value nnn 
\xHH the eight-bit character whose value is the hexadecimal value HH 
\cx a control-x character 

... 
4

Nó không phải là sự phân công đó là mất các tab, nhưng cách gọi lệnh echo.

res được chỉ định giá trị bao gồm các tab. Khi trong vỏ bạn viết $res tương đương với việc nhập nội dung của biến số res vào thời điểm đó.

Vì vậy:

$ echo $res 

không giống nhau như:

$ echo a b e  c  d 

(nơi các không gian lớn trong dòng đó là các ký tự tab, có thể được gõ bằng cách nhấn Ctrl+V Tab). Và nếu bạn chạy lệnh đó, bạn cũng nhận được:

a b e c d 

Vì vậy, câu hỏi của bạn thực sự là: tại sao tab bị thiếu trong đối số của lệnh?

Câu trả lời là lệnh (echo trong trường hợp này) không bao giờ thấy các tab, hoặc thực sự là không gian. Shell phân tích dòng lệnh của bạn thành một tên lệnh và một danh sách các đối số. Nó sử dụng không gian trắng (tab và dấu cách) để chia lệnh thành các phần này. Sau đó, nó chạy lệnh, chuyển nó vào danh sách đối số.

Vì vậy, những gì echo nhận được là đối số của nó là danh sách ‘a’, ‘b’, ‘e’, ‘c’, ‘d’; nó không có ý tưởng những gì nhân vật ban đầu tách chúng.

Điều gì echo sau đó thực hiện đầu ra mỗi đối số của nó, với khoảng cách giữa chúng. Do đó đầu ra bạn nhìn thấy. Trường hợp dòng lệnh ban đầu được sử dụng một ký tự khoảng trắng để tách riêng từng đối số, đầu ra khớp với đầu vào, vì vậy có vẻ như khoảng trống trong đầu vào cũng nằm trong đầu ra - nhưng chúng không phải là: shell gobbles lên không gian gốc và echo chèn một số mới.

Dấu trích dẫn có thể được sử dụng để làm cho trình bao xử lý nhiều 'từ' thành một đối số duy nhất.Ví dụ, nếu bạn làm:

$ echo a "b c" d 

được đi qua 3 đối số cho echo: ‘a’, ‘b c’, và ‘d’. Đối số ở giữa chứa 4 dấu cách; những người được thông qua để echo, do đó, sẽ xuất hiện trong đầu ra của nó. Các dấu cách bên ngoài dấu ngoặc kép được sử dụng bởi trình bao để tách đối số, vì vậy không được chuyển đến echo. Do đó, đầu ra là:

a b c d 

Để kiểm tra loại điều này, rõ ràng hơn khi sử dụng lệnh cho biết chính xác số lượng đối số nhận được và nội dung của mỗi đối số. Lớp lót này của Perl sẽ làm điều đó:

$ perl -MData::Dumper -E 'say Dumper \@ARGV' a b c d 
$VAR1 = [ 
      'a', 
      'b', 
      'c', 
      'd' 
     ]; 

$ perl -MData::Dumper -E 'say Dumper \@ARGV' "a b c d" 
$VAR1 = [ 
      'a b c d' 
     ]; 

$ perl -MData::Dumper -E 'say Dumper \@ARGV' a "b c" d 
$VAR1 = [ 
      'a', 
      'b c', 
      'd' 
     ]; 

$ res="a b c  d" 
$ perl -MData::Dumper -E 'say Dumper \@ARGV' $res 
$VAR1 = [ 
      'a', 
      'b', 
      'c', 
      'd' 
     ]; 

$ perl -MData::Dumper -E 'say Dumper \@ARGV' "$res" 
$VAR1 = [ 
      'a b c  d' 
     ]; 
+0

Ồ, cảm ơn bạn cũng vậy. Điểm của bạn cũng đúng. – MoreFreeze

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