Bash 중괄호 "바인딩"

Bash 중괄호 "바인딩"

배쉬에서는

echo a{b,c}d{e,f}

인쇄

abde    abdf    acde    acdf

내가보고 싶은 출력은

abde    acdf

즉, 주어진질소Bash가 사용하기를 원하는 매개변수구성할 각 중괄호 쌍 내의 첫 번째 매개변수질소끈.

답변1

이 작업을 수행하려면 배열을 사용합니다.

$ foo=( b c ); bar=( e f ); for i in {0..1}; do echo a${foo[$i]}d${bar[$i]}; done
abde
acdf

실제 사용 사례는 좀 더 복잡하다고 가정하므로 다른 명령을 사용하여 배열을 채우고 해당 크기를 반드시 알 수 없는 경우 다음을 사용할 수 있습니다.

foo=( b c ); bar=( e f ); for i in $(seq 0 $((${#foo[@]}-1))); do 
   echo a${foo[$i]}d${bar[$i]}; 
done

답변2

이것은 어리석은 대답이지만 어쨌든 :

$ echo a{b,c,d}e{f,g,h} | awk 'BEGIN {N=3;} { for (i=0; i<N; i++) { print $(i*N+i+1) } }'

$ echo a{b,c,d,1}e{f,g,h,2} | awk 'BEGIN {N=4;} { for (i=0; i<N; i++) { print $(i*N+i+1) } }'

$ echo a{b,c,d,1,A}e{f,g,h,2,Z} | awk 'BEGIN {N=5;} { for (i=0; i<N; i++) { print $(i*N+i+1) } }'

답변3

중괄호 작동 방식을 변경할 수 없습니다.

예를 들어 문자열이 텍스트에 나타나지 않으면 ,배열에 연속적인 문자열 대체를 적용할 수 있습니다.

a=(,b,e @c,f)
a=("${a[@]/,/a/}")
a=("${a[@]/,/d}")
echo "${a[@]}"

그러나 루프가 더 명확해집니다. 부품을 서로 연결하려면 문자열에 표시되지 않는 구분 기호를 사용할 수 있습니다. ,예를 들어 중괄호 안에는 특별한 기능이 있습니다.

a=(); IFS=,; set -f
for x in b,e c,f; do
  a+=(a${x%*,}d${x#*,})
done

또 다른 접근 방식은 두 개의 병렬 배열을 정의하는 것입니다.

version=(test main)
files=(AppTest.java App.java)
for ((i=0; i<${#files}; i++) rm "src/$version[i]/java/org/sonatype/mavenbook/files[i].java"

내 생각에 이 특정 명령을 처리하는 가장 쉬운 방법은 함수를 정의하는 것입니다.

rmapp () { rm "src/$1/java/org/sonatype/mavenbook/$2.java"; }

관련 정보