2017-06-08 4 views
0

innerhalb meiner while-Schleife mache ich einen Test, aber es scheint wirklich redundant und ich denke, es könnte eine bessere Lösung sein, um dies wie eine "Fall" -Struktur möglicherweise zu implementieren? Wenn jemand empfehlen kann, die Redundanz zu reduzieren, wäre das wunderbar, danke! Grundsätzlich, wie kann ich diese Schleife besser strukturieren?make loop lesen klarer

die Schleife:

if [ "$cursor" -eq "1" ] 
    then  
     Links="Links: $(ls -ld/| cut -d" " -f2)" 
     Owner="Owner: $(ls -ld/| cut -d" " -f3)" 
     Group="Group: $(ls -ld/| cut -d" " -f4)" 
     Size="Size: $(ls -ld/| cut -d" " -f5)" 
     Modified="Modified: $(ls -ld/| cut -d" " -f6-8)" 
     echo "$Links $Owner $Group $Size $Modified" 
    elif [ "$cursor" -eq "2" ] 
    then  
     Links="Links: $(ls -ld /home | cut -d" " -f2)" 
        Owner="Owner: $(ls -ld /home | cut -d" " -f3)" 
        Group="Group: $(ls -ld /home | cut -d" " -f4)" 
        Size="Size: $(ls -ld /home | cut -d" " -f5)" 
        Modified="Modified: $(ls -ld /home | cut -d" " -f6-8)" 
        echo "$Links $Owner $Group $Size $Modified" 
     elif [ "$cursor" -eq "3" ] 
    then 
     Links="Links: $(ls -ld ~ | cut -d" " -f2)" 
        Owner="Owner: $(ls -ld ~ | cut -d" " -f3)" 
        Group="Group: $(ls -ld ~ | cut -d" " -f4)" 
        Size="Size: $(ls -ld ~ | cut -d" " -f5)" 
        Modified="Modified: $(ls -ld ~ | cut -d" " -f6-8)" 
        echo "$Links $Owner $Group $Size $Modified"   
    else 
     temp=`expr $cursor - 1` 
     curDir=${currentdir[$temp]} 
     Links="Links: $(ls -ld $curDir | cut -d" " -f2)" 
        Owner="Owner: $(ls -ld $curDir | cut -d" " -f3)" 
        Group="Group: $(ls -ld $curDir | cut -d" " -f4)" 
        Size="Size: $(ls -ld $curDir | cut -d" " -f5)" 
        Modified="Modified: $(ls -ld $curDir | cut -d" " -f6-8)" 
        echo "$Links $Owner $Group $Size $Modified" 
fi 
+0

Sie ** wirklich ** sollte nicht die Ausgabe von 'ls' analysieren. Siehe [BashFAQ # 3] (http://mywiki.wooledge.org/BashFAQ/003) und http://mywiki.wooledge.org/ParsingLs –

+0

(und selbst wenn Sie * dies tun würden, würde es Es ist viel sinnvoller, 'ls' * einmal * auszuführen und die Ausgabe dieses einzelnen Aufrufs in fünf Felder zu lesen, statt sie fünfmal auszuführen und jeweils ein Feld zu extrahieren. –

+1

Wenn Sie GNU stat haben, könnten Sie buchstäblich einen einzigen 'stat -c'-Aufruf erstellen, der Ihre Link-, Eigentümer-, Gruppen-, Größen- und mtime-Ausgabe in einem einzigen Befehl ausgibt. –

Antwort

0

Sie, dass kein Problem tun. Wenn Sie sich mit diesem Problem befassen, überlegen Sie, welche Informationen sich in Ihren Anweisungen ändern, verwenden Sie eine Variable, um diese Informationen zu speichern. Versuchen Sie am Ende, wiederholte Zeilen zu reduzieren, indem Sie Funktionen, Variablen und Reihenfolge verwenden.

Verschieben Sie den folgenden Block aus Ihren if/else-Anweisungen. Innerhalb jeder if-Anweisung die Variable CurDir = "[dir]"

Links="Links: $(ls -ld $curDir | cut -d" " -f2)" 
Owner="Owner: $(ls -ld $curDir | cut -d" " -f3)" 
Group="Group: $(ls -ld $curDir | cut -d" " -f4)" 
Size="Size: $(ls -ld $curdir | cut -d" " -f5)" 
Modified="Modified: $(ls -ld $curdir | cut -d" " -f6-8)" 
echo "$Links $Owner $Group $Size $Modified" 
0
#!/bin/bash 
cursor="$1" 
case "$cursor" in 
    1) curDir="/" 
    ;; 
    2) curDir="/home" 
    ;; 
    3) curDir="${HOME}" 
    ;; 
    *) curDir=${currentdir[$temp]} 
    ;; 
esac 

Links="Links: $(ls -ld $curDir | cut -d" " -f2)" 
Owner="Owner: $(ls -ld $curDir | cut -d" " -f3)" 
Group="Group: $(ls -ld $curDir | cut -d" " -f4)" 
Size="Size: $(ls -ld $curDir | cut -d" " -f5)" 
Modified="Modified: $(ls -ld $curDir | cut -d" " -f6-8)" 
echo "$Links $Owner $Group $Size $Modified" 
0

schließe ich, Schaben ls ist nicht die beste, aber ich bin mir nicht sicher, was Ihr Anwendungsfall ist. Hier ist eine Lösung, die ich kam:

#!/bin/bash 

my_stat() 
{ 
    path="$1" 

    IFS=":" read links owner group size modified <<<$(ls -ld $path | awk '{print $2":"$3":"$4":"$5":"$6" "$7" "$8}') 
    echo "$links $owner $group $size $modified" 
} 

case $cursor in 
    1) my_stat /;; 
    2) my_stat /home;; 
    3) my_stat ~;; 
    *) temp=$((cursor - 1)) 
    curDir="${currentdir[$temp]}" 
    my_stat "$curDir" 
    ;; 
esac 

Auch dies ist wahrscheinlich nicht der optimale Weg, um Ihr Ziel zu erreichen. Eine Sache, die bei mir herausragt, ist die Variable $cursor. Das ist ein Rätsel für das, was Sie hier erreichen wollen. Auf jeden Fall hilft das hoffentlich ein wenig.