defiant Δημοσιεύτηκε Νοέμβριος 20, 2014 #1 Δημοσιεύτηκε Νοέμβριος 20, 2014 Έχω ένα for loop που επεξεργάζεται κάποια αρχεία.π.χfor file in $(find . -type f -name *.txt);doσε κάποιο σημείο ελέγχω αν υπάρχει ένα directory και αν δεν υπάρχει το δημιουργώ π.χif [ ! -d $destDir ]; then mkdir -p $destDirfiΘέλω αν η εντολή mkdir αποτύχει να εμφανίσω ένα μήνυμα και να πάω στο επόμενο loopοπότε άλλαξα το mkdir σε mkdir -p $destDir || echo "Permission denied." Πως μπορώ όταν αποτυγχάνει η εντολή mkdir να εμφανίσω το μήνυμα και να κάνει continue στο επόμενο loop,χωρίς να ξαναελεγχω κάνοντας π.χ if [ -d $destDir ]. Ουσιαστικά η ερώτηση μου είναι πως μπορώ να δώσω πάνω από μια εντολή μετά το || .
sstemp Νοέμβριος 20, 2014 #2 Νοέμβριος 20, 2014 mkdir -p "$destDir" 2> /dev/null || echo "Permission denied." && continueΓιατί το && συγκρίνεται με το τελευταίο στοιχείο της λίστας που είναι η echo και πετυχαίνει (εκτός από κάποιες πολύ ειδικές περιπτώσεις που αποτυγχάνει - π.χ. αν το shell script κληθεί από κάποιο process που έχει κλείσει τον descriptor - που τέτοια processes είναι κάποιοι δαίμονες). Προσπάθησε να κάνεις enclose τα variables σε double quotes. Ιδιαιτέρως όταν έχουν σχέση με το filesystem. Αν για παράδειγμα, με κάποιο τρόπο βρεθεί το destDir να έχει περιεχόμενο "/home -a 1 = 0", τότε δεν θα εισέλθει ποτέ ο έλεγχος στο if-block.
defiant Νοέμβριος 21, 2014 Author #3 Νοέμβριος 21, 2014 Αυτό ήταν από τα πρώτα που δοκίμασα όμως για κάποιο λόγο δεν κάνει αυτό που θέλω. Το continue εκτελείτε είτε επιτύχει η mkdir είτε αποτύχει. Δοκίμασα το παρακατω for i in {1..3};do test $i -eq 2 || echo "No" && continue echo "Yes $i=2"done Λογικά αυτό που θα έπρεπε να εμφανίσει είναι: No Yes 2=2 No Σωστά; Αυτό που εμφανίζει όμως είναι No No Εκτελεί δηλαδή το continue πάντα .
sstemp Νοέμβριος 21, 2014 #4 Νοέμβριος 21, 2014 Κακώς που δεν το δοκίμασα πριν απαντήσω. Δίκιο έχει το shell.test $i -eq 2 || (echo "No" ; return 1) || continueΟπότε:mkdir -p "$destDir" 2> /dev/null || (echo "Permission denied." ; return 1) || continue
defiant Νοέμβριος 23, 2014 Author #5 Νοέμβριος 23, 2014 Η λύση τελικά ήταν να μπούνε σε group.test $i -eq 2 || { echo "No" && continue; }mkdir -p "$destDir" 2> /dev/null || { echo "Permission denied." && continue; }
Dr.Paneas Νοέμβριος 24, 2014 #6 Νοέμβριος 24, 2014 Γιατί δεν το κάνεις πιο απλά;if ls /someDirectory 2> /dev/null; then echo "Found! Do that"; else echo "Not Found. Do this"; fi
defiant Νοέμβριος 26, 2014 Author #7 Νοέμβριος 26, 2014 Το ξέρω ότι υπάρχουν πολλοί τρόποι για να γίνει αυτό που θέλω,απλά έφαγα σκάλωμα με το πως να δώσεις δυο εντολές μετά το ||. Τη λύση τη βρήκα τελικά και την ποσταρα πιο πάνω. Επίσης αν δεν έχεις permission στο /someDirectory η ls θα αποτύχει ανεξάρτητααν υπάρχει το /someDirectory, οπότε καλύτερα θα ήταν if [ -d /someDirectory ] .Απλά ήθελα να το αποφύγω όλο αυτό .
Recommended Posts
Archived
This topic is now archived and is closed to further replies.