같은 줄에 다음 명령이 출력됩니까? 배쉬 스크립트

같은 줄에 다음 명령이 출력됩니까? 배쉬 스크립트

다음과 같은 간단한 스크립트가 있습니다.

echo "-------------------------- SOA --------------------------------"
echo " "
echo -n "  ---------> "; dig soa "$1" +short | awk '{print $3}'

출력은 다음과 같습니다:

-------------------------- SOA --------------------------------

---------> 2019072905

이제 내 질문은 파기 후에 "echo" 명령을 실행할 수 있습니까? 출력은 다음과 같습니다.

-------------------------- SOA -----------------------------

            ---------> 2019072905 <-------------

비슷한 사례를 찾아보았지만 관련 사례를 찾지 못했습니다.

가능합니까?

미리 감사드립니다.

답변1

cmd=$(dig soa "$1" +short | awk '{print $3}'; echo -n \<----------;)

echo "-------------------------- SOA --------------------------------"
echo " "
echo -n "      ---------> ";echo $cmd

답변2

나는 다음과 같은 방법으로 모든 일을 할 것입니다 printf:

#!/bin/sh

header='-------------------------- SOA --------------------------'

headerLength=$(awk '{print length()}' <<<"$header")

value=$(dig soa "$1" +short | awk '{print $3}')

valueString="-----------> $value <-------------"

valueLength=$(awk '{print length()}' <<<"$valueString")

offset=$(((headerLength + valueLength)/2+1))

printf "%s\n\n%${offset}s\n" "$header" "$valueString"

이는 값의 길이에 관계없이 디스플레이가 항상 중앙에 위치한다는 장점이 있습니다( value=$1설명을 위해 약간 수정된 버전 사용).

$ foo.sh 2019072905
-------------------------- SOA --------------------------------

            -----------> 2019072905 <-------------
$ foo.sh "some random long string"
-------------------------- SOA --------------------------------

      -----------> some random long string <-------------
$ foo.sh "foo"
-------------------------- SOA --------------------------

              -----------> foo <-------------

답변3

#!/bin/sh

soa=$(dig soa "$1" +short | awk '{print $3}')

cat <<__EOF__
-------------------------- SOA -----------------------------

            ---------> $soa <-------------
__EOF__

그런데, 내 생각에 이 질문은 잘못된 것 같습니다. 왜냐하면 SOA 주변의 모든 헤더 쓰레기를 인쇄하면 이 스크립트의 출력을 다른 스크립트의 입력으로 사용하기가 더 어려워지기 때문입니다...현재 자신이 그렇게 생각하지 않는 경우에도 필요할 수 있습니다. 앞으로는 이렇게 하려고요. 유닉스에서 출력의 장황함은 "죄"입니다. :) - 스크립트를 작성할 때 출력이 결국 다른 사람(자신을 포함하여)에게 입력될 수 있다는 점을 항상 고려해야 합니다.

나는 그 질문을 무시했을 것이지만 다른 대답은 더 마음에 들지 않습니다. 잘못된 일을 할 예정이라면 올바르게 하는 것이 좋습니다.

답변4

dig가 없으므로 이 예에서는 echo를 사용했습니다.

$ echo '2019072905' | awk '
    BEGIN { d=sprintf("%15s",""); gsub(/ /,"-",d); print d d, "SOA", d d ORS }
    { printf "%*s> %s <%s\n", 2*length(d)-length($0)/2+1, d, $0, d }
'
------------------------------ SOA ------------------------------

           ---------------> 2019072905 <---------------

$ echo '201' | awk '
    BEGIN { d=sprintf("%15s",""); gsub(/ /,"-",d); print d d, "SOA", d d ORS }
    { printf "%*s> %s <%s\n", 2*length(d)-length($0)/2+1, d, $0, d }
'
------------------------------ SOA ------------------------------

              ---------------> 201 <---------------

$ echo '12345672019072905' | awk '
    BEGIN { d=sprintf("%15s",""); gsub(/ /,"-",d); print d d, "SOA", d d ORS }
    { printf "%*s> %s <%s\n", 2*length(d)-length($0)/2+1, d, $0, d }
'
------------------------------ SOA ------------------------------

       ---------------> 12345672019072905 <---------------

관련 정보