Nối (thay đổi) từng phần tử mảng thông qua mở rộng tham số (nghĩa là không có printf)?


8

Hãy để kịch bản dưới đây minh họa cho tình trạng khó khăn của tôi ..

#!/bin/zsh

STUFF=( moose-hoof ovary clydsedale )

echo ${MINE=$(printf "MY-%s " $STUFF)}
echo ${MINE_EXP=${STUFF/^/MY-}}

MY-moose-hoof MY-carydsedale

clydsedale buồng trứng

Các cờ mở rộng đúng để cho phép nối chuỗi trên mỗi phần tử của mảng là gì?

Câu trả lời:


16

Sử dụng $^array.

Nó biến mảng thành một kiểu mở rộng cú đúp của mảng. Như trong khi a=(foo bar baz), $^asẽ là một chút như thế {foo,bar,baz}.

$ a=(foo bar baz)
$ echo prefix${^a}suffix
prefixfoosuffix prefixbarsuffix prefixbazsuffix

Đối với mảng ghép kênh :

$ a=(1 2 3) b=(a b c)
$ echo $^a$^b
1a 1b 1c 2a 2b 2c 3a 3b 3c

Đương nhiên, nếu tiền tố hoặc hậu tố chứa các ký tự đặc biệt shell (như ;phân tách các lệnh hoặc khoảng trắng phân tách các từ hoặc $"'&*[?~...), chúng phải được trích dẫn:

echo 'p r e f i x '$^a' s u f f i x'

tương tự như đối với csh(và bash, ksh, zsh's):

echo 'p r e f i x '{foo,bar,baz}' s u f f i x'

$^achính nó không được trích dẫn, "foo${^a}bar"sẽ mở rộng như một từ. Một trường hợp mà bạn muốn $^arrayđược trích dẫn, tương tự như $arraykhi bạn muốn bảo tồn các phần tử trống. Sau đó, bạn cần trích dẫn mở rộng mảng và sử dụng (@)cờ hoặc "${array[@]}"cú pháp (gợi nhớ đến vỏ Bourne "$@"):

$ array=(x '')
$ printf '<%s>\n' $array         # empties removed
<x>
$ printf '<%s>\n' "$array"       # array elts joined with spaces
<x >
$ printf '<%s>\n' "${(@)array}"  # empties preserved
<x>
<>
$ printf '<%s>\n' "$array[@]"    # empties preserved
<x>
<>
$ printf '<%s>\n' $^array$^array # empty removed
<xx>
<x>
<x>
$ printf '<%s>\n' "$^array$^array" # concatenation of joined arrays
<x x >
$ printf '<%s>\n' "$^array[@]$^array[@]" # multiplexing with empties preserved
<xx>
<x>
<x>
<>

Thật không may, điều này không hiệu quả với tôi .. echo "number ${^$(seq 3)} "-> number 1 2 3hoặc Z=( $(seq 3) ); echo "number ${^Z}"->number 1 2 3
alex

@don_crissti Chỉ sau khi thử đề xuất sau của bạn, echo "number "${^$(seq 3)}""nó sẽ hoạt động. tôi KHÔNG BAO GIỜ thấy dấu ngoặc kép bên trong dấu ngoặc kép như thế. Rất kì lạ. RẤT khó nhớ .. nhưng cảm ơn!
alex xám

@alexgray không phải là trích dẫn trong dấu ngoặc kép, đó là tiền tố và hậu tố được trích dẫn, nhưng không ${^(seq 3)}, xem chỉnh sửa.
Stéphane Chazelas
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.