Dalam bash, bagaimana cara melewatkan input while ke perintah cut?

2

Bagaimana cara melewatkan $ line ke perintah cut dengan benar di loop ini?

while read line
do
    login= $(cut -d : -f 1)

done < /etc/passwd

Saya tidak bisa melakukannya $(cut -d : -f 1 $line) jadi apa cara yang benar?

Mike
sumber

Jawaban:

1

Anda sebenarnya tidak memerlukan loop sementara jika niat Anda hanya untuk membuat daftar nama. Juga ada kesalahan sintaks setelah login=, seharusnya tidak ada ruang.

cut -d: -f1 /etc/passwd | \
while read login; 
do 
    echo username: $login;
done

atau ketika Anda mencoba:

while read line; do
   login=$(echo $line | cut -d : -f 1)
   echo $login
done < /etc/passwd

bahkan lebih baik:

db-getent passwd |cut -d: -f1 | xargs -L1 echo name:
Ярослав Рахматуллин
sumber
1
+1 untuk getent. Dalam contoh pertama Anda, kelanjutan garis tidak diperlukan setelah pipa.
glenn jackman
Sempurna! Terima kasih Ярослав, loop adalah potongan kode dari loop sementara yang lebih besar sehingga saran kedua Anda cocok untuk saya.
Mike
3

Biarkan read perintah bersama dengan shell IFS variabel menguraikan baris untuk Anda:

while IFS=: read -r login restOfLine; do
    doSomethingWith $login
done < /etc/passwd

Untuk menjawab pertanyaan Anda, bash-string di sini akan bermanfaat:

login=$(cut -d: -f1 <<< "$line")
glenn jackman
sumber
Senar di sini bagus dan rapi. Aku suka itu! Tepuk tangan.
Mike
2

Menggunakan gema :

login=$(echo "$line" | cut -d : -f 1)
Dennis
sumber