Προς το περιεχόμενο

Bash Scripting


insomniaK

Προτεινόμενες αναρτήσεις

Χαίρεται,

Πρέπει να γράψω ένα σχετικά μεγάλο script για bash, που περιλαμβάνει πολλά βήματα. Έχω κατεβάσει αυτό, αλλά έχω πρακτικές απορίες (Σημείωση: από προγραμματισμό ξέρω, η σύνταξη στο bash με δυσκολεύει).

 

Απορία νο 1.

 

Θέλω να έχω 2 nested loops, το πρώτο από 1 ως 100 και το δεύτερο από 200 ως 1000.

Η απορία πως πρέπει να δηλώσω αυτό το "ως" στη for χωρίς να χρειαστεί να γράψω όλα τα νούμερα, όπως πχ στο επόμενο παράδειγμα.

 

>
for i in 1 2 3 4
do
   echo number $i
done

Ουσιαστικά ψάχνω κάτι σαν for i=1:100

 

Απορία νο 2

 

Γενικά, την απορία νο 1 την αντιμετώπισα με την while, αλλά και πάλι έχω πρόβλημα

διότι δεν είναι δυνατόν να κάνω nested loop.

 

>#!/bin/bash
day=1
hour=200 
while [  $day -lt 100 ] ; do
while [  $hour -lt 1000 ]; do

[...]   

let day=day+1 
let hour=hour+1 
        
done
done

 

Μήπως ξέρετε κάποιον τρόπο ώστε να τρέχει για day = 1 όλα τα hour και μετά να πηγαίνει στο day = 2 κοκ;

 

Όλες οι συμβουλές καλοδεχούμενες και αν έχετε κάποιο βιβλίο που θεωρείτε καλό, αναφέρετε το.

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

 

Το 1 βγαίνει από το google, αλλά τα html howto, δεν τα βρίσκω βολικά.

Το 2 έχει μόνο παραδείγματα και δεν εξηγεί, τα οποία είναι copy paste από το 1 ή από αυτό που προτείνω στο πρώτο post.

Τα 3 και 4, είναι αυτά που χρησιμοποίησα για να δείξω το πρόβλημα που είχα.

 

Ευχαριστώ πάντως για τα λινκς. Γενικά, ψάχνοντας κατέληξα πως to μεγαλύτερο ποσοστό των tutorials, αντιγράφει ο ένας τον άλλον...

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

>
#!/bin/bash
for (( i=1; $i<10; i++ )); do
       for (( j=1; $j<10; j++ )); do
               echo "$i - $j"
       done
done

 

 

Ευχαριστώ, πόσο δύσκολο είναι να υπάρχει σε κάποιο tutorial αυτό το παράδειγμα;

 

Απορία νο 3

 

Οι δύο counters είναι κομμάτι του ονόματος κάποιων αρχείων της μορφής:

 

lsPd_M4_4_2_2008_0_48_8.dat.

 

Ουσιαστικά επειδή δε με απασχολούν όλα αυτά τα νούμερα που υφίστανται στο όνομα του αρχείου και για να μη βαρύνω περαιτέρω το σύστημα (υπάρχει πρόβλημα μνήμης), αναζητώ αν υπάρχει το αρχείο της μορφής

 

'lsPd_M*_'+date_cnt'+'*_'+hour_cnt'+_*.dat'

 

 

>

set filename = 'lspd_M',*,"$day",'_2008_',"$hour", *
echo ${filename}

if [ ! -f "$filename" ]
then
echo "$filename does not exists in the current directory"
else
echo "$filename does exists in the current directory"
fi 

 

Το οποίο και δε δουλεύει. Είμαι σχεδόν σίγουρος πως φταίει ο τρόπος που φτιάχνω το filename.

1. Τι κάνω λάθος;

2. Είναι δυνατόν σε bash να set filename με wildcards?

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Αυτό ζητάς;

>
for (( date=1; $date<10; date++ )); do
       for (( hour=1; $hour<50; hour++ )); do
               filename=("lsPd_M?_"$date"_?_2008_?_"$hour"_?.dat")
               if [ ! -f "$filename" ]
               then
                     echo "$filename does not exists in the current directory"
               else
                     echo "$filename does exists in the current directory"
               fi
       done
done

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

 

 

Τι ακριβώς θέλεις να κάνεις;

Μήπως θα σε βόλευε αυτό;

>
for fname in `ls lsPd_M*.dat`; do
       date=$(echo $fname | awk -F "_" '{print $4}')
       hour=$(echo $fname | awk -F "_" '{print $7}')
       echo "$fname hour:$hour date:$date"
done

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Αρχειοθετημένο

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

  • Δημιουργία νέου...