WHILE循环未循环



我对Linux和shell脚本还很陌生。

我的问题是,脚本应该从名为"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

提前谢谢。

的更改

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

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

正如注释中所指出的,循环中的一些命令是从标准输入中读取的。您可以找出是哪个命令,并从/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="y");它将不解析单个字符串CCD_ 9作为比较。=最好与[命令配合使用,因为==通常不是POSIX相等比较运算符。然而,bash确实允许==,但也提供了一个上级命令,该命令不需要引用$rr作为[:的安全要求

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

通过将echo语句组合成一个复合命令并重定向其组合输出一次,您可以在循环的最后一部分保存一些键入内容:

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

Triplee指出的另一个选项只需要对cat进行一次调用。它产生了一个外部过程,但看起来更干净。

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

您也可以只使用echo和带有嵌入换行符的单个字符串。

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

相关内容

  • 没有找到相关文章

最新更新