【问题标题】:Shell syntax IFSShell 语法 IFS
【发布时间】:2016-08-01 16:27:08
【问题描述】:

我正在尝试运行一个简单的 shell 脚本示例:

STR="qwe;ert;rty;tii"
IFS=';' read -r NAMES <<< "$STR"

这给了我以下错误信息:

syntax error: got <&, expecting Word

我不确定为什么这不起作用。我以为我使用的语法是 正确,我尝试与其他示例进行比较,我发现语法几乎 一样的。

任何反馈都会有所帮助

谢谢

【问题讨论】:

  • 那里没有&lt;&amp;是你的代码。在提问之前,请确保您的 sn-p 确实重现了您的问题
  • ...顺便说一句,我们在几天前发布并删除了这个 exact 问题:stackoverflow.com/questions/38667961/shell-script-issue
  • 您的操作系统和确切的 shell 版本是什么?这是“Git Bash”还是其他基于 MSYS 的 Windows 版本? echo "$BASH_VERSION" 发出什么?如果将此脚本保存到文件并运行bash -x YourFileNameHere,会发出什么?
  • ...另外,最好避免使用全大写的变量名,因为变量名对 shell 和操作系统有意义。我们从那些使用PATH 作为他们自己变量之一的名称的人那里得到了太多的问题,然后想知道为什么其他方法都不起作用;使用pathstrnames 等)来避免冲突。
  • 9.4.1 不是现有的 bash 版本——在撰写本文时,最新的发布系列是 4.3.x。大概你使用的东西不是,嗯,实际上是 bash

标签: bash shell ifs


【解决方案1】:

这是 MKS bash,而不是 GNU bash。它不是真正的 bash,也不支持正版 shell 的语法。

有非常好的(...嗯,相当充足的)用于 Windows 的 GNU bash 构建。使用它们。


特别是,在真正的 bash 中,将分号分隔的字符串拆分为名称数组:

str='qwe;ert;rty;tii'
IFS=';' read -r -a names <<<"$str"

...然后您可以使用它进行验证

declare -p names

或发出一对一行

printf '%s\n' "${names[@]}"

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-06-15
    • 2022-12-08
    • 2013-10-12
    • 1970-01-01
    • 2012-09-27
    • 2021-11-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多