여러 줄 명령 내에서 Bash 스크립트로 주석 달기


165

스크립트에서 다음 줄의 각 줄에 어떻게 주석을 달 수 있습니까?

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

여기에 의견을 제시 할 수 있습니까?


1
알다시피, #를 먼저하면, \는 주석의 일부가되지만 \를 먼저하면, 줄의 후자의 문자는 그 의미가 "line continuation"에서 "quote"로 변경됩니다. 아래에 주어진 하나의 해결책을 생각했습니다.
DigitalRoss

답변:


204

여기에는 약간의 오버 헤드가 있지만 기술적으로 귀하의 질문에 대답합니다.

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

스택 오버플로 질문 여러 줄 명령에 줄 설명을 넣는 방법을 참조하십시오 .


1
더 간단한 방법이 없다면 다소 복잡해 보입니까?
BassKozz

1
좋아, 나는 약간 더 간단한 변형을 추가했다.
DigitalRoss

1
백 슬래시가 필요하지 않다는 사실을 보여주기 위해 답을 수정할 수 있습니까? 그래서 각 줄 옆에 주석을 넣고 파이프를 사용할 수 있습니까?
BassKozz

버전 1과 2가 작동하는지 확인했습니다. 그러나 그 이유와 여기에 무슨 일이 있는지 설명 할 수 있습니까? 감사.
Faheem Mitha

1
설명 주셔서 감사합니다. unix.sx에 대한 자세한 내용을 묻는 질문을 열었습니다 . 연속 문자 뒤에 주석으로 여러 줄 명령을 bash 하십시오 .
Faheem Mitha

39

후행 백 슬래시는 연속 명령으로 해석 되려면 줄의 마지막 문자 여야합니다. 그 후에는 주석이나 공백이 허용되지 않습니다.

명령 사이에 주석 줄을 넣을 수 있어야합니다

# 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}

12
파이프 라인 명령 구성 요소가 |
DigitalRoss

2
DigitalRoss, 당신은 맞습니다, 나는 단지 백 슬래시가 아닌 파이프를 사용할 수 있습니다. 그러면 #comments가 완벽하게 작동합니다 ... 당신은 그것을 대답으로 게시 할 수 있습니까?
BassKozz

8
"명령 사이에 주석 행을 넣을 수 있어야합니다."아니오, 이전 행의 마지막 해석 된 문자가이므로 작동합니다 |. 당신이 시도하면 cat file1\<newline>#comment<newline>file2, 당신은 얻는 cat file1 file2것이 아니라 오히려 나타납니다 cat file1; file2.
dubiousjim

5
그러나 다른 사람들이 언급했듯이 cat file1 | # comment<newline>sort잘 작동합니다. 너무 그렇습니다 cat file1 && # comment<newline>echo foo. 따라서 주석은 |or &&또는 뒤에 포함될 수 ||있지만`\`뒤에 또는 명령 중간 에는 포함시킬 수 없습니다.
dubiousjim

7

DigitalRoss가 지적했듯이, 선 woud가로 끝날 때 후행 백 슬래시는 필요하지 않습니다 |. 다음 줄에 주석을 달 수 있습니다 |.

 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}

5

백 슬래시는 #를 이스케이프하여 주석 문자 대신 리터럴 문자로 해석합니다.


3

$IFS 댓글 해킹

이 핵은에 매개 변수 확장$IFS사용하는데, 명령에서 단어를 분리하는 데 사용됩니다 :

$ echo foo${IFS}bar
foo bar

비슷하게:

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

이것을 사용하여 명령 행에 주석을 달 수 있습니다 :

$ 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의 의견 이 답변을 촉발.


1

DigitalRoss의 예제 외에도 $()백틱 대신 선호하는 경우 사용할 수있는 다른 양식이 있습니다.`

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

물론 백틱과 함께 콜론 구문을 사용할 수도 있습니다.

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

추가 사항

$(#comment)작동하지 않는 이유 는 일단을 보면 #닫는 괄호를 포함하여 나머지 줄을 주석으로 처리 하기 때문 comment)입니다. 따라서 괄호는 닫히지 않습니다.

백틱은 다르게 구문 분석하고 a 이후에도 닫는 백틱을 감지합니다 #.


1
모든 주석에 대해 새로운 쉘을 작성합니까?
lonix

0

다음은 몇 가지 이전 주석의 아이디어와 관용구를 결합하여 일반적인 형식의 인라인 주석을 예제와 함께 제공하는 bash 스크립트입니다 ${__+ <comment text>}.

특히

  • <comment text> 여러 줄이 될 수 있습니다
  • <comment text> 매개 변수 확장이 아님
  • 하위 프로세스가 생성되지 않으므로 주석이 효율적입니다.

한 제한은에있다 <comment text>, 즉, 불균형 중괄호 '}'와 괄호 ')'(즉, 보호되어야 '\}'하고 '\)').

로컬 bash 환경에는 하나의 요구 사항이 있습니다.

  • 매개 변수 이름 __을 설정 해제해야합니다

__이름에 설정 값이 없으면 다른 구문 상 유효한 bash parameter-name이 대신 사용 됩니다.

예제 스크립트는 다음과 같습니다

# 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 
------------------------------------------------}
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.