echo
다음 두 명령 중 하나를 사용하여 두 문자열을 파일에 인쇄합니다 .
echo -e "\n""x" >> ~/file
echo -e "\n" "x" >> ~/file
첫 번째 결과는 다음과 같습니다.
엑스
두 번째 결과는 다음과 같습니다.
엑스
여분의 공간도 놓치지 않으셨을 것 같아요.
나는 두 번째 명령이 첫 번째 명령과 유사하게 작동하기를 가장 원합니다. "\n"
와 사이에 추가 공간이 있어 "x"
명령을 더 편안하게 읽을 수 있기 때문입니다.
Bash 4.3.48(1)에서는 이것이 자연적으로 불가능하다는 점을 감안할 때 이를 허용하거나 최소한 이에 가까운 구문이 있습니까?
주요 목표는 더 편안하게 읽을 수 있도록 두 문자열 사이에 일종의 분리를 제공하지만 위에 추가 공간을 두지 않는 간격 또는 최소한 일부 자리 표시자/구분 기호를 갖는 것입니다.
아시는 방법을 보여주세요. 나는 다른 것을 사용할 의향이 있습니다 echo
(비록 여기서 문자열을 피하는 것을 선호하지만).
""를 의미하기 위해 "문자열"이라는 용어를 사용했다는 점에 유의하세요 \n
. 여기서 말하는 것이 맞는지 잘 모르겠지만, 이것을 설명하는 데 사용할 수 있는 가장 좋은 용어입니다.
답변1
다음 명령을 사용하여 이 작업을 수행할 수 있습니다 printf
.
printf '\n%s\n' 'x' >file
를 사용하면 공백을 제거하여 이 작업을 수행 echo
할 수 있습니다 tr
.
echo -e '\n x' | tr -d ' ' >file
다음과 같이 작성할 수도 있습니다(그러나 그렇게 하지 마십시오).
echo -e '\n' 'x' | tr -d ' ' >file
결과:
$ cat file
x
나는 이것이 실제로 당신이 주문할 수 있다고 쉽게 주장할 수 있다고 생각합니다.더 세게읽다.
답변2
핵심이 스크립트 소스에서 두 문자열을 시각적으로 구분하는 것이라면(sum here \n
) 이를 변수에 넣을 수 있을 것 같습니다.x
str1='\n'
str2='x'
echo -e "$str1$str2" >> file
물론 매개변수 확장은 연속적이지만 문자열 자체는 그렇지 않습니다.
또는 를 사용 printf
하지만 후행 개행 추가는 별도로 수행해야 합니다.
{ printf %s $'\n' 'x'; echo; } >> file
%s
물론 백슬래시 이스케이프 문자는 매개변수 문자열에서 확장되지 않지만 Bash에서는 $'...'
ANSI-C 따옴표를 사용하여 echo
최종 개행 문자를 얻을 수 있습니다.
또는 원하는 작업을 수행하는 함수를 정의하십시오( 여기서 지워진 "$*"
대로 구분 기호 없이 매개변수를 함수에 연결하십시오 ).IFS
output() { local IFS=; echo -e "$*"; }
output "\n" "x"
답변3
x
목표가 파일에 새 줄과 a(그리고 또 다른 줄 바꿈?)를 구체적으로 쓰는 것이고 and (즉, )가 명령에 연속적으로 n
나타나지 않는 경우 (그리고 출력에 원치 않는 공백이 포함되지 않는 경우) 다음 중 하나가 매우 간단합니다. 방법은x
nx
{ echo; echo "x";} >> file
(개행, x
, 개행 작성) 또는
{ echo; echo -n "x";} >> file
(개행 문자와 를 쓰지만 x
끝에 개행 문자는 없습니다). 그룹화를 위해 중괄호 대신 괄호를 사용할 수도 있습니다.
(echo; echo "x") >> file
중괄호를 사용하는 경우 시작 뒤에 공백(공백, 탭 및/또는 줄 바꿈)이 있어야 하고 끝 앞에 {
하나(및/또는 줄 바꿈)가 있어야 합니다 . 또는 두 개의 완전히 별개(그룹화되지 않은) 명령을 실행하여 독립적으로 리디렉션을 수행할 수 있습니다.;
}
echo >> file
echo "x" >> file
또는 사용Jesse_b의 답변:
printf '\n%s\n' 'x' >> file
(개행, x
, 개행 작성) 또는
printf '\n%s' 'x' >> file
(개행 문자와 를 쓰지만 x
끝에 개행 문자는 없습니다).
그러나 목표가 보다 일반적인 것이라면, 명령줄에서 공백으로 구분하면서 여러 문자열(사이에 공백 없이)을 작성하는 것이라면 다음을 고려하십시오.
printf '%b'끈…
인쇄된 문자열 %b
의 변환 형식
그리고 \
서열 해석( %s
문자열을 문자 그대로 인쇄하는 것과 반대) 예를 들어,
printf '%b' '\n' foo '\t' bar
IE를 쓸 것이다 newlinefoo
tabbar
;
풍부한 바(끝에 개행 문자가 없습니다). 당신은 또한 말할 수 있습니다
printf '%b%b%b%b' '\n' foo '\t' bar
하지만 그렇지 않습니다. 모든 매개변수를 표시하는 데 필요한 만큼 형식이 적용됩니다. 따라서 끝에 개행 문자를 추가하려면
printf '%b\n' '\n' foo '\t' bar
작동하지 않습니다. 각 매개변수 뒤에 줄바꿈을 추가합니다. 넌 할 수있어
printf '%b' '\n' foo '\t' bar '\n'
(마지막 인수로 개행 문자 추가) 또는
printf '%b%b%b%b\n' '\n' foo '\t' bar
(계산 매개변수) 또는
{ printf '%b' '\n' foo '\t' bar; echo;}
또 다른 방법또는 bash를 사용하는 경우
printf '%s' $'\n' foo $'\t' bar
시퀀스를 해석하려면 bash 표기법을 사용하세요. 이것을 원래 문제에 적용하면,$'text…'
\
printf '%s' $'\n' x
답변4
%b
bash printf(백틱 인수 설명)를 사용할 수 있습니다 .
$ printf %b \\n x >> file
물론 다음과 같이 인용할 수도 있습니다 \n
.
$ printf %b '\n' x >> file
x
그러나 backtick 값은 printf에 의해 해석되지 않으므로 printf에 입력하는 내용에 대해 매우 주의하십시오 .
또는 bash를 사용하고 있으므로 다음을 사용하여 개행을 생성할 수 있습니다 $'\n'
.
$ printf '%s' $'\n' x >>file
보다 안전합니다 %b
.
또는 변수를 원하는 경우:
$ nl=$'\n'
$ printf '%s' "$nl" x >> file
또는 다음과 같이 함수를 정의할 수 있습니다.
$ separate() { local IFS=; printf %b "$*"; }
$ separate '\n' 'x' '*'
매개변수가 함께 연결되었는지 확인 합니다 local IFS=
(사이에 공백 없음)."$*"