題 如何在shell函數中創建“here here”?


我正在通過William Shotts Jr.工作,很棒 Linux命令行 在我的Mac OSX 10.7.5系統上。 Shotts覆蓋的Linux的90%足夠接近達爾文,我可以弄清楚,或者GTEM可以找出正在發生的事情。我已經進入了第27章“編寫Shell腳本”,並且我正忙著在函數中創建“here files”。

我得到了 syntax error: unexpected end of file 包含以下函數時出錯:

report_uptime () {
  cat <<- _EOF_
    <H2>System Uptime</H2>
    <PRE>$(uptime)</PRE>
    _EOF_
  return
}

如果我使用以下函數佔位符,則錯誤消失:

report_uptime () {
  return
}

此外,在腳本的其他地方,我使用的函數之外 cat << _EOF_ 格式創建“here文件”沒有問題:

cat << _EOF_
<HTML>
      <HEAD>
            <TITLE>$TITLE</TITLE>
      </HEAD>
      <BODY>
            <H1>$TITLE</H1>
            <P>$TIME_STAMP</P>
            $(report_uptime)
            $(report_disk_space)
            $(report_home_space)
      </BODY>
</HTML>
_EOF_

如果有人知道我做錯了什麼,我將不勝感激!


2
2017-11-24 19:54


起源


該 EOF 令牌必須是該行的第一件事,沒有任何前導空格。 - Ярослав Рахматуллин
這對我有用,@Ярослав_Рахматуллин。我不這麼認為 [-] 是達爾文這裡的文件選項。 cat << _EOF_ 不 cat <<- _EOF_ - BenU
這太遺憾了。 - Ярослав Рахматуллин


答案:


如果重定向運算符為“<< - ”,則從輸入行和包含分隔符的行中刪除所有前導製表符。這允許shell腳本中的here-documents以自然的方式縮進。

如果這不能記錄,請嘗試移動 EOF 令牌到行的最開頭(刪除所有空格)。


4
2017-11-24 20:02



無論系統如何,這都應該有效,除非您的系統中的bash版本被破壞。 - Ярослав Рахматуллин
謝謝@Ярослав_Рахматуллин雖然添加了 - 至 << 沒有解決我的問題,刪除之前的空白 _EOF_ 沒有。也許“這裡的文件”用 cat << 在達爾文工作,但沒有 cat <<-。從那以後,這是一種恥辱 <<- 太有用了將您的評論移到您的答案中,我會接受它。附錄:bash實際上可能會被打破。可能被我打破,可能是Mac的達爾文的局限...... - BenU
@BenU,請注意手冊頁在這裡非常具體: 製表符 不 空白 - glenn jackman
@glennjackman使用空格而不是製表符確實是我的問題的根源。我安排我的文本編輯器默認使用兩個空格而不是製表符。謝謝! - BenU