0

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

2つの問題があるようです:

(1)ハイフン付きの$field2は空白です

(2)空白行と#で始まる行を削除する正規表現が機能していません

誰が何が悪いのか知っていますか?私が言ったように、それはOpenSuSEでうまく動作します。

ありがとう、ポール

4

3 に答える 3

3
  1. 引用は間違っています。おそらく正規表現が失敗したことを説明しています。
  2. バシズムを使用する必要はありません。
  3. 使用する必要はありませんset

試す

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

編集:使用する明白なバージョンset

while read -r line
do
    if ! test "${line%%#*}"
    then
        continue
    fi
    set -- $line
    do_stuff_with "$@"
done
于 2012-07-03T15:10:47.893 に答える
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

編集:それは間違いなくきれいなので、おそらくJoSoの答えを使用する必要があります。しかし、正規表現が失敗する理由と、OpenSuseとUbuntuの動作が異なる理由(おそらくbashのバージョンが異なる)について説明していました。

于 2012-07-03T15:11:22.827 に答える
-2

私のubuntuには、testコマンドの「=〜」のような表現はありません。これを使用してください:

if [[ $LINE = "" || ${LINE:0:1} = "#" ]] ; then
    continue;
fi
于 2012-07-03T15:10:32.523 に答える