다음 코드를 사용하여 문자열 변수를 배열로 변환하려고 합니다.
#/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
에 대한 인터프리터의 구현이 하나 이상 있습니다. 언어에는 배열 <<<
이나 배열이 없습니다 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
인용해야 했습니다. 그렇지 않으면 분할되어 공백으로 연결되었습니다.$string
IFS=. read -ra <<< "$string"
답변2
hashbang /bin/sh
이고 스크립트를 실행 중이지만 herestring을 sh
지원하지 않습니다 <<<
. 사용하시면 효과가 있을 것입니다 /bin/bash
.
또한 /bin/sh
배열은 일반적으로 지원되지만 필수는 아니지만 배열이 필요한 경우 ksh
, bash
또는 zsh
이를 지원하는 다른 셸을 사용해야 합니다.