Giả sử bạn có một chuỗi có dấu cách là dấu phân cách:
newline_separated=${space_separated// /$'\n'}
Tuy nhiên, có lẽ bạn đang hỏi sai câu hỏi. (Không nhất thiết, ví dụ, điều này có thể xuất hiện trong tệp tạo tệp.) Danh sách tên tệp được phân tách bằng dấu cách không thực sự hoạt động: nếu một trong các tên tệp chứa khoảng trắng thì sao?
Nếu một chương trình nhận tên tệp làm đối số, đừng tham gia chúng với khoảng trắng. Sử dụng "$@"
để truy cập từng cái một. Mặc dù echo "$@"
in các đối số có khoảng trắng ở giữa, nhưng đó là do echo
: nó in các đối số của nó với khoảng trắng dưới dạng dấu phân cách. somecommand "$@"
chuyển tên tệp dưới dạng đối số riêng biệt cho lệnh. Nếu bạn muốn in các đối số trên các dòng riêng biệt, bạn có thể sử dụng
printf '%s\n' "$@"
Nếu bạn không có không gian tách tên file và bạn muốn đặt chúng trong một mảng để làm việc với chúng, bạn có thể sử dụng một mở rộng biến không thể viện chứng để phân chia các giá trị tại các ký tự trên IFS
(bạn sẽ cần phải vô hiệu hóa việc mở rộng ký tự đại diện với set -f
, nếu không glob các mẫu sẽ được mở rộng trong giá trị):
space_separated_list='/path/to/file1 /path/to/file2 /path/to/file3'
IFS=' '; set -f
eval "array=(\$space_separated_list)"
for x in "${array[@]}"; do …
Bạn có thể gói gọn điều này trong một chức năng khôi phục -f
cài đặt và giá trị IFS
khi hoàn thành:
split_list () {
local IFS=' ' flags='+f'
if [[ $- = *f* ]]; then flags=; fi
set -f
eval "$1=($2)"
set $flags
}
split_list array '/path/to/file1 /path/to/file2 /path/to/file3'
for x in "${array[@]}"; do …