Bash 스크립트에서 출력 형식을 정리하세요.

Bash 스크립트에서 출력 형식을 정리하세요.

특정 스크립트에서 코드 형식을 유지하면서 런타임에 출력 형식을 지정하는 데 문제가 있습니다. 다음은 나에게 효과적이었습니다. 그것이 의미가 있는지 확인하고 싶었습니까? 코드가 약간 엉망인 것 같고 더 나은 솔루션에 관심이 있습니다. 몇 줄의 형식을 지정하기 위해 가능한 모든 사용 사례를 처리하는 지나치게 복잡한 bash 함수를 만들고 싶지 않습니다. 저는 깔끔한 코드와 예측 가능한 출력을 허용하는 이식 가능한 솔루션에 관심이 있습니다.

printf "\nLine one....
Line 2 - output on next line
Line 3, output on its own newline"

printf가 들여쓰기를 포함한 개행 문자를 자동으로 선택하여 파일의 출력 형식을 쉽게 지정할 수 있지만 들여쓰기된 블록에서 작업하는 경우 이는 스크립트의 형식 지정에 영향을 미칠 수 있습니다.

if [ $# -ne 1 ]; then
  printf "\nLine one...
Line 2 - output on next line
Line 3, output on its own newline"
fi

블록 내에서 라인 2와 3을 적절하게 들여쓰면 printf는 공백(탭)을 선택하여 런타임에 이를 스크립트 메시지에 출력합니다.

이와 같은 작업을 수행하고 줄을 분할하되 스크립트와 출력의 서식을 유지할 수 있습니까? 나는 줄 너비를 80자 미만으로 유지하고 싶습니다. 이는 합리적인 것이지만, 개행에서 따옴표를 자동으로 누락시키는 대신 \n을 제어하여 개행을 제어하는 ​​printf 형식을 정상적으로 사용하고 싶습니다. 여러 개의 printf 문이 이를 수행하는 유일한 방법입니까?

이 줄 아래의 코드를 편집/해결하세요


아래 l0b0의 허용된 답변을 참조하면 %s가 아닌 %b 매개 변수를 사용하고 작은 따옴표 대신 큰 따옴표로 'lines' 변수를 초기화했습니다. %b 인수를 사용하면 printf가 내 줄의 이스케이프 시퀀스를 구문 분석할 수 있으며 큰따옴표를 사용하면 성공/오류 메시지의 컬러 출력을 단순화하기 위해 이전에 만든 로컬 변수를 전달할 수 있는 것 같습니다.

RED=$(tput setaf 1)
NORMAL=$(tput sgr0)
lines=( "\nEnter 1 to configure vim with the Klips repository, any other value to exit." \
  "The up-to-date .vimrc config can be found here: https://github.com/shaunrd0/klips/tree/master/configs" \
  "${RED}Configuring Vim with this tool will update / upgrade your packages${NORMAL}\n")

printf '%b\n' "${lines[@]}"
read cChoice

이 질문에서 들여쓰기/간격을 명확히 하기 위해 vim은 .vimrc에서 다음 줄을 사용하여 탭을 공백으로 확장하도록 구성되어 있습니다.

" Double-quotes is a comment written to be read
" Two Double-quotes ("") is commented out code and can be removed or added

" Set tabwidth=2, adjust Vim shiftwidth to the same
set tabstop=2 shiftwidth=2 

" expandtab inserts spaces instead of tabs
set expandtab 

답변1

들여쓰기에 탭을 사용하는 경우(지금은 거의 멸종됨) 이 트릭을 사용할 수 있습니다문서는 다음과 같습니다.

if …
then
    cat <<- EOF
        first
        second
    EOF
fi

해당 명령에서 네 개의 공백을 탭으로 바꾸면 와 동일하게 인쇄됩니다 printf '%s\n' first second.

즉 말하자면,printf '%s\n' …더 간단한 해결책일 수도 있습니다– 각 줄이 분리되도록토론도착하다 printf:

$ lines=('Line one...' 'Line 2 - output on next line' 'Line 3, output on its own newline')
$ printf '%s\n' "${lines[@]}"
Line one...
Line 2 - output on next line
Line 3, output on its own newline

관련 정보