我有这个脚本:
#!/bin/bash
#set -x
OLD_IFS=$IFS
counter=0
while [ $counter -lt 2 ] && IFS= read -r -p "Enter row $(($counter+1)): " row; do
echo "whole row: $row"
while read -d " " char; do
echo "$char"
done <<<$row
((counter++))
done
IFS=$OLD_IFS
它从我的输入中切断了最后一个字段,但我不明白为什么:
输入:
./ex8.07.sh
Enter row 1: 1 2 3 4 5
输出:
whole row: 1 2 3 4 5
1
2
3
4
Enter row 2:
为什么在第二个“while”循环中无法访问数字5?
Bash 的数组非常适合此目的:
#!/bin/bash
counter=0
# Split on all shell word separators (space or tab)
while [[ $counter -lt 2 ]] && read -r -p "Enter row $(($counter+1)): " -a row; do
echo "whole row: ${row[*]}"
for char in "${row[@]}"; do
echo "$char"
done
((counter++))
done
我想你可以将
IFS=' '
设置为仅在空格上中断,但这取决于你。
值得注意的是,运行
IFS=... read -r ...
不会在本地范围内破坏 IFS,它只会修改 read
内置函数的调用的 IFS。