Jika Anda secara langsung menggunakan string di bawah satu forlingkaran, itu akan berfungsi per-kata (di sini pada satu kata: seluruh konten $testsejak dikutip), bukan per-karakter. Anda perlu menggunakan whileloop dengan readuntuk mengurai huruf-demi-huruf, atau untuk memperkenalkan parameter numerik yang akan diulang di atas string.
Selain itu, saat menggunakan read, Anda perlu memastikan bahwa baris baru dan ruang putih tidak diartikan sebagai pembatas dan memaksa readuntuk membaca satu karakter sekaligus.
Ini versi yang berfungsi:
#!/bin/bash
test="this is a
test"
printf %s "$test" | while IFS= read -r -N 1 a; do
if [[ "$a" == $'\n' ]] ; then
echo "FOUND NEWLINE"
fi
printf %s "$a"
done
Anda dapat mengganti $'\n'dengan $'\012'atau $'\x0a', karena semuanya mewakili kode baris baru yang sama. Tetapi tidak sama dengan \015atau \r- ini singkatan dari carriage return (kembali ke awal baris). Pada sistem Linux, baris baru diwakili menggunakan \n, tetapi pada Windows misalnya, mereka diwakili oleh urutan \r\nsebagai gantinya. Itu sebabnya jika Anda memiliki file teks dari Windows, Anda dapat mendeteksi baris baru juga dengan mencari \r.
cat | while read line; do ...; done, Anda tahu ada carriage return untuk setiap iterasi. Jika input Anda dapat berupa file\rtanpa\n, cukup ubah filetr '\r' '\n'saat memproses input. Jika Anda hanya perlu tahu jika ada beberapa baris:wc -l.