IFS给出不正确的输出

时间:2018-06-06 13:10:57

标签: bash ifs

我有一个端口号文件map.ini:

50051=1
50052=1
50053=1
50054=1
50055=1
50056=1

和脚本sample.sh,其内容为:

#!/bin/bash
file=map.ini

while IFS='=' read -r port varPortStatus
do
        if [[ $varPortStatus -eq "1" ]]; then
                printf "Available port is %s" $port
                printf "Status is %d." $varPortStatus.
                return 0
        fi
done < "$file"
echo "No port is available"

我需要的预期输出是:

Available port is 50051
Status is 1

我可以使用sedcut命令操作来完成此操作。但我需要在这里了解IFS。我输出为:

")syntax error: invalid arithmetic operator (error token is "
")syntax error: invalid arithmetic operator (error token is "
")syntax error: invalid arithmetic operator (error token is "
")syntax error: invalid arithmetic operator (error token is "
")syntax error: invalid arithmetic operator (error token is "
")syntax error: invalid arithmetic operator (error token is "
No port is available

请告诉我哪里做错了?

1 个答案:

答案 0 :(得分:1)

输出中的

似乎可能是在map.ini或sample.sh中结束\ r的dos行,请尝试使用dos2unix map.ini或cat -ve map.ini进行验证。

如果输入文件无法修改\r字符可以在bash中删除

while IFS='=' read -r port varPortStatus
do
    varPortStatus=${varPortStatus%$'\r'}
    if [[ $varPortStatus -eq "1" ]]; then
            printf "Available port is %s\n" $port
            printf "Status is %d.\n" $varPortStatus
    fi
done < "$file"

另请注意,修补了\n添加到格式,.$varPortStatus之后删除,return仅在函数或源脚本中有效。