쉘: 문자열을 배열로 변환

쉘: 문자열을 배열로 변환

다음 코드를 사용하여 문자열 변수를 배열로 변환하려고 합니다.

#/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)

sh이제 POSIX 언어 sh에 대한 인터프리터의 구현이 하나 이상 있습니다. 언어에는 배열 <<<이나 배열이 없습니다 read -a( 제외 "$@").

Ubuntu에서 기본적으로 sh인터프리터로 사용되는 셸은 POSIX 가 지정하는 확장 기능을 거의 구현하지 않으므로 POSIX 사양과 dash매우 유사합니다 . 배열 이나 배열을 sh구현하지 않습니다 .<<<read -a

POSIX에서 sh문자열을 POSIX sh배열( "$@")로 분할하려면 다음을 사용할 수 있습니다.

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"

답변2

hashbang /bin/sh이고 스크립트를 실행 중이지만 herestring을 sh지원하지 않습니다 <<<. 사용하시면 효과가 있을 것입니다 /bin/bash.

또한 /bin/sh배열은 일반적으로 지원되지만 필수는 아니지만 배열이 필요한 경우 ksh, bash또는 zsh이를 지원하는 다른 셸을 사용해야 합니다.

관련 정보