bash에서 튜플을 반복합니까?
bash에서 튜플을 반복 할 수 있습니까?
예를 들어 다음이 작동하면 좋을 것입니다.
for (i,j) in ((c,3), (e,5)); do echo "$i and $j"; done
어떻게 든 튜플을 반복 할 수있는 해결 방법이 있습니까?
$ for i in c,3 e,5; do IFS=","; set -- $i; echo $1 and $2; done
c and 3
e and 5
set(부터 man builtins) 사용에 대해 :
옵션 처리 후에 남아있는 모든 인수는 위치 매개 변수의 값으로 처리되며 순서대로 $ 1, $ 2, ... $ n에 지정됩니다.
는 IFS=","모든 그래서 필드 분리 세트 $i로 분할 도착 $1하고 $2정확하게한다.
이 블로그를 통해 .
편집 : @SLACEDIAMOND가 제안한 더 정확한 버전 :
$ OLDIFS=$IFS; IFS=','; for i in c,3 e,5; do set -- $i; echo $1 and $2; done; IFS=$OLDIFS
c and 3
e and 5
이 솔루션이 제출 된 다른 솔루션보다 조금 더 깨끗하다고 생각합니다. 이 bash 스타일 가이드를 참조하여 구분 기호에서 문자열을 분할하고 개별 변수에 할당하는 방법을 설명합니다.
for i in c,3 e,5; do
IFS=',' read item1 item2 <<< "${i}"
echo "${item1}" and "${item2}"
done
c=('a' 'c')
n=(3 4 )
for i in $(seq 0 $((${#c[*]}-1)))
do
echo ${c[i]} ${n[i]}
done
때때로 더 편리 할 수 있습니다.
ugly주석에 언급 된대로 부품 을 설명하려면 :
seq 0 2 는 숫자 0 1 2의 시퀀스를 생성합니다. $ (cmd)는 명령 대체이므로이 예 seq 0 2에서는 숫자 시퀀스 인을 출력 합니다. 그러나 상한선은 무엇 $((${#c[*]}-1))입니까?
$ ((something))은 산술 확장이므로 $ ((3 + 4))는 7 등입니다. 우리의 표현은 ${#c[*]}-1, 그래서 뭔가-1. 우리가 무엇을 안다면 아주 간단 ${#c[*]}합니다.
c는 배열이고, c [*]는 전체 배열이고, $ {# c [*]}는 배열의 크기이며이 경우에는 2입니다. 이제 모든 것을 롤백합니다. for i in $(seq 0 $((${#c[*]}-1)))is for i in $(seq 0 $((2-1)))is for i in $(seq 0 1)입니다 for i in 0 1. 배열의 마지막 요소에는 Array-1의 길이 인 인덱스가 있기 때문입니다.
$ echo 'c,3;e,5;' | while IFS=',' read -d';' i j; do echo "$i and $j"; done
c and 3
e and 5
연관 배열 (사전 / hashMap이라고도 함) 사용 :
declare -A pairs=(
[c]=3
[e]=5
)
for key in "${!pairs[@]}"; do
value="${pairs[$key]}"
echo "key is $key and value is $value"
done
bash4.0 이상에서 작동합니다.
언젠가 쌍 대신 트리플이 필요할 것이라고 생각되면 더 일반적인 접근 방식을 사용할 수 있습니다.
animals=(dog cat mouse)
declare -A sound=(
[dog]=barks
[cat]=purrs
[mouse]=cheeps
)
declare -A size=(
[dog]=big
[cat]=medium
[mouse]=small
)
for animal in "${animals[@]}"; do
echo "$animal ${sound[$animal]} and it is ${size[$animal]}"
done
을 설정 / 재설정하지 않고 @ eduardo-ivanec이 제공 한 답변에 따라 IFS간단히 다음과 같이 할 수 있습니다.
for i in "c 3" "e 5"
do
set -- $i
echo $1 and $2
done
출력 :
c and 3
e and 5
GNU 병렬 사용 :
parallel echo {1} and {2} ::: c e :::+ 3 5
또는:
parallel -N2 echo {1} and {2} ::: c 3 e 5
또는:
parallel --colsep , echo {1} and {2} ::: c,3 e,5
조금 더 복잡하지만 유용 할 수 있습니다.
a='((c,3), (e,5))'
IFS='()'; for t in $a; do [ -n "$t" ] && { IFS=','; set -- $t; [ -n "$1" ] && echo i=$1 j=$2; }; done
do echo $key $value
done < file_discriptor
예를 들면 :
$ while read key value; do echo $key $value ;done <<EOF
> c 3
> e 5
> EOF
c 3
e 5
$ echo -e 'c 3\ne 5' > file
$ while read key value; do echo $key $value ;done <file
c 3
e 5
$ echo -e 'c,3\ne,5' > file
$ while IFS=, read key value; do echo $key $value ;done <file
c 3
e 5
참고 URL : https://stackoverflow.com/questions/9713104/loop-over-tuples-in-bash
'IT TIP' 카테고리의 다른 글
| 현재 JavaScript의 'let'키워드를 지원하는 브라우저는 무엇입니까? (0) | 2020.11.01 |
|---|---|
| 색상 화 된 출력을 셸 리디렉션을 통해 캡처 할 수 있습니까? (0) | 2020.11.01 |
| C ++의 Qt에 파일이 있는지 확인하는 방법 (0) | 2020.11.01 |
| 'ABC'.replace ('B ','$` ')가 AAC를 제공하는 이유 (0) | 2020.11.01 |
| SET READ_COMMITTED_SNAPSHOT ON은 얼마나 걸리나요? (0) | 2020.10.31 |