2014-02-20 224 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