예:
$ eval echo "{x,y,z}\ --opt\; "
x --opt; y --opt; z --opt;
두 번째 목록이 {1,2,3}
이고 그 길이가 첫 번째(초기) 목록의 길이와 같다고 가정합니다.
질문:
- 농산물을 만드는 방법
bash
:
x --opt 1; y --opt 2; z --opt 3;
- 제품을 만드는 방법
bash
(예: 목록의 요소 참조{x,y,z}
):
x --opt x; y --opt y; z --opt z;
단일 안감이 선호됩니다.
답변1
브레이크 확장은 가능한 모든 쌍을 생성하며 두 목록을 병렬로 순회하지 않습니다.
$ echo {x,y,z}' --opt; '{1,2,3}
x --opt; 1 x --opt; 2 x --opt; 3 y --opt; 1 y --opt; 2 y --opt; 3 z --opt; 1 z --opt; 2 z --opt; 3
원하는 출력을 생성하려면 다른 것을 사용해야 합니다. 예를 들어 배열의 인덱스를 반복하는 경우는 다음과 같습니다.
#! /bin/bash
opt1=(x y z)
opt2=(1 2 3)
for i in "${!opt1[@]}" ; do
printf '%s --opt %s; ' "${opt1[i]}" "${opt2[i]}"
done
echo
또는 연관 배열을 사용하십시오.
#! /bin/bash
declare -A opts=([x]=1 [y]=2 [z]=3)
for i in "${!opts[@]}" ; do
printf '%s --opt %s; ' "$i" "${opts[$i]}"
done
echo
답변2
초로바지적을 사용하면 {x..z}' --opt '{1..3}';'
가능한 모든 문자열 조합이 생성됩니다.
가능한 모든 조합(1~9) 목록에서 1, 5, 9의 네 가지 조합이 모두 필요합니다.
set -- {x..z}' --opt '{1..3}';'
eval echo '${'{1..9..4}'}'
또는 배열을 사용하여 요소 0, 4, 8을 가져옵니다.
strings=( {x..z}' --opt '{1..3}';' )
eval echo '${strings['{0..8..4}']}'
나는 결코 이와 같은 실제 코드를 작성하지 않을 것이며 위의 코드에 의해 생성된 문자열은 쉘에 의해 명시적으로 분할되어야 하기 때문에 실제 명령/인수로 사용하기에는 실제로 쓸모가 없습니다.
이 코드는 순전히 흥미로운 정보로 제공됩니다.