
次のコードを使用して文字列変数を配列に変換しようとしています。
#/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 -a
bash専用です。 kshはread -A
bash以前に存在していました(set -A
;と一致し、set -a
Bourneシェルから継承された他のエントリであり、サポートされていzsh
ますyash
)
sh
POSIX言語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
引用する必要がありました。それ以外の場合は分割され、スペースで連結されました。$string
IFS=. read -ra <<< "$string"
答え2
hashbang/bin/sh
でスクリプトを実行していますが、herestringをsh
サポートしていません<<<
。使用すると効果があります/bin/bash
。
また、/bin/sh
配列は通常サポートされていますが必須ではありませんが、配列が必要な場合ksh
、bash
またはzsh
それをサポートする他のシェルを使用する必要があります。