쉘 스크립트에서 공백을 인쇄하는 방법

쉘 스크립트에서 공백을 인쇄하는 방법

고정 너비 콘솔 출력에 패딩을 제공하기 위해 특정 개수의 "공백" 문자를 인쇄하는 셸 함수를 구현하려고 합니다.

#!/bin/bash

function printWhiteSpaces
{
  local i="122"
  local len="$1"
  local whitespace=' '
  local k=`expr $i - $len`
  while [ $k -gt 0 ]
  do
    echo "${whitespace}"
    ((k--))
  done
}

위의 함수는 매개변수를 "무언가의 길이"로 받아들인 다음 원하는 필드 너비(122)와 매개변수 사이의 차이를 가져옵니다 $1. 인쇄하고 싶어요저것공백 문자가 많습니다.

왜 공백이 인쇄되지 않습니까? 위 기능에 대한 해결방법이나 개선사항이 있으신 분은 공유 부탁드립니다. 특히 공백 문자를 연결하여 인쇄하는 이 함수를 작성하는 더 좋은 방법이 있는지 궁금합니다.

지금까지의 솔루션:

#!/bin/bash

function printWhiteSpaces
{
  local i="122"
  local len="$1"
  local k=`expr $i - $len`
  local whitespace=' '
  while [ $k -gt 0 ]
  do
    echo -n "${whitespace}"
    ((k--))
  done
}

답변1

귀하의 목표가 고정된 공백 채우기 필드 길이로 문자열 변수를 인쇄하는 것이라면 printf다음 함수를 사용하는 것이 좋습니다 bash.

printf "%122s" "$myvar"

$myvar내용은 왼쪽에 인쇄되며 총 122자를 채울 수 있는 충분한 공간이 남습니다.

다음의 간단한 테스트를 시도해 보십시오(가독성을 위해 필드 너비는 20으로 간주됩니다).

~> myVar="Hi, there!"; printf '%20s\n' "$myVar"
          Hi, there!
~> myVar="Bye!"; printf '%20s\n' "$myVar"
                Bye!

echo개행 문자가 끝에 암시적으로 인쇄되기 때문에 원래 방법이 작동하지 않습니다 .

쉘 루프와 만 사용하려면 개행을 억제하기 echo위해 이를 호출해야 합니다 echo -n.

~> myVar="Bye!"; l=${#myVar}; for ((i=20;i>l;i--)); do echo -n ' '; done; echo "$myVar"
                Bye!

답변2

이 스크립트(bash 및 sh로 테스트됨):

#!/bin/sh

function printWhiteSpaces() {
  local i="122"
  local len="$1"
  local k=`expr $i - $len`
  local whitespace='                                                                                                                                                                  '
  echo "${whitespace:0:$k}" test
}

printWhiteSpaces 100
printWhiteSpaces 110
printWhiteSpaces 120

나는 당신이 원하는 것이라고 생각하는 다음과 같은 출력을 생성합니다.

                       test
             test
   test

(이것은 Mac에서 수행되었지만 이것이 영향을 미칠지는 의심스럽습니다.)

답변3

함수 내에서 명령줄을 조작할 수 있습니다. 따라서 $k 매개변수(모두 비어 있음)를 사용하여 새 명령줄을 만듭니다. 구성이 완료된 후 $*명령줄을 큰따옴표로 표시하면 IFS의 첫 번째 char(= 공백) 구분 매개 변수가 제공되며 매개 변수가 모두 비어 있으므로 공백만 많이 표시됩니다.

function printWhitespaces
{
  local i="122"
  local len="$1"
  local whitespace=' '
  local k=`expr $i - $len`
  set -- ""
  while [ "$#" -le "$k" ]
  do
    set -- "$@" "$1"
  done
  echo "$*"
}

$k 변수를 이미 계산한 경우 다른 방법은 다음과 같습니다.

printf '%*s\n' "$k" ""

관련 정보