Jump to content



Μπέρδεμα με || operator


defiant

Recommended Posts

Έχω ένα 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

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

Αυτό ήταν από τα πρώτα που δοκίμασα όμως για κάποιο λόγο δεν κάνει αυτό που θέλω.

 

Το 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 πάντα :huh: .

Link to comment
Share on other sites

Το ξέρω ότι υπάρχουν πολλοί τρόποι για να γίνει αυτό που θέλω,

απλά έφαγα σκάλωμα με το πως να δώσεις δυο εντολές μετά το ||. Τη λύση τη βρήκα τελικά και την ποσταρα πιο πάνω.

 

Επίσης αν δεν έχεις permission στο /someDirectory η ls θα αποτύχει ανεξάρτητα

αν υπάρχει το /someDirectory, οπότε καλύτερα θα ήταν if [ -d /someDirectory ] .

Απλά ήθελα να το αποφύγω όλο αυτό .

Link to comment
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
×
×
  • Δημιουργία...

Important Information

Ο ιστότοπος theLab.gr χρησιμοποιεί cookies για να διασφαλίσει την καλύτερη εμπειρία σας κατά την περιήγηση. Μπορείτε να προσαρμόσετε τις ρυθμίσεις των cookies σας , διαφορετικά θα υποθέσουμε ότι είστε εντάξει για να συνεχίσετε.