달러 기호가 무엇인지 이해하지 못합니다. 특히 이런 맥락에서:
for url in $(cat example.txt); do host $url;
답변1
배쉬 참조 매뉴얼 배쉬 매뉴얼
3.2.4.3 그룹화 명령
Bash는 실행할 명령 목록을 하나의 단위로 그룹화하는 두 가지 방법을 제공합니다. 명령어를 그룹화하면 전체 명령어 목록에 대해 리디렉션을 적용할 수 있습니다. 예를 들어 목록에 있는 모든 명령의 출력을 단일 스트림으로 리디렉션할 수 있습니다.
()
( list )
괄호 안에 명령 목록을 넣으면 하위 쉘 환경(명령 실행 환경 참조)이 생성되고 목록의 각 명령이 하위 쉘에서 실행됩니다. 목록은 서브셸에서 실행되기 때문에 서브셸이 완료된 후에는 변수 할당이 유효하지 않습니다.
이는 다음과 다릅니다
$
.
3.5.4 명령 대체
명령 대체를 사용하면 명령 출력이 명령 자체를 대체할 수 있습니다. 명령 대체는 명령이 다음과 같이 괄호로 묶인 경우 발생합니다.
$(command)
3.2.4.1 루프 구조
for
for 명령의 구문은 다음과 같습니다.
for name [ [in [words …] ] ; ] do commands; done
단어를 확장하고 현재 멤버에 바인딩된 이름을 사용하여 결과 목록의 각 멤버에 대해 명령을 한 번씩 실행합니다. 'in Words'가 없으면 for 명령은 'in "$@"'가 지정된 것처럼 설정된 각 위치 인수에 대해 한 번 실행됩니다(특수 매개변수 참조). 반환 상태는 마지막으로 실행된 명령의 종료 상태입니다. 확장이라는 단어에 항목이 없으면 명령이 실행되지 않으며 반환 상태는 0입니다.
example.txt에 다음 콘텐츠가 포함되어 있다고 가정합니다.
www.google.com
www.youtube.com
www.facebook.com
귀하의 명령은 다음을 수행합니다.
url=www.google.com
host www.google.com
url=www.youtube.com
host www.youtube.com
url=www.facebook.com
host www.facebook.com
host
URL의 IP 주소를 반환하는 명령입니다.
답변2
그건명령 대체통사론. 대괄호 안의 명령을 가져와 실행한 다음 해당 명령의 출력(표준 출력)을 가져와 명령 문자열의 해당 부분으로 바꿉니다. 이 예에서 이에 의존하는 까다로운 부분은 두 가지입니다.
- 인용되지 않았기 때문에 결과는 파일 이름 확장의 영향을 받습니다. 따라서 example.txt의 일부에 기존 파일 이름과 일치하는 패턴이 포함되어 있으면 패턴/문자열 대신 해당 파일 이름을 얻게 됩니다.
- $IFS 변수를 기반으로 결과를 단어로 분할합니다. example.txt에 "a filename.txt"와 같은 파일 이름이 포함되어 있으면 외부
for
루프는둘매개변수 -a
아마도filename.txt
잘못된 일을 할 수도 있습니다.
사람들이 파일 이름 패턴이나 공백(또는 탭)을 포함하지 않기 위해 example.txt의 내용에 의존하기 때문에 이 예를 자주 볼 수 있습니다.
이 oneliner의 결과는 example.txt에서 가정된 도메인 이름을 반복하여 DNS 조회를 수행하는 것입니다.
답변3
bash
코드를 이해하려면 -x
옵션을 설정하는 것이 매우 도움이 되는 경우가 많습니다.
set -x # within a script / function
또는 스크립트를 호출할 때:
bash -vx ./script.sh
이는 루프에 대해서는 덜 유용합니다. 그러나 언제든지 명령의 첫 번째 부분을 사용하여 다음을 수행할 수 있습니다.
echo for url in $(cat example.txt)
이것은 거기에서 무슨 일이 일어나고 있는지를 보여줍니다(적어도 결과는).
이 기능을 "명령 대체"라고 합니다. 이는 $(...)
명령의 출력으로 대체됩니다 (후행 줄 바꿈 없음).
bash -n ./script.sh
구문 오류가 표시됩니다. done
코드 끝에 무엇이 빠졌는지 지적해 줄 것입니다 .