Jika Anda secara langsung menggunakan string di bawah satu for
lingkaran, itu akan berfungsi per-kata (di sini pada satu kata: seluruh konten $test
sejak dikutip), bukan per-karakter. Anda perlu menggunakan while
loop dengan read
untuk 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 read
untuk 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 \015
atau \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\n
sebagai 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\r
tanpa\n
, cukup ubah filetr '\r' '\n'
saat memproses input. Jika Anda hanya perlu tahu jika ada beberapa baris:wc -l
.