WHILE循环不循环

时间:2014-02-20 10:56:04

标签: linux bash shell while-loop

我是Linux和shell脚本的新手。

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

以下是“list”中的一些示例行:

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

提前致谢。

2 个答案:

答案 0 :(得分:2)

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

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

答案 1 :(得分:0)

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

bad_command < /dev/null

或者只是为while循环使用不同的文件描述符:

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

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


正如宝马所指出的,您需要修正if声明:

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

等号周围的空格是必要的,因为[是一个命令,不是if语法的一部分,它需要3个不同的参数($rr,{{1} }和=);它不会将单个字符串"y"解析为比较。 $rr="y"命令首选=,因为[通常不是POSIX相等比较运算符。但是,==允许bash,但也提供了一个优越的命令,不需要==根据$rr的安全要求引用:

[

通过将if [[ $rr == y ]]; then # == or = will work the same 语句组合到单个复合命令中并将其组合输出重定向一次,可以在循环的最后一部分中保存一些输入:

echo

tripleee指出的另一个选项,只需要一次调用{ echo ... echo ... echo ... } > "$ftpc" 。它产生了一个外部过程,但看起来更干净。

cat

你也可以cat > "$ftpc" <<EOF #$1 <Directory $uhome/res-devres/> etc EOF 和一个包含嵌入换行符的字符串。

echo