【问题标题】:IFS variable issue in script with Unicode [closed]Unicode脚本中的IFS变量问题[关闭]
【发布时间】:2011-03-07 08:57:37
【问题描述】:

我在 shell 脚本中使用IFS 变量来解析一些数据(数据已经以给定的格式提供给我)。由于默认的 IFS 是空格/制表符/等,我使用字符 '¬' 来分隔输入文件行中的字段。数据类似于

14352345¬AFSFDG1234¬text¬(http://www.google.com,3)(http://www.test.com,2)¬(www.test2.com,4)¬123-23432

我创建了一个脚本,该脚本使用 IFS 变量将文件通过管道传输到 while 循环中:

#!/bin/bash;
while IFS=¬ read -r sessionId qId testResults realResults queryId;
do echo $sessionId; done < inputFile

(在这个循环中,我实际上对另一个文件进行了一些 awk 处理)。

如果我手动运行这个文件(只是 ./file),它会完美运行。如果我将它作为脚本(cron)的一部分或在另一个脚本中运行,我会收到解析错误,这表明我的 IFS 变量没有被使用。我尝试过复制旧的 IFS 变量并在解析后重置以及传入 IFS 变量的不同方式(¬'¬'$'¬' 等,但似乎没有帮助)。

任何指针/提示将不胜感激。


更新:经过一些额外的调试,问题出在 awk 语句而不是分隔符

【问题讨论】:

    标签: bash shell variables ifs


    【解决方案1】:

    您的 Unicode 有问题,或者您尝试使用的 shell 有问题,前者的可能性更大。

    您选择作为分隔符的字符 (¬) 在 ASCII 集之外,并且(通常)可以由计算机以两种不同的方式表示:将被编码为 latin1 或类似字符,其中字符占用一个八位字节,否则将被编码为 UTF-8 并使用两个八位字节。还有其他可能,但这两种可能性最大,请耐心等待。

    如果您保存了编码为 UTF-8 的脚本并且您尝试在非 unicode 语言环境中运行它,shell 将获得两个(错误)字符作为分隔符,而不是一个。要对此进行测试,请尝试使用 ascii 字符作为分隔符,例如 ~

    如果您发现使用 ~ 有效,则必须查看系统的全局配置,并确保您用于创建脚本的环境中的语言环境相同,因为它是在脚本运行的环境中。您可以执行locale 命令来执行此操作。您可以创建一个脚本来运行此命令并将其输出存储在一个文件中:

    #!/bin/sh
    locale > /tmp/locale-env
    

    然后,例如,让它从 cron 运行,并查看 /tmp/locale-env 文件。当您从交互式 shell 运行它时,将其内容与 locale 的输出进行比较。根据您的发行版,您可以在/etc/environment/etc/profile 或其他位置设置您的全球区域设置。您可能希望在系统范围内使用 UTF-8:

    LANG=en_US.UTF-8
    export LANG
    

    这是一个我们国际用户往往比说英语的用户更了解的陷阱,因为 ASCII 和 UTF-8 对于英文字符完全相同,而这些问题往往被忽视。

    【讨论】:

    • 谢谢。实际上,我对您的建议采取了不同的态度,并使用了一些非 unicode 分隔符!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-02-07
    • 2015-05-29
    • 2013-03-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多