我是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
提前致谢。
答案 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