【问题标题】:line 54: warning: here-document at line 42 delimited by end-of-file (wanted `EOF') [duplicate]第 54 行:警告:第 42 行的此处文档由文件结尾分隔(需要“EOF”)[重复]
【发布时间】:2015-01-27 20:12:08
【问题描述】:

我得到了 bash 脚本,但是当我运行它时出现了一些错误:

第 54 行:警告:第 42 行的此处文档由文件结尾分隔(需要 `EOF')

#!/bin/bash
echo "PODAJ IMIE"
read imie
echo  "PODAJ NAZWISKO"
read nazwisko

alias="$imie$nazwisko"
echo "$alias"


while [ 1 ]
do

        i=1

        if [ `egrep $alias /etc/passwd |wc -l` -gt 0 ]; then i=0
        fi

        if [ $i -eq 0  ]; then
                echo "Uzytkownik o podanym aliasie już istnieje!"
                echo "PODAJ INNY ALIAS np. "$alias"1"
                read alias

        else
                echo "PODAJ HASLO"
                read -s password
                echo "PODAJ NUMER POKOJU"
                read pokoj

                #adduser --disabled-password --gecos "$imie $nazwisko,$pokoj, ," $alias
                adduser --quiet --disabled-password -shell /bin/bash --home /home/$alias --gecos "$imie $nazwisko, $pokoj, , " $alias
                echo "$alias:$password" | chpasswd
                #echo -e "$haslo\n$haslo\n" | sudo passwd $alias


                dir=/home/$alias
                mkdir $dir/public_html
                mkdir $dir/samba
                cd $dir/public_html
                mkdir private_html

                cat <<EOF >>$dir/.bashrc

                echo "alias ps =/bin/ps"
                echo "alias ls =/bin/ls"
                t=\`date +%F.%H:%M:%S\`
                echo "WITAJ\n"
                echo "DZISIAJ MAMY:\$t"
                echo "TWOJE OSTATNIE LOGOWANIE:" && " lastlog -u \$USER | tail -n 1 | awk '{print       \$4" "\$5" "\$6" "\$7" "\$9}'"
                EOF

                break
        fi
done

【问题讨论】:

  • 你几乎不需要在问题出现之前发布 40 行不相关的代码,但既然你这样做了,我会评论你对 [ 的货物崇拜。基本上,脚本中每次出现[ 都是多余的。 while true; doif ! grep -Eq "$alias" /etc/passwd; then
  • 这些别名有什么用处? psls 应该已经运行了这些命令;你的PATH 坏了吗?

标签: bash eof


【解决方案1】:

EOF 必须位于行首,后面没有任何内容(包括没有空格)。

该区块中的一些echos 是可疑的。直到结束标记的文本将在变量替换后按原样复制到文件中,而不是执行 - 而且看起来您不想在这里替换。

试试这个:(注意cat 行上"EOF" 周围的引号)

            cat <<"EOF" >>$dir/.bashrc
alias ps=/bin/ps
alias ls=/bin/ls
t=$(date +%F.%H:%M:%S)
echo "WITAJ\n"
echo "DZISIAJ MAMY: $t"
echo "TWOJE OSTATNIE LOGOWANIE:" $(lastlog -u $USER | tail -n 1 | awk '{print       $4" "$5" "$6" "$7" "$9}')
EOF

【讨论】:

  • "并且后面没有任何内容(包括没有空格)。"我开始发疯了,因为我确定我在 EOF 之前插入了一个 TAB。最后,这有助于摆脱困境并继续前进!
【解决方案2】:

EOF 分隔符需要在最左列对齐。

这是我经常做的对齐操作。

Lots
    Of
        Indents
            cat <<-____________HERE
                boo
____________HERE
        done
    done
done

【讨论】:

    【解决方案3】:

    你也可以使用

         <Tab><Tab>cat <<-EOF >>$dir/.bashrc
    #--------------------^- added a "-" char
         <Tab><Tab>  echo " ... "
         <Tab><Tab>  echo " ... "
         <Tab><Tab>EOF
    

    现在 EOF 前面有一个 - 字符。这向 shell 表明关闭的 Here-file 标记将(可以)缩进使用制表符。如果您不小心写了&lt;Tab&gt;&lt;Tab&gt;&lt;Space&gt;EOF,它将不匹配,但 0,1,2,...,100 &lt;Tab&gt;EOF 匹配。

    IHTH

    【讨论】:

      猜你喜欢
      • 2019-08-13
      • 2013-08-08
      • 2012-09-12
      • 1970-01-01
      • 2020-12-24
      • 2016-04-04
      • 2018-05-09
      • 2012-05-28
      • 1970-01-01
      相关资源
      最近更新 更多