【问题标题】:IFS giving Incorrect outputIFS 给出不正确的输出
【发布时间】:2018-06-06 13:10:57
【问题描述】:

我有一个端口号文件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

请告诉我哪里做错了?

【问题讨论】:

  • 从输出看来,map.ini 或sample.sh 中可能有一个以\r 结尾的dos 行,尝试dos2unix map.inicat -ve map.ini 进行验证
  • $varPortStatus 后面的点也必须去掉,否则对%d 无效,并且 printf 中缺少\n
  • 当我执行cat -ve map.ini 时,我会在每行末尾得到^M$
  • ^M 是插入符号表示 chr 13 ascii,因为 M 是字母表中的第 13 个字母,与 \r 回车符的转义符号相同

标签: bash ifs


【解决方案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 添加到格式,.$varPortStatusreturn 之后删除,仅在函数或源脚本中有效。

【讨论】:

  • 抱歉,我忘了删除returnvarPortStatus%$'\r' 部分我没看懂,虽然是'\r'字符,一般是从哪里来的?
  • % 用于删除后缀模式,有关更多详细信息,请参阅 bash 手册中的${parameter%word}$'..' 用于 ANSI-C 引用
  • 当我打开编辑器时,无论是在 gedit 还是 vim 编辑器中,它都不显示任何内容!
  • 这是因为文本文件格式是由 vim 中的文本编辑器处理的,您应该在状态栏中看到 [dos][unix]
  • 您是指这个文档吗? GNU Org
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多