Mở rộng cú đúp trong dấu ngoặc kép


1

Tôi hiểu rằng mở rộng cú đúp trong Bash sẽ mở rộng thành nhiều đối số. Tôi có thể mở rộng nó thành một đối số không?

Có một giải pháp thuần túy cho vấn đề này ở Bash, mà không cần dùng đến tiếng vang lồng nhau?

Hành vi thực tế

command arg{1,2,3}

$1 = arg1
$2 = arg2
$3 = arg3

Hành vi mong muốn

$1 = arg1 arg2 arg3
$2 = 
$3 = 

Không giải pháp

command "arg{1,2,3}"

$1 = arg{1,2,3}
$2 = 
$3 = 

Giải pháp tiềm năng (một chút hack-y?)

command "$(echo arg{1,2,3})"

$1 = arg1 arg2 arg3
$2 = 
$3 = 

Câu trả lời:


3

Mở rộng arg{1,2,3}thành arg1 arg2 arg3được gọi là Mở rộng Brace, chia thành ba từ được gọi là Chia tách từ và chèn Thay thế lệnh đầu ra của lệnh. man bashnói:

Thứ tự mở rộng là: mở rộng cú đúp ; mở rộng dấu ngã, mở rộng tham số và biến, mở rộng số học và thay thế lệnh (được thực hiện theo kiểu từ trái sang phải); tách từ ; và mở rộng tên đường dẫn.

Trong một dòng lệnh như

printf %s\\n {1..3}

Mở rộng cú đúp xảy ra đầu tiên và làm cho nó

printf %s\\n 1 2 3

nơi 1, 23là những từ riêng biệt nhờ vào Lời Chia. Bạn không thể làm gì để thay đổi thứ tự này - như bạn đã trải nghiệm, trích dẫn nó không chỉ ngăn chặn Chia tách Word mà còn mở rộng Brace. Tuy nhiên, bạn có thể sử dụng Thay thế Lệnh để có được Mở rộng Brace ngay cả trong dấu ngoặc kép:

Nếu thay thế [lệnh] xuất hiện trong dấu ngoặc kép, thì việc tách từ và mở rộng tên đường dẫn không được thực hiện trên kết quả.

Trong

printf %s\\n "$(echo {1..3})"

bên trong của trích dẫn được mở rộng đầu tiên

printf %s\\n "$(echo 1 2 3)"
printf %s\\n "1 2 3"

và như kết quả được trích dẫn, nó không chịu sự chia tách của Word:

$ printf %s\\n {1..3} "{1..3}" "$(echo {1..3})" # prints one argument per line
1
2
3
{1..3}
1 2 3

Đây thực sự không chỉ là cách đơn giản nhất để làm điều này, mà còn là một bashgiải pháp thuần túy , như echolà một bashnội dung.

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.