여러 줄 명령어 내의 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에서 않음sh
bash
- 정 - 。
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
'bestsource' 카테고리의 다른 글
VBA를 사용하여 파일이 있는지 확인합니다. (0) | 2023.04.14 |
---|---|
bash completion을 에일리어스로 작업하려면 어떻게 해야 하나요? (0) | 2023.04.14 |
코드 뒤에 있는 별 모양의 그리드 (0) | 2023.04.14 |
CMake에서 사용자 환경 변수를 가져오는 방법(Windows) (0) | 2023.04.14 |
SQL Server의 저장 프로시저에서 텍스트 검색 (0) | 2023.04.14 |