shell:将字符串转换为数组

shell:将字符串转换为数组

我正在尝试使用以下代码将字符串变量转换为数组。

#/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 -Aset -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通常支持数组,但并不需要这样做,但如果需要数组,您应该使用kshbashzsh或其他支持它们的 shell。

相关内容