BASH 3 ve üstü için muhtemelen en kolay ve en güvenli yol:
var="string to split"
read -ra arr <<<"$var"
( arrdizenin 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 ]
IFSBASH'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.