シェル:文字列を配列に変換

シェル:文字列を配列に変換

次のコードを使用して文字列変数を配列に変換しようとしています。

#/bin/sh
VERSION='1.2.3'
echo $VERSION
IFS='.' read -a array <<< "$VERSION"
echo ${#array[@]}
echo ${array[@]}

しかし、実行すると、次のエラーが発生します。sh test.sh

1.2.3
test.sh: 4: test.sh: Syntax error: redirection unexpected

バージョン:

ubuntu@jenkins-slave1:~$ $SHELL --version
GNU bash, version 4.4.19(1)-release (x86_64-pc-linux-gnu)
Copyright (C) 2016 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later         
<http://gnu.org/licenses/gpl.html>

オペレーティングシステム:

ubuntu@jenkins-slave1:~$ cat /etc/os-release
NAME="Ubuntu"
VERSION="18.04.1 LTS (Bionic Beaver)"
ID=ubuntu
ID_LIKE=debian
PRETTY_NAME="Ubuntu 18.04.1 LTS"

ベストアンサー1

<<<bashこれで、他のシェル(含む)でサポートされているzsh演算子です。

read -abash専用です。 kshはread -Abash以前に存在していました(set -A;と一致し、set -aBourneシェルから継承された他のエントリであり、サポートされていzshますyash

shPOSIX言語shへのインタプリタの実装が1つ以上あります。言語には配列<<<や配列はありませんread -a(除く"$@")。

Ubuntuでデフォルトshでインタプリタとして使用されるシェルは、POSIXが指定する拡張機能をほとんど実装していないため、POSIX仕様とdash非常によく似ています。配列や配列をsh実装しません。<<<read -a

POSIXでsh文字列をPOSIXsh配列("$@")に分割するには、次のようにします。

IFS=.             # split on .
set -o noglob     # disable glob
set -- $VERSION"" # split+glob with glob disabled.
echo "$# elements:"
printf ' - "%s"\n' "$@"

Bash関連の構文に比べていくつかの利点がありますIFS=. read -a <<< $string

  • $string一時ファイルを作成し、その中にコンテンツを保存する必要はありません。
  • $string改行文字()が含まれていても、read -a <<< $string最初の行のみを読み取ります。
  • バックスラッシュ文字が含まれている場合$stringにも機能します(を使用するには、バックスラッシュに対して特別な処理を選択する必要はreadありません)。-r
  • これは標準です。
  • と同じ値に対して機能します1.2.。 、および代わりにおよびでのみread -a <<< $string分割します。"1""2""1""2"""
  • 以前のバージョンでは()をbash引用する必要がありました。それ以外の場合は分割され、スペースで連結されました。$stringIFS=. read -ra <<< "$string"

おすすめ記事