더 큰 bash 스크립트를 작성 중인데 디렉토리가 존재하는지 테스트하기 위해 이 코드 조각을 찾았습니다.대소문자를 구분하지 않음
이제 subs라는 디렉토리가 있으면 이 스크립트는 경로를 인쇄하고, 디렉토리가 두 개(또는 그 이상) 있으면 해당 경로도 인쇄합니다.
그런데 인쇄 기능이 1개만 있고 루프가 없기 때문에 어떻게 해야 하는지 정말 모르겠습니다.
내 생각엔 이게 뭔가 관련이 있는 것 같아'\t%s\n' "$@"코드... 누군가 나에게 설명해줄 수 있나요? (이해하려고 노력 중)
dir=~/test1
shopt -s nullglob nocaseglob
set -- $dir/[s]ubs/
if [ "$#" -gt 0 ]; then
echo 'There is at least one directory called "subs" (case ignored):'
printf '\t%s\n' "$@"
fi
답변1
Shell printf는 인수 수만큼 이 형식을 사용합니다. 그래서 루프가 내장되어 있습니다.
문자열에 세 개의 % 문자열이 있으면 한 번에 세 개의 매개변수를 사용합니다. 마지막 라운드에서는 필요한 경우 하나 또는 두 매개변수 모두 공백/0으로 기본 설정됩니다.
"$@"는 $1, $2, ... 현재 인수를 모두 따옴표로 묶은 문자열로 확장합니다.
인쇄 형식(첫 번째 매개변수)
\t(이스케이프 t)는 탭 문자이며 8칸 들여쓰기됩니다.
%s는 사용되지 않은 다음 인수를 가져와서 문자열로 삽입합니다.
\n(이스케이프된 n)은 다음 줄이 열 아래에서 시작되도록 하는 개행 문자입니다.
man bash
printf에 대한 여러 페이지를 포함하여 모든 내장 명령을 표시하는 명령입니다.
man -s 1 printf
외부 명령 /bin/printf의 효과를 표시하는 명령입니다. bash 내장과 매우 유사하지만(동일하지는 않지만) 찾기가 더 쉽습니다.