bestsource

여러 줄 명령어 내의 Bash 스크립트에 대한 코멘트

bestsource 2023. 4. 14. 21:58
반응형

여러 줄 명령어 내의 Bash 스크립트에 대한 코멘트

스크립트에서 다음 행의 각 행에 코멘트를 달려면 어떻게 해야 하나요?

cat ${MYSQLDUMP} | \
sed '1d' | \
tr ",;" "\n" | \
sed -e 's/[asbi]:[0-9]*[:]*//g' -e '/^[{}]/d' -e 's/""//g' -e '/^"{/d' | \
sed -n -e '/^"/p' -e '/^print_value$/,/^option_id$/p' | \
sed -e '/^option_id/d' -e '/^print_value/d' -e 's/^"\(.*\)"$/\1/' | \
tr "\n" "," | \
sed -e 's/,\([0-9]*-[0-9]*-[0-9]*\)/\n\1/g' -e 's/,$//' | \
sed -e 's/^/"/g' -e 's/$/"/g' -e 's/,/","/g' >> ${CSV}

다음과 같은 코멘트를 추가하려고 하면:

cat ${MYSQLDUMP} | \ # Output MYSQLDUMP File

이해:

#: not found

여기서 코멘트를 할 수 있을까요?

이것은 약간의 오버헤드를 수반하지만, 엄밀히 말하면 다음과 같은 질문에 대답할 수 있습니다.

echo abc `#Put your comment here` \
     def `#Another chance for a comment` \
     xyz, etc.

특히 파이프라인의 경우 오버헤드가 없는 깨끗한 솔루션이 있습니다.

echo abc |        # Normal comment OK here
     tr a-z A-Z | # Another normal comment OK here
     sort |       # The pipelines are automatically continued
     uniq         # Final comment

스택 오버플로우 질문을 참조하십시오.다행 명령에 대한 라인 주석 삽입 방법.

후행 백슬래시는 행의 마지막 문자여야만 연속 명령으로 해석할 수 있습니다.그 뒤에는 코멘트나 공백도 사용할 수 없습니다.

명령어 사이에 코멘트 행을 삽입할 수 있어야 합니다.

# output MYSQLDUMP file
cat ${MYSQLDUMP} | \
# simplify the line
sed '/created_at/d' | \
# create some newlines
tr ",;" "\n" | \
# use some sed magic
sed -e 's/[asbi]:[0-9]*[:]*//g' -e '/^[{}]/d' -e 's/""//g' -e '/^"{/d' | \
# more magic
sed -n -e '/^"/p' -e '/^print_value$/,/^option_id$/p' | \
# even more magic
sed -e '/^option_id/d' -e '/^print_value/d' -e 's/^"\(.*\)"$/\1/' | \
tr "\n" "," | \
# I hate phone numbers in my output
sed -e 's/,\([0-9]*-[0-9]*-[0-9]*\)/\n\1/g' -e 's/,$//' | \ 
# one more sed call and then send it to the CSV file
sed -e 's/^/"/g' -e 's/$/"/g' -e 's/,/","/g' >> ${CSV}

한 바와 같이 이 Digital Ross, , Digital Ross로 끝나는 .| 뒤에 을 달 수 요.|:

 cat ${MYSQLDUMP} |         # Output MYSQLDUMP file
 sed '1d' |                 # skip the top line
 tr ",;" "\n" | 
 sed -e 's/[asbi]:[0-9]*[:]*//g' -e '/^[{}]/d' -e 's/""//g' -e '/^"{/d' |
 sed -n -e '/^"/p' -e '/^print_value$/,/^option_id$/p' |
 sed -e '/^option_id/d' -e '/^print_value/d' -e 's/^"\(.*\)"$/\1/' |
 tr "\n" "," |
 sed -e 's/,\([0-9]*-[0-9]*-[0-9]*\)/\n\1/g' -e 's/,$//' |   # hate phone numbers
 sed -e 's/^/"/g' -e 's/$/"/g' -e 's/,/","/g' >> ${CSV}

$IFS

이 해킹은 다음에서 매개 변수 확장을 사용합니다.$IFS명령어 내의 단어를 구분하기 위해 사용됩니다.

$ echo foo${IFS}bar
foo bar

마찬가지로:

$ echo foo${IFS#comment}bar
foo bar

이를 사용하여 명령줄에 continuation을 사용하여 코멘트를 추가할 수 있습니다.

$ echo foo${IFS# Comment here} \
> bar
foo bar

는 이 에 와야 .\속합니니다다

파라미터 확장은 코멘트 내에서 실행됩니다.

$ ls file
ls: cannot access 'file': No such file or directory
$ echo foo${IFS# This command will create file: $(touch file)}bar
foo bar
$ ls file
file

드문 예외

하는 경우는 .$IFS이전에는 확장에 의해 삭제되는 정확한 텍스트로 시작하였습니다(즉, 다음 텍스트 이후).#★★★★★

$ IFS=x
$ echo foo${IFS#y}bar
foo bar
$ echo foo${IFS#x}bar
foobar

해 주세요.foobar에는 공백이 없기 때문에 문제가 발생하고 있습니다.

★★$IFS기본적으로 공백만 포함되므로 이 문제가 발생할 가능성은 매우 낮습니다.


이 답변의 발단이 된 것은 @pjh의 코멘트 덕분입니다.

Ross의 Digital Ross를 선호하는 할 수 .$()`

echo abc $(: comment) \
     def $(: comment) \
     xyz

물론 colon 구문은 backtick에도 사용할 수 있습니다.

echo abc `: comment` \
     def `: comment` \
     xyz

기타 주의사항

★★$(#comment) 건 안 되는 거예요. 왜냐하면 일단 이 시스템이#는, 행의 나머지 부분(마감 괄호 포함)을 코멘트로서 취급합니다.comment)괄호는 절대 닫히지 않습니다.

는 해석 Backticks가 종료된 합니다.#.

백슬래시는 #를 이스케이프하여 코멘트 문자가 아닌 리터럴 문자로 해석됩니다.

시도했던 것 대신:

cat ${MYSQLDUMP} | \ # Output MYSQLDUMP File

다른 사람들은 이것이 효과가 있을 것이라고 언급했습니다.

cat ${MYSQLDUMP} |   # Output MYSQLDUMP File

그러나 분할 라인이 파이프(|)로 끝나는 것은 아니기 때문에 다음과 같이 각 라인에 주석을 달 수 있습니다.

date && \
  # List current directory
  ls -l | awk '{ \
  # Filename is in the ninth column
      # This is just making "ls -l" work mostly like "ls -1"
  print $9 }'

스트링 중간에는 사용하지 마십시오.

echo " Hello \
 # Localized name for your planet:
world."

이 경우 다음 방법을 사용할 수 있습니다.

cat ${MYSQLDUMP} | \
# Output MYSQLDUMP File

확장 예:

# Create .csv file from MySQL dump file
cat ${MYSQLDUMP} |   
# Output MYSQLDUMP File
# and pipe to first sed command
sed '1d' | \
# Pipe output to tr
tr ",;" "\n" | \
# Apply sed expression
sed -e 's/[asbi]:[0-9]*[:]*//g' -e '/^[{}]/d' -e 's/""//g' -e '/^"{/d' | \
    # Apply another two sed expressions
    # (and since whitespace is ignored, you can intent for clarity)
    sed -n -e '/^"/p' -e '/^print_value$/,/^option_id$/p' | \
    # Apply three more sed expressions
    sed -e '/^option_id/d' -e '/^print_value/d' -e 's/^"\(.*\)"$/\1/' | \
    # Use tr to ...
    tr "\n" "," | \
    # Apply yet another two sed expressions
    sed -e 's/,\([0-9]*-[0-9]*-[0-9]*\)/\n\1/g' -e 's/,$//' | \
    # Apply the final three sed expressions
    sed -e 's/^/"/g' -e 's/$/"/g' -e 's/,/","/g' >> ${CSV}

...또는 두 가지 방법을 혼합합니다.

# Create .csv file from MySQL dump file
cat ${MYSQLDUMP} |   # Output MYSQLDUMP File
# and pipe to first sed command
sed '1d' | \
# Pipe output to tr
...

(셸 스크립트파일은 CLI 입력과 마찬가지로 한 줄 한 줄 구문 분석되므로 두 가지 방법이 모두 유효하다고 생각합니다).

최종 메모:

  • 행의 계속 문자(\)를 사용하는 경우, 그 행의 마지막 문자가 되는 것에 주의해 주세요(단 한 개의 후행 공백이라도 잊으면 밤이 망칠있습니다).

  • 명령줄에서 수동으로 입력하는 경우 명령어 이력 기능을 사용하는 경우 두 번째 방법(각 코멘트 포함)만 사용하십시오.

  • 기록을 사용하고 주석을 보존하려면 다음 방법 중 하나를 사용하지 마십시오. 이 질문에 대한 다른 답변 중 하나를 사용하십시오.

에서는 앞의 나 일반적인 를 보여 ${__:+ <comment text>}.

특히

  • <comment text>일 수 .
  • <comment text>가 아닙니다.
  • 서브프로세스가생성되지않기때문에코멘트가효율적입니다.

에는, 1개의 제약사항이 있습니다.<comment text> 「」, 「」라고 하는 것입니다'}' 괄호 " " "')'되어야 한다 보호되어야 한다).'\}' ★★★★★★★★★★★★★★★★★」'\)'를 참조해 주세요.

로컬 bash 환경에는 다음 1가지 요건이 있습니다.

  • '''__하지 않으면 안심이 없다

한 다른 bash 은 bash를 합니다.__( 「 」 、 「 」 )

다음에 샘플 스크립트를 나타냅니다.

# provide bash inline comments having the form
#     <code> ${__:+ <comment>} <code> 
#     <code> ${__:+ <multiline
#                   comment>} <code>

# utility routines that obviate "useless use of cat"
function bashcat { printf '%s\n' "$(</dev/stdin)"; }
function scat { 1>&2 bashcat; exit 1; }

# ensure that '__' is unset && remains unset
[[ -z ${__+x} ]] &&  # if '__' is unset
  declare -r __ ||   # then ensure that '__' remains unset 
  scat <<EOF         # else exit with an error
Error: the parameter __='${__}' is set, hence the
  comment-idiom '\${__:+ <comment text>}' will fail
EOF

${__:+ (example of inline comments)
------------------------------------------------
the following inline comment-idiom is supported
    <code> ${__:+ <comment>} <code> 
    <code> ${__:+ <multiline
                   comment>} <code> 
(advisory) the parameter '__' must NOT be set;
  even the null declaration __='' will fail
(advisory) protect unbalanced delimiters \} and \) 
(advisory) NO parameter-expansion of <comment> 
(advisory) NO subprocesses are spawned
(advisory) a functionally equivalent idiom is 
    <code> `# <comment>` <code> 
    <code> `# <multiline
               comment>` <code>
however each comment spawns a bash subprocess
that inelegantly requires ~1ms of computation 
------------------------------------------------}

여기서의 답은 문맥상입니다.긴 파라미터 행과 긴 복잡한 파이프라인에 주석을 달 수 있어야 하는데, 안타깝게도 구문은 같은 방식으로 작동하지 않습니다.

, 거의 하게 코멘트할 수 .`#...`또는 매우 복잡한 인용의 지뢰를${IFS#...}:

, 하실 수 .local 표시

어쨌든 기능을 갖출 수 있을 만큼 복잡한 셸 스크립트를 작성하고 있는 거죠?named-array 구문을 사용하려면 모든 이름을 지정해야 하지만 글로벌셸 네임스페이스를 오염시키고 싶지 않으므로 로컬 변수 선언으로 정리하십시오.

어레이에 긴 명령어 삽입

어레이는 불필요\다음과 같이 코멘트를 정상적으로 사용할 수 있습니다.

local x=(
    "command-name"
    # here's the command
    "argument" # and here's the first arg
)

모든 어레이가 정의된 후 파이프라인 배치

리다이렉션이 복잡한 경우 설명을 원할 수 있지만 파라미터 목록이 길면 방해가 될 수 있습니다.짧은 이름 몇 개를 사용해서local코멘트에 맞도록 짧은 값을 지정한 후 리다이렉션 또는 파이프라인을 사용하여 백슬래시가 아닌 행을 분할합니다.

"${x[@]} | # here is my first command
    "${y[@]} | # and here's the second one
    ...

이렇게 하면 리다이렉션이 너무 길어서 코멘트가 맞지 않습니다.변수명을 선택할 수 있습니다.이러한 이름은local스크립트 전체에 대해 고유하게 만들 필요는 없습니다.

모든 것을 종합하다

모든 것을 종합하면 다음과 같습니다.

f() {
    local produce_text=(
        echo
        # I'm echoing
        "first   argument"
        # newline!
        '
'
        # Here's the first arg.
        "second    argument"
        # Here's the second.
    )
    local number_lines=(
        cat
        # I'm concatenating
        -b
        # with numbered lines
    )
    "${produce_text[@]}" |
        # explaining the pipeline
        "${number_lines[@]}" \
            2>&1
    # done
}

이의 모든 은 N.B.에도 되었습니다. 이 답변의 모든 내용도zsh아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 네? POSIX에서 않음shbash- 정 - 。

pipe connected 명령어 코딩 스타일은 다음과 같습니다.

command1 \
| command2 \
| ...

@JimGrisham 등이 제안했듯이 코멘트 행의 한 가지 방법은

command1 \
| # inline comment
  command2 \
| ...

또 다른 의 "Bash"를하는 것입니다.{ list; }항상 작동하는 구성입니다.다음 중 하나:

command1 \
| {
    # inline comment
    command2
  } \
| ...

언급URL : https://stackoverflow.com/questions/1455988/commenting-in-a-bash-script-inside-a-multiline-command

반응형