Linux bash : 다중 변수 할당


121

PHP의 다음 코드와 유사한 Linux bash에 존재합니까?

list($var1, $var2, $var3) = function_that_returns_a_three_element_array() ;

즉, 한 문장에서 해당 값을 3 개의 다른 변수에 할당합니다.

myBashFuntion"qwert asdfg zxcvb"문자열을 stdout에 쓰는 bash 함수가 있다고 가정 해 보겠습니다. 다음과 같이 할 수 있습니까?

(var1 var2 var3) = ( `myBashFuntion param1 param2` )

등호 왼쪽 부분은 물론 유효한 구문이 아닙니다. 나는 단지 내가 요구하는 것을 설명하려고 노력하고있다.

하지만 작동하는 것은 다음과 같습니다.

array = ( `myBashFuntion param1 param2` )
echo ${array[0]} ${array[1]} ${array[2]}

그러나 인덱스 배열은 일반 변수 이름만큼 설명 적이 지 않습니다.
그러나 다음과 같이 할 수 있습니다.

var1 = ${array[0]} ; var2 = ${array[1]} ; var3 = ${array[2]}

그러나 이것들은 내가 피하고 싶은 세 가지 진술입니다.

바로 가기 구문을 찾고 있습니다. 가능할까요?

답변:


222

내 마음에 가장 먼저 떠오르는 것 :

read -r a b c <<<$(echo 1 2 3) ; echo "$a|$b|$c"

출력은 당연히

1|2|3

4
어쨌든 첫 번째 변수에 공백이 포함되어 있으면 작동하도록 할 수 있습니까?
Rucent88 2014 년

7
@Michael Using read -d "\n" v1 v2 <<<$(cmd)은 완벽하게 작동합니다. 감사합니다!
Rucent88 2014 년

1
@LeeNetherton, 좋은 지적이지만 echo 명령의 반환 상태가 필요한지 확실하지 않습니다. 100 % 확실하지 않습니다.
Michael Krelin-해커

4
@ MichaelKrelin-hacker,의 반환 상태 echo는 무의미하지만이 기술을 사용하여 반환 상태에 관심이있는 스크립트에서 여러 값을 반환했습니다. 나는 내 발견을 공유 할 것이라고 생각했다.
Lee Netherton 2015-10-22

1
안전을 위해 당신은 사용해야합니다 read -r:do not allow backslashes to escape any characters
톰 헤일

18

값을 배열에 할당하고 싶었습니다. 그래서 Michael Krelin의 접근 방식을 확장하여 다음과 같이했습니다.

read a[{1..3}] <<< $(echo 2 4 6); echo "${a[1]}|${a[2]}|${a[3]}"

결과 :

2|4|6 

예상대로.


2
값을 배열에 넣으려면 이미 질문에서 언급 한 간단한 솔루션이 있습니다.a=( $(echo 2 4 6) ) ; echo ${a[0]} ${a[1]} ${a[2]}
GetFree

예, 저는 그것을 간과했습니다. 그러나 내 제안이 더 큰 배열을 할당하는 데 더 적합하다고 주장합니다.
soundray

@soundray 귀하의 솔루션은 확장 및 herestring을 사용하며 bash는 해당 시나리오에서 잘 수행 될 것이라고 의심하지만 확인하지 않았습니다.
Camilo Martin

안전을 위해 당신은 사용해야합니다 read -r:do not allow backslashes to escape any characters
톰 헤일

5

도움이 될 것 같아요 ...

스크립트에서 사용자가 입력 한 날짜 (mm / dd / yyyy)를 분석하기 위해 일, 월, 연도를 배열에 저장 한 다음 값을 다음과 같이 별도의 변수에 넣습니다.

DATE_ARRAY=(`echo $2 | sed -e 's/\// /g'`)
MONTH=(`echo ${DATE_ARRAY[0]}`)
DAY=(`echo ${DATE_ARRAY[1]}`)
YEAR=(`echo ${DATE_ARRAY[2]}`)

4 개의 서브 쉘과 추가 sed 프로세스를 피하고 한 줄로 모든 작업을 수행하십시오.IFS=/ read -r m d y < <(echo 12/29/2009)
Amit Naidu

5

때로는 펑키 한 일을해야합니다. 명령 (예 : SDGuero의 날짜 예)에서 읽기를 원하지만 여러 포크를 피하고 싶다고 가정 해 보겠습니다.

read month day year << DATE_COMMAND
 $(date "+%m %d %Y")
DATE_COMMAND
echo $month $day $year

read 명령으로 파이프 할 수도 있지만 하위 쉘 내에서 변수를 사용해야합니다.

day=n/a; month=n/a; year=n/a
date "+%d %m %Y" | { read day month year ; echo $day $month $year; }
echo $day $month $year

결과 ...

13 08 2013
n/a n/a n/a

read명령은 중괄호로 인해 서브 쉘에서 발생하지 않습니다. 파이프의 오른쪽에 읽기 명령이 있기 때문입니다. 당신은 실행해야 read처럼 당신이 할 수있는, 현재 쉘에서 명령을read day month year <<< `date "+%d %m %Y"`
공압

아니요- read 발생 하지만 파이프 라인의 하위 쉘이 종료되면 읽는 변수의 범위가 범위를 벗어납니다.
Otheus

1
내 의견은 이유에 대해이었다 읽기가 서브 쉘에서 일어나는, 나는 당신이 쓴 오해 지금 알고 있습니다. 복합 명령문 주위에 중괄호를 사용했기 때문에 하위 쉘이 생성되었음을 의미한다고 생각했습니다. 그러나! 그 예제를 준 이유는 포크를 피하기 위해서 였지만 서브 쉘도 포크하지 않을까요?
pneumatics

첫 번째 예제에는 정확히 하나의 포크가 필요합니다. 그래야 bash가 date 명령을 시작할 수 있습니다. 두 번째 예에서는 날짜와 하위 셸 사이에 파이프 라인을 설정합니다. 나는 요즘 bash가 실제로 서브 쉘로 들어 가지 않을만큼 영리하다고 생각하지만, 그것에 대해 확신하지 못한다. 여하튼, 그럴 같습니다 :)
Otheus

0

O'Reilly 의 Bash Cookbook 5 장 에서는 '='기호 주위에 공백이 없어야한다는 변수 할당의 요구 사항에 대한 이유를 설명합니다.

MYVAR="something"

설명은 명령의 이름과 변수를 구별하는 것과 관련이 있습니다 ( '='는 유효한 인수 일 수 있음).

이 모든 것은 사건 후 정당화하는 것과 비슷해 보이지만 어떤 경우에도 변수 목록에 할당하는 방법에 대한 언급은 없습니다.


네, 알아요. 가독성을 위해 여기 저기에 공백을 추가했습니다.
GetFree 2009-12-23

실제로 그것은 좋지 않은 동기입니다. 만약 ' ;'가 유효한 인수 라면 어떨까요? 내가 쓸 ls ; cd때 여전히 전화 ls하고 cd공백에도 불구하고. 내가 전화 목록 디렉토리를 원하는 경우 ;cd그냥 입력 할 수 있습니다 ls ';' cd.
PieterNuyts
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.