2011-07-07 72 views
12

Tôi muốn một cái gì đó như thế này trong bash:dấu ngoặc kép làm tổ trong bash

alias foo='bar="$(echo hello world | grep \"hello world\")"; echo $bar;'; foo 

sản lượng dự kiến: hello world

Ouput: grep: thế giới ": Không có tập tin hoặc thư mục

  • Dấu ngoặc kép bên ngoài phải là dấu ngoặc đơn, với dấu ngoặc kép $ bar sẽ trống.

  • T các trích dẫn tiếp theo phải là dấu ngoặc kép, với dấu nháy đơn $() sẽ không mở rộng.

  • Dấu ngoặc kép bên trong có thể là cả hai loại dấu ngoặc kép, nhưng dấu nháy đơn không cho phép dấu ngoặc đơn bên trong chúng.

Làm cách nào để đạt được điều này?

Trả lời

32

Những thứ bên trong $() đại diện cho một subshell, vì vậy bạn được phép đặt dấu ngoặc kép bỏ trốn bên trong

alias foo='bar="$(echo testing hello world | grep "hello world")"; echo "$bar"' 
1

Thoát khỏi không gian

alias foo='bar="$(echo hello world | grep hello\ world)"; echo $bar;' 
+0

Có không thể thoát khỏi dấu ngoặc kép, nói rằng tôi muốn làm: 'alias foo = 'baz =" hello world "; bar = "$ (echo hello world | grep \" $ baz \ ")"; echo $ bar; '; foo' – Tyilo

5

Đó là một chút không rõ ràng những gì "một cái gì đó như thế này" có nghĩa là, nhưng cách đơn giản nhất để đạt được những gì có vẻ là Vấn đề ở đây là một chức năng đơn giản:

foo() { 
    echo 'hello world' | grep 'hello world' 
} 
foo 
  • Không cần chuyển nhượng biến trung gian (dù sao cũng sẽ bị mất).
  • Các chức năng thường được ưu tiên hơn bí danh vì linh hoạt hơn (xử lý thông số) và khả năng đọc (nhiều dòng; ít thoát).
  • Luôn sử dụng giải pháp đơn giản nhất có thể hoạt động.
0

Các dấu ngoặc kép quanh $() là không cần thiết:

alias foo='bar=$(echo hello world | grep "hello world"); echo $bar;' 
foo 

# Output: 
hello world 
Các vấn đề liên quan