이 명령은 을 echo {1..3}-{1,2}
인쇄합니다 1-1 1-2 2-1 2-2 3-1 3-2
. 중괄호가 어떻게 사용되는지 이해합니다. 하지만 실제로는 무엇입니까?예그들을?
sh
/의 임무는 bash
그것들을 구문 분석/확장하고 확장된 버전을 실행 프로그램에 전달하는 것입니까?
그렇다면 그 밖에 무엇을 할 수 있으며 사양이 있습니까?
게다가 이름도 있나요?
ls *.txt
인테리어도 비슷한 방식으로 처리되나요?
n번 반복되는 인수를 구현하는 방법이 있나요? 예를 들어 (물론 작동하지 않습니다. 단지 개념일 뿐입니다): cat test.pdf{*3}
⇒ cat test.pdf test.pdf test.pdf
?
답변1
그들이 전화한다버팀대 확장.
bash
이는 zsh
, 및 에 의해 수행된 여러 확장자 중 하나 이며 ksh
, 그 중 파일 이름 확장자 *.txt
는 또 다른 것입니다. 중괄호 확장은 POSIX 표준에 포함되지 않으므로 이식성이 없습니다. 이 내용은 다음에서 읽을 수 있습니다.배쉬 매뉴얼.
@Arrow의 제안에 따라 중괄호 확장만 사용하려면 cat test.pdf test.pdf test.pdf
다음 "해킹"을 사용해야 합니다.
#cat test.pdf test.pdf
cat test.pdf{,}
#cat test.pdf test.pdf test.pdf
cat test.pdf{,,}
#cat test.pdf test.pdf test.pdf test.pdf
cat test.pdf{,,,}
몇 가지 일반적인 용도:
for index in {1..10}; do
echo "$index"
done
touch test_file_{a..e}.txt
또는 문자열을 10번 인쇄하는 또 다른 "해킹":
printf -- "mystring\n%0.s" {1..10}
버팀대 확장이 bash
완료되었습니다.앞으로매개변수 확장이므로 흔히 저지르는 실수는 다음과 같습니다.
num=10
for index in {1..$num}; do
echo "$index"
done
( ksh93
그러나 쉘은 이 문제를 처리할 수 있습니다)
답변2
페사의 답변답변은 질문의 중요한 측면을 다룹니다. 몇 가지 추가하고 싶은 사항이 있습니다.
별표는 ls *.txt
쉘에 의해 처리되므로 쉘 내장 기능을 통해 변경할 수 있는 쉘 옵션에 의해 제어됩니다. 이 경우 를 실행하여 별표 확장을 비활성화 set -f
하고 를 실행하여 다시 활성화할 수 있습니다 set +f
.
또 다른 점은 스크립트를 이식 가능하게 만들고 싶은 사람은 누구나 POSIX 표준을 확인해야 한다는 것입니다. 예를 들어 {1..9..2}
4로 확장되지만 1 3 5 7 9
하위 bash
버전 bash
이나 sh
.