(如果使用的是bash
4,滾動到底爲了什麼,我認爲是純粹的外殼和可讀性的最佳組合。)
對於shell腳本,使用標籤是不喜好或風格的問題;這就是語言的定義。
usage() {
# Lines between EOF are each indented with the same number of tabs
# Spaces can follow the tabs for in-document indentation
cat <<-EOF
Hello, this is a cool program.
This should get unindented.
This code should stay indented:
something() {
echo It works, yo!;
}
That's all.
EOF
}
另一種選擇是避免在此文件完全在不必使用更多的報價和線路延續的費用:
usage() {
printf '%s\n' \
"Hello, this is a cool program." \
"This should get unindented." \
"This code should stay indented:" \
" something() {" \
" echo It works, yo!" \
" }" \
"That's all."
}
如果你願意放棄POSIX兼容,可以使用陣列,以避免顯式線延續:
usage() {
message=(
"Hello, this is a cool program."
"This should get unindented."
"This code should stay indented:"
" something() {"
" echo It works, yo!"
" }"
"That's all."
)
printf '%s\n' "${message[@]}"
}
下面以這裏DOCUME nt再次,但這次用bash
4的readarray
命令填充數組。參數展開負責從每個謊言的開頭刪除固定數量的空格。
usage() {
# No tabs necessary!
readarray message <<' EOF'
Hello, this is a cool program.
This should get unindented.
This code should stay indented:
something() {
echo It works, yo!;
}
That's all.
EOF
# Each line is indented an extra 8 spaces, so strip them
printf '%s' "${message[@]# }"
}
最後一種變化:您可以使用擴展模式來簡化參數擴展。無需統計有多少空格用於縮進,只需使用選定的非空格字符結束縮進,然後匹配固定前綴即可。我使用:
。 ( 後面的空格代表可讀性;可以通過對前綴模式的輕微更改而刪除)
(另外,作爲一個缺點,您使用here-doc分隔符以空格開頭的是它阻止你在here-doc中執行擴展,如果你想這樣做,你必須保持分隔符不縮進,或者對你的no-tab規則做一個小例外,並使用<<-EOF
和一個製表縮進結束分隔符。)
usage() {
# No tabs necessary!
closing="That's all"
readarray message <<EOF
: Hello, this is a cool program.
: This should get unindented.
: This code should stay indented:
: something() {
: echo It works, yo!;
: }
: $closing
EOF
shopt -s extglob
printf '%s' "${message[@]#+(): }"
shopt -u extglob
}
不,這是一個編程問題,它是合法的在這裏。感謝您的檢查。 –
這似乎是一個很好,清晰,直接的方法。不知道別的方法。當我得到更多選票時,我會贊成它,也許有人知道一些有趣的事情。 –
噢,很好的解決方案!不幸的是在大多數其他語言中不可能,使縮進的代碼塊變得棘手。 – Kenney