2017-02-04 3 views
2

Ich arbeite an einem Bash-Skript, das zwei Ganzzahlen aufnimmt und alle Zahlen zwischen den beiden ausgibt. Es würde wie folgt aussehen:Alle Zahlen zwischen zwei gegebenen Zahlen drucken

Eingang:

bash testScript 3 10 
3 
4 
5 
6 
7 
8 
9 
10 

Dies ist ein Code, den ich schrieb, dass ich arbeiten würde dachte, aber ich habe nicht viel Glück hatte immer es noch zu arbeiten.

read myvar 
read myvar2 
while [ $myvar -le myvar2 ] 
do 
    echo $myvar 
    myvar=$(($myvar+1)) 

    //timer in-between numbers 

    sleep .5 
done 
+0

Anstatt zu sagen, dass etwas nicht funktioniert, beschreiben haben * warum * es nicht funktioniert - was Sie erwarten, und was Sie bekommen statt. (Siehe http://stackoverflow.com/help/how-to-ask im Allgemeinen und http://stackoverflow.com/help/mcve im Besonderen). –

+0

BTW, verwenden Sie die Schaltfläche '{}', nachdem Sie eine Code-Region ausgewählt haben, um sie für die Aufnahme als solche zu formatieren. –

+0

Ein Hinweis übrigens: Befehlszeilenargumente sind von Eingabe getrennt. 'read' liest von stdin, während Argumente, die an Ihr Skript in der Befehlszeile übergeben werden, im Array' "$ @" 'stehen und auch über' "$ 1" ',' "$ 2" 'usw. referenziert werden können. –

Antwort

0

Ihre geschrieben Codes nicht richtig, nicht sicher ausgerichtet, wenn es Ihre tatsächlichen Codes ist. Aber nur ein anderes Problem als die Ausrichtung ist, dass Sie in der while-Anweisung ein $ für myvar2 verpasst haben.

read myvar 
read myvar2 

while [ $myvar -le $myvar2 ] 
do 

    echo $myvar 
    myvar=$(($myvar+1)) 

    #//timer in-between numbers 

    sleep .5 

done 
+0

natürlich // ist kein gültiger Kommentar – Shiping

2

Bash unterstützt c Stil für Schleifen mit einem double parenthesis Konstrukt:

$ for ((x=3; x<=10; x++)); { echo $x; } 
3 
4 
5 
6 
7 
8 
9 
10 

Oder Klammer Expansion:

$ for i in {3..6}; do echo $i; done 
3 
4 
5 
6 

Problem Klammer Erweiterung ist es, Sie müssen eval verwenden Variablen zu verwenden ...


Ein gemeinsames GNU-Dienstprogramm für dieses ist seq, aber es ist nicht POSIX, also möglicherweise nicht auf jedem * nix. Wenn Sie eine ähnliche Funktion in Bash schreiben wollen, würde es so aussehen:

my_seq() 
# function similar to seq but with integers 
# my_seq [first [incr]] last 
{ 
    incr=1 
    start=1 
    if [[ $# -gt 2 ]]; then 
     start=$1 
     incr=$2 
     end=$3 
    elif [[ $# -gt 1 ]]; then 
     start=$1 
     end=$2 
    else  
     end=$1 
    fi 
    for ((x=start; x<=end; x+=incr)); { echo $x; } 
} 

Dann, dass rufen mit 1, 2 oder 3 Argumente:

$ my_seq 30 10 60 
30 
40 
50 
60 
1

mit Klammer Expansion

$ echo {3..10} | tr ' ' '\n' 

oder für Variablen mit eval

$ a=3; b=10; eval echo {$a..$b} | ... 

oder, wenn Sie awk

$ awk -v s=3 -v e=10 'BEGIN{while(s<=e) print s++}' 
+0

Sie können dies jedoch nicht in einem Skript verwenden, wenn '3' und' 10' Positionsparameter sind. –

+0

Ja, in diesem Fall wird Eval benötigt. – karakfa

Verwandte Themen