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 ]. Ουσιαστικά η ερώτηση μου είναι πως μπορώ να δώσω πάνω από μια εντολή μετά το || . Link to comment Share on other sites More sharing options...
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. Link to comment Share on other sites More sharing options...
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 πάντα . Link to comment Share on other sites More sharing options...
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 Link to comment Share on other sites More sharing options...
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; } Link to comment Share on other sites More sharing options...
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 Link to comment Share on other sites More sharing options...
defiant Νοέμβριος 26, 2014 Author #7 Κοινοποίηση Νοέμβριος 26, 2014 Το ξέρω ότι υπάρχουν πολλοί τρόποι για να γίνει αυτό που θέλω,απλά έφαγα σκάλωμα με το πως να δώσεις δυο εντολές μετά το ||. Τη λύση τη βρήκα τελικά και την ποσταρα πιο πάνω. Επίσης αν δεν έχεις permission στο /someDirectory η ls θα αποτύχει ανεξάρτητααν υπάρχει το /someDirectory, οπότε καλύτερα θα ήταν if [ -d /someDirectory ] .Απλά ήθελα να το αποφύγω όλο αυτό . Link to comment Share on other sites More sharing options...
Recommended Posts
Archived
This topic is now archived and is closed to further replies.