0

IFSと変数を使用して、どのように変数を「読み取る」ことができますか?

パイプでペアになっているデータをループして、分割して処理しようとしています。私が得ているエラーはread: 'site|database': not a valid identifier

SITES="abc|abc xyz|asdf"
for site in $SITES;
do
  IFS="|" read domain database <<< echo $site; # es no bueno mi amigo
  echo "Site: $domain \t\t\t Database: $database";
done;

私はこれを難しい方法でやっていますか?私はネイティブのバッシャーではありません。;)

4

4 に答える 4

1

スクリプトの問題は、 Here Stringread正しく渡していないことです。次のように行う必要があります。

IFS=$"|" read domain database <<< "$site" # es no bueno mi amigo

変数もクォートすることを忘れないでください。

その後、スクリプトが機能します。

固定スクリプトは次のとおりです。

SITES="abc|abc xyz|asdf"
for site in $SITES
do
  IFS="|" read domain database <<< "$site" # es no bueno mi amigo
  echo -e "Site: $domain \t\t\t Database: $database"
done

それは印刷します:

Site: abc                        Database: abc
Site: xyz                        Database: asdf
于 2012-09-25T12:12:27.000 に答える
1

2 つの構文を混在させています。

read a b <<<$variable

read a b < <(command)

私はこれを試してみます(いじらずに$IFS):

read domain database <<<${site/|/ }
于 2012-09-25T11:59:15.510 に答える
0

私はそれを書く方が簡単だと思います:

SITES="abc|abc xyz|asdf"
for site in $SITES
do
  domain=${site%|*}      # removes everything from '|' onward
  database=${site#*|}    # removes everything up through '|'
  echo "Site: $domain \t\t\t Database: $database"
done

および表記法の詳細については、 Bashリファレンスマニュアルの§3.5.3シェルパラメータの拡張を参照してください。${parameter%word}${parameter#word}

于 2012-09-25T11:58:42.303 に答える
0

IFS単語の分割に影響しますが、テキストは引き続き行ごとに読み取られます。ただし(レコードに改行が含まれていないと仮定すると)、次のことができます。

SITES="abc|abc xyz|asdf"
echo "$SITES" | tr \| '\012' | while read domain database; do
  echo "Site: $domain \t\t\t Database: $database";
done

最初の文を明確にするために、次の動作を検討してください。

echo "$SITES" | while read a b c; do echo "a=$a, b=$b"; done

echo "$SITES" | while IFS=\| read a b c; do echo "a=$a, b=$b"; done
于 2012-09-25T12:01:48.823 に答える