BASH 3 ve üstü için muhtemelen en kolay ve en güvenli yol:
var="string to split"
read -ra arr <<<"$var"
( arr
dizenin bölünmüş bölümlerini alan dizi nerede ) veya girişte yeni satırlar varsa ve yalnızca ilk satırdan daha fazlasını istiyorsanız:
var="string to split"
read -ra arr -d '' <<<"$var"
(içindeki boşluğa dikkat edin, -d ''
bırakılamaz), ancak bu size beklenmedik bir yeni satır verebilir <<<"$var"
(bu, sonuçta bir LF eklediğinden).
Misal:
touch NOPE
var="* a *"
read -ra arr <<<"$var"
for a in "${arr[@]}"; do echo "[$a]"; done
Beklenen çıktılar
[*]
[a]
[*]
çünkü bu çözüm (önceki tüm çözümlerin aksine) beklenmedik ve çoğu zaman kontrol edilemeyen mermi küreciliğine yatkın değildir.
Ayrıca bu, muhtemelen istediğiniz gibi IFS'nin tam gücünü verir:
Misal:
IFS=: read -ra arr < <(grep "^$USER:" /etc/passwd)
for a in "${arr[@]}"; do echo "[$a]"; done
Gibi bir şey çıktılar:
[tino]
[x]
[1000]
[1000]
[Valentin Hilbig]
[/home/tino]
[/bin/bash]
Gördüğünüz gibi, alanlar da bu şekilde korunabilir:
IFS=: read -ra arr <<<' split : this '
for a in "${arr[@]}"; do echo "[$a]"; done
çıktılar
[ split ]
[ this ]
IFS
BASH'de kullanımın kendi başına bir konu olduğunu lütfen unutmayın , bu yüzden testleriniz, bununla ilgili bazı ilginç konular:
unset IFS
: SPC, TAB, NL ve on line başlangıç ve bitiş işlemlerini yok sayar
IFS=''
: Alan ayırma yok, sadece her şeyi okur
IFS=' '
: SPC çalıştırmaları (ve yalnızca SPC)
Son bir örnek
var=$'\n\nthis is\n\n\na test\n\n'
IFS=$'\n' read -ra arr -d '' <<<"$var"
i=0; for a in "${arr[@]}"; do let i++; echo "$i [$a]"; done
çıktılar
1 [this is]
2 [a test]
süre
unset IFS
var=$'\n\nthis is\n\n\na test\n\n'
read -ra arr -d '' <<<"$var"
i=0; for a in "${arr[@]}"; do let i++; echo "$i [$a]"; done
çıktılar
1 [this]
2 [is]
3 [a]
4 [test]
BTW:
Alışık değilseniz $'ANSI-ESCAPED-STRING'
buna alışması, bu bir zaman kazandıran bu.
İçerir -r
(içinde olduğu gibi read -a arr <<<"$var"
) yoksa okuma ters eğik çizgi kaçar. Bu okuyucu için bir egzersiz olarak bırakılmıştır.
İkinci soru için:
Bir dizesinde şey için teste Genellikle sopa case
: (Eğer fallthrough kullanım multiplce gerekiyorsa, dava sadece ilk maçı yürütür not bu defada birden çok durum için kontrol edebilirsiniz gibi case
(kelime oyununu ifadeleri) ve bu ihtiyaç oldukça sık bir durumdur ) tasarlanmıştır:
case "$var" in
'') empty_var;; # variable is empty
*' '*) have_space "$var";; # have SPC
*[[:space:]]*) have_whitespace "$var";; # have whitespaces like TAB
*[^-+.,A-Za-z0-9]*) have_nonalnum "$var";; # non-alphanum-chars found
*[-+.,]*) have_punctuation "$var";; # some punctuation chars found
*) default_case "$var";; # if all above does not match
esac
Böylece, SPC'yi kontrol etmek için dönüş değerini aşağıdaki gibi ayarlayabilirsiniz:
case "$var" in (*' '*) true;; (*) false;; esac
Neden case
? Normal regex sekanslarından biraz daha okunabilir olduğundan ve Shell metakarakterleri sayesinde tüm ihtiyaçların% 99'unu çok iyi işler.