2014-02-20 150 views
0

我对Linux和shell脚本相当陌生。WHILE循环不循环

我的问题是,脚本应该从名为“list”的文件中读取2个令牌 - 使用这些令牌,它会创建一个用户并根据第二个令牌创建一个子文件夹。它做得很好 - 但只有一次。只有一次。我的WHILE循环有问题吗?

下面是从 “名单” 的几个示例行:

egyes n 
kettes y 
harmas y 

这里的脚本:提前

#!/bin/bash 
echo " " >> /root/userpass.txt 
most=$(date) 

while read user rr; do 
    p1=${user:0:2} 
    p2=${user:3:4} 
    pass=$p1$RANDOM$p2 
    echo $user - $pass --" LÉTREHOZVA: "$most >> /root/userpass.txt 

    adduser $user > /dev/null 
    echo $user:$pass | chpasswd > /dev/null 

    uhome=/home/$user 

    if [ $rr=="y" ]; then 
      mkdir $uhome/rockandroll 
      chown $user $uhome/rockandroll 
    fi 

    mkdir $uhome/res-devres 
    chown $user $uhome/res-devres 

    ftpc=/etc/proftpd/proftpd.conf 

    echo "#"$1 >> $ftpc 
    echo "<Directory "$uhome"/res-devres/>" >> $ftpc 
    echo ' <Limit CDUP XCUP STOR LIST CWD XCWD STOU>' >> $ftpc 
    echo '   AllowAll' >> $ftpc 
    echo ' </Limit>' >> $ftpc 
    echo ' <Limit RETR DELE>' >> $ftpc 
    echo '   DenyAll' >> $ftpc 
    echo ' </Limit>' >> $ftpc 
    echo '</Directory>' >> $ftpc 
    echo " " >> $ftpc 
    echo " " 
done < list 

感谢。

+1

东西吃stdin? –

+0

注意:以纯文本形式存储密码是一个坏主意...... –

+0

它只是用于临时使用,直到我将它们发送出去。之后,我删除了这个文件,但那不是重点。 你是什么意思“吃stdin”? – LZozzy

回答

2

if [ $rr=="y" ]; then 

变化

if [ $rr == "y" ]; then 
+0

不,没有解决它。 – LZozzy

+0

必要的,但解决不同的问题。 – chepner

0

正如在评论中指出,在循环的一些命令是从标准输入读取。您可以找出哪些命令时,从/dev/null重定向标准输入:

bad_command < /dev/null 

或者干脆使用不同的文件描述符while循环:

while read user rr <&3; do 
    ... 
done 3< list 

现在read命令不是从标准输入读取,但是从文件描述符3中读取,这不太可能被循环体内的任何命令使用。


正如BMW指出的那样,你需要修复您的if声明:

if [ "$rr" = "y" ]; then 

等号周围的空间是必要的,因为[是一个命令,而不是if语法的一部分,它需要3个不同的参数($rr,="y");它不会解析单个字符串$rr="y"作为比较。 =优先于[命令,因为通常==不是POSIX相等比较运算符。然而,bash确实允许==,还提供了优越的命令,要求安全性[不需要$rr被引用:

if [[ $rr == y ]]; then # == or = will work the same 

可以节省一些打字在循环的最后一节由echo语句组合成单个复合命令,并且一旦重定向它们的综合输出:

{ 
    echo ... 
    echo ... 
    echo ... 
} > "$ftpc" 

通过tripleee指出另一种选择,需要ONL您只需致电cat即可。它产生了一个外部过程,但看起来更干净。

cat > "$ftpc" <<EOF 
#$1 
<Directory $uhome/res-devres/> 
etc 
EOF 

你也可以只是echo和一个嵌入换行符的单个字符串。

echo "#$1 
<Directory $uhome/res-devres/> 
etc 
" > "$ftpc" 
+0

也可以通过使用这里的文件来缓解'echo'痛苦。 – tripleee