Bash 중괄호 확장 및 변수

Bash 중괄호 확장 및 변수

찾기 명령이 있습니다.

find Directory/{Alpha,Bravo,Charlie} arg1 arg2

Alpha,Bravo,Charlie나는 로 교체하고 싶다$find_dir

find Directory/{$find_dir} arg1 arg2

그러나 후자는 다음으로 확장됩니다.

find Directory/{Alpha,Bravo,Charlie} arg1 arg2

대신에

find Directory/Alpha Directory/Bravo Directory/Charlie arg1 arg2

왜? 이는 더 많거나 더 적은 디렉터리를 가질 수 있지만 모든 디렉터리가 관련되어 있지는 않은 상당히 복잡한 bash 스크립트의 일부입니다(따라서 와일드카드 Upload/*는 작동하지 않습니다). 그래서 지금 3개를 설정하고 하나 더 추가하면 나중에 수동으로 추가해야 합니다. 또한 조회 출력을 관점에서 유지하려면 디렉터리 루트에서 실행해야 합니다(./Dir/file 대신 ./Upload/Dir/file).

하지만 변수를 사용하면 필요에 따라 변수를 변경하고 스크립트의 다른 부분과 관련성을 유지할 수 있습니다.

답변1

bash문서 에서 ,지원 확장부분:

중괄호 확장은 다른 확장보다 먼저 수행되며, 다른 확장에 고유한 문자는 결과에 유지됩니다.. 엄격하게 텍스트입니다. Bash는 확장된 컨텍스트나 중괄호 사이의 텍스트에 구문 해석을 적용하지 않습니다. 매개변수 확장과의 충돌을 피하기 위해 문자열 "${"는 중괄호 확장에 적합한 것으로 간주되지 않습니다.

또 다른 참고 사항 bash:

확장 순서는 중괄호 확장, 물결표 확장, 매개변수, 변수, 산술 확장, 명령 대체입니다. (왼쪽에서 오른쪽으로 완성), 단어 분할 및 파일 이름 확장.

그래서 당신에 관한 한,bash 봤다중괄호 확장 변수 확장 전에 먼저 중괄호 확장을 수행하고 결과를 생성합니다 {Alpha,Bravo,Charlie}.

$find_dir변수 내용을 제어할 수 있는 경우 다음을 사용할 수 있습니다 eval.

eval "find Directory/{$find_dir} arg1 arg2"

관련 정보