Ayırıcı olarak boşluk içeren bir dize bulunduğunu varsayalım:
newline_separated=${space_separated// /$'\n'}
Ancak muhtemelen yanlış soruyu soruyorsunuz. (Mutlaka gerekli değildir, örneğin bu bir makefile'de ortaya çıkabilir.) Dosyadan boşlukla ayrılmış bir liste gerçekten işe yaramazsa: dosya adlarından biri boşluk içeriyorsa ne olur?
Bir program dosya isimlerini argüman olarak alırsa, onları boşluklarla birleştirmeyin. "$@"
Onlara birer birer erişmek için kullanın . Her ne kadar echo "$@"
baskılar arasında boşluk olan argümanlar, o nedeniyle olduğunu echo
: o ayırıcı olarak boşluk ile argümanları basar. somecommand "$@"
dosya adlarını komuta ayrı argümanlar olarak iletir. Bağımsız değişkenleri ayrı satırlara yazdırmak istiyorsanız,
printf '%s\n' "$@"
Boşluklu dosya adlarınız varsa ve bunları üzerinde çalışmak üzere bir diziye koymak istiyorsanız, değeri karakterlere bölmek için işaretsiz bir değişken genişletme kullanabilirsiniz IFS
(joker karakter genişletmesini devre dışı bırakmanız gerekir set -f
, aksi takdirde glob desenler değerinde genişletilecektir):
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 …
Bunu, -f
ayarı ve yapılan işlemin değerini geri yükleyen bir fonksiyonda saklayabilirsiniz IFS
:
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 …