为什么我的脚本会截断最后一个输入值?

问题描述 投票:0回答:1

我有这个脚本:

#!/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 echo
1个回答
0
投票

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。

© www.soinside.com 2019 - 2024. All rights reserved.