고정 너비 콘솔 출력에 패딩을 제공하기 위해 특정 개수의 "공백" 문자를 인쇄하는 셸 함수를 구현하려고 합니다.
#!/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" ""