【问题标题】:syntax error near unexpected token `{​ - bash意外标记 `{​ - bash 附近的语法错误
【发布时间】:2021-07-11 18:01:36
【问题描述】:
​​​​​defineColumns() {
​​​​​​​    shift
    local dirfun=${​​​​​​​​1:-"/var/log/was/dial"}​​​​​​​​
    local basefun=${​​​​​​​​2:-"$logdir/party_info.$(date +%y%m%d%H%M%S)"}​​​​​​​​
    touch $logbase_bcdb
    info $dirfun $basefun
    # Run steps sequentially
    loadData
}

我正在编写一个 shell 脚本代码,其中我编写了多个函数。上面的函数抛出错误为: 意外标记 `{​ 附近的语法错误 代码有什么问题?

【问题讨论】:

  • 检查您的代码是否有不可打印的字符:cat -A file
  • 我没找到你!能详细点吗?
  • @Aviator 至少在这里发布,您的代码有一堆零宽度空格字符。这些通常是不可见的,但它们会弄乱 shell 语法。就个人而言,我建议使用LC_ALL=C cat -vet filename 使文件中所有通常不可见的内容可见——通常,唯一的变化是每行末尾的$(表示换行符标记行尾) ,但在这种情况下,我到处都能看到M-bM-^@M-^K(这是用于零宽度空间的 UTF-8 代码的表示)。
  • 我看到很多 M-bM-^@M-^K 但如何删除它们?
  • stackoverflow.com/a/43108392/8577085 从文件中删除所有不可打印的字符

标签: bash shell


【解决方案1】:

代码中有非打印字符:Unicode U+200B ZERO WIDTH SPACE。删除它们,您应该会没事的。

首先要查看它们,您可以使用cat -A,但它会将这些字符显示为M-bM-^@M-^K,这让 IMO 感到困惑。我宁愿阅读 Python ascii() 表示,所以这里有一个快速脚本:

import fileinput

for line in fileinput.input():
    print(ascii(line))

将其保存为 ascii_lines.py,然后使用您的脚本名称运行:

$ python3 ascii_lines.py filename.sh
'\u200b\u200b\u200b\u200b\u200bdefineColumns() {\n'
'\u200b\u200b\u200b\u200b\u200b\u200b\u200b    shift\n'
'    local dirfun=${\u200b\u200b\u200b\u200b\u200b\u200b\u200b\u200b1:-"/var/log/was/dial"}\u200b\u200b\u200b\u200b\u200b\u200b\u200b\u200b\n'
'    local basefun=${\u200b\u200b\u200b\u200b\u200b\u200b\u200b\u200b2:-"$logdir/party_info.$(date +%y%m%d%H%M%S)"}\u200b\u200b\u200b\u200b\u200b\u200b\u200b\u200b\n'
'    touch $logbase_bcdb\n'
'    info $dirfun $basefun\n'
'    # Run steps sequentially\n'
'    loadData\n'
'}\n'

然后要删除它们,您可以使用 sed,虽然它不知道 Unicode,所以我在这里使用 Bash $'' 字符串来解决这个问题。

$ sed -i $'s/\u200b//g' filename.sh

之后:

$ python3 ascii_lines.py filename
'defineColumns() {\n'
'    shift\n'
'    local dirfun=${1:-"/var/log/was/dial"}\n'
'    local basefun=${2:-"$logdir/party_info.$(date +%y%m%d%H%M%S)"}\n'
'    touch $logbase_bcdb\n'
'    info $dirfun $basefun\n'
'    # Run steps sequentially\n'
'    loadData\n'
'}\n'

【讨论】:

    猜你喜欢
    • 2014-02-26
    • 2018-12-18
    • 2014-01-20
    • 2015-12-11
    • 2021-07-29
    • 2014-06-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多