【问题标题】:Bash script with regex not behaving on Ubuntu带有正则表达式的 Bash 脚本在 Ubuntu 上不起作用
【发布时间】:2012-07-04 01:05:46
【问题描述】:

我有一个在我的 OpenSuSE 机器上运行的 Bash 脚本,但是当复制到我的 Ubuntu 机器时,它不工作。脚本从文件中读取。该文件具有由空格(制表符和空格)分隔的字段。

#!/bin/bash
function test1()
{
    while read LINE
    do
        if [[ $LINE =~ "^$" || $LINE =~ "^#.*" ]] ; then
            continue;
        fi
        set -- $LINE
        local field1=$1
        local field2=$2
    done < test.file
}

test1

test.file 包含:

# Field1Header    Field2Header
abcdef            A-2
ghijkl            B-3

似乎有两个问题:

(1) $field2,带连字符的那个,是空白的

(2) 去除空白行和以# 开头的行的正则表达式不起作用

有人知道怎么回事吗?正如我所说,它在 OpenSuSE 上运行良好。

谢谢, 保罗

【问题讨论】:

  • 您实际上是在 bash 中运行它吗?在 Ubuntu 上,/bin/sh 不是 bash。
  • 嗨。在文件的顶部我有“#!/bin/bash”。我将为此编辑我的帖子。
  • local 在函数之外不起作用。
  • 它在一个函数中 - 上面是一个 sn-p
  • 你在这两个系统上使用的是什么版本的 Bash?

标签: regex bash ubuntu


【解决方案1】:

在我的 ubuntu 上,test 命令没有像“=~”这样的表达式。就用这个吧:

if [[ $LINE = "" || ${LINE:0:1} = "#" ]] ; then
    continue;
fi

【讨论】:

  • =~ 是用于正则表达式匹配的 Bash 运算符。如果你有 Bash,那么你就有了。 test 命令(或等效的[)不支持它,但双方括号形式支持。
【解决方案2】:
  1. 引用错误,这可能是正则表达式失败的原因。
  2. 无需使用 bashism。
  3. 无需使用set

试试

while read field1 field2 dummy
do
    if ! test "${field1%%#*}"
    then
        continue
    fi
    # do stuff here
done

EDIT:使用set的明显版本

while read -r line
do
    if ! test "${line%%#*}"
    then
        continue
    fi
    set -- $line
    do_stuff_with "$@"
done

【讨论】:

  • 谢谢。我不得不承认我不懂 %% 语法。另外,我使用 set 的原因是因为我没有固定数量的字段。我知道我的帖子建议我这样做,但我只是想尽可能简化。
  • 所以 XyProblem 反击。关于 %% 语法(这意味着“删除最大的后缀全局匹配 #*”),它是 POSIX,而不是讨厌的正则表达式 bashisms。寻找“参数扩展”
【解决方案3】:

显然,从 bash 3.2 开始,不应引用正则表达式。所以这应该有效:

#!/bin/bash
while read LINE
do
    if [[ $LINE =~ ^$ || $LINE =~ ^#.* ]] ; then
        continue;
    fi
    set -- $LINE
    local field1=$1
    local field2=$2
done < test.file

编辑:您可能应该使用 Jo So 的答案,因为它绝对更干净。但我在解释为​​什么正则表达式失败以及 OpenSuse 和 Ubuntu 之间不同行为背后的原因(很可能是不同版本的 bash)

【讨论】:

  • 天啊,这是真的! (引用man bash:Word splitting and pathname expansion are not performed on the words between the [[ and ]];)Bash 是一堆丑陋的废话,我永远不会使用这么丑陋的扩展!
猜你喜欢
  • 2021-09-28
  • 2016-08-17
  • 2011-11-01
  • 2014-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-08-25
  • 2013-06-06
相关资源
最近更新 更多