我正在尝试使用以下代码将字符串变量转换为数组。
#/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
<<<
是一个 zsh 运算符,现在受到其他一些 shell(包括bash
)的支持。
read -a
是 bash 特定的。 kshread -A
早在 bash 之前就有了(与 一致set -A
;set -a
是从 Bourne shell 继承的其他东西;也受zsh
和支持yash
)
sh
现在是 POSIXsh
语言的解释器的一个或另一个实现。该语言既没有<<<
也没有read -a
也没有数组(除了"$@"
)。
在 Ubuntu 上,默认情况下,用作sh
解释器的 shelldash
非常接近 POSIXsh
规范,因为它对 POSIX 指定的内容实现了很少的扩展。它既不实现<<<
,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
并且正在运行脚本sh
,它不支持<<<
herestring。如果你使用/bin/bash
它就会起作用。
此外,虽然/bin/sh
通常支持数组,但并不需要这样做,但如果需要数组,您应该使用ksh
、bash
、zsh
或其他支持它们的 shell。