이것은 무엇을 합니까? printf '\t%s\n' "$@"

이것은 무엇을 합니까? printf '\t%s\n' "$@"

더 큰 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 bashprintf에 대한 여러 페이지를 포함하여 모든 내장 명령을 표시하는 명령입니다.

man -s 1 printf외부 명령 /bin/printf의 효과를 표시하는 명령입니다. bash 내장과 매우 ​​유사하지만(동일하지는 않지만) 찾기가 더 쉽습니다.

관련 정보