Powiedzmy, że mam 2 zadania. Czy jest możliwe napisanie skryptu bash (jednego skryptu), który powinien wykonać pierwsze zadanie, gdy uruchamiamy po raz pierwszy i drugie zadanie, kiedy uruchamiamy skrypt po raz drugi i kolejny, gdy uruchamiamy trzeci raz i drugi skrypt, gdy uruchamiamy 4 raz?
Odpowiedzi:
1 dla odpowiedzi № 1Tak, łatwo to zrobić, pamiętając / utrzymując to, co zostało uruchomione ostatnio.
$ echo "1" > current_counter
$ cat current_counter
1
$ vim main.bash
$ cat main.bash
#/bin/bash
current_counter=$(<"current_counter")
if [[ "$((${current_counter}%2))" -eq 1 ]]; then
echo "Running task 1"
else
echo "Running task 2"
fi
echo "$((${current_counter}+1))" > "current_counter"
$ bash main.bash
Running task 1
$ cat current_counter
2
$ bash main.bash
Running task 2
$ cat current_counter
3
$ bash main.bash
Running task 1
$ cat current_counter
4
$ bash main.bash
Running task 2
$ cat current_counter
5
$
Możesz także użyć logicznego 0 lub 1 wplik current_counter lub po prostu sprawdzając istnienie pliku, ale będzie działać tylko w tym przypadku. Powyższy skrypt łatwo skaluje się, jeśli masz więcej zadań (nie tylko 2), np. 3 lub nawet 100; następnie wystarczy zmienić liczbę modułów i dodać więcej warunków do obsługi każdej pozostałości.
0 dla odpowiedzi nr 2
Zbyt trudno było mi przeczytać skrypt ritesht93, więc zrobiłem własne.
Wersja Bash
Uruchomienie skryptu zapewnia następujące dane wyjściowe:
{ ~ } » ./test.sh ~
First Run
{ ~ } » ./test.sh ~
Second Run
{ ~ } » ./test.sh ~
Third Run
{ ~ } »
Najpierw tworzymy plik z numerem 1:
{ ~ } » echo 1 > counter
Treść skryptu (test.sh):
#!/usr/bin/bash
foo=`cat counter`
if [ $foo -eq "1" ]
then
echo "First Run"
echo "2" > counter
fi
if [ $foo -eq 2 ]
then
echo "Second Run"
echo "3" > counter
fi
if [ $foo -eq 3 ]
then
echo "Third Run"
# after 3 times we reset
echo "1" > counter
fi
Wersja Pythona 3.0 (w razie potrzeby)
Miałem też czas zrobić to w pytonie:
Najpierw tworzymy plik z numerem 1:
{ ~ } » echo 1 > counter
Treść skryptu:
#!/usr/bin/python
with open("counter","r+") as file :
for l in file :
#print(type(l))
line = l.strip()
if line == "1" :
print ("this is line 1")
file.seek(0)
file.truncate()
file.write("2")
elif line == "2" :
print ("this is line 2")
file.seek(0)
file.truncate()
file.write("3")
elif line == "3" :
print ("this is line 3")
file.seek(0)
file.truncate()
file.write("1")
else :
print ("I"m lost, reset the counter")
0 dla odpowiedzi № 3
To nawet łatwiejsze niż dwie poprzednie odpowiedzi. Po prostu utwórz pusty plik kontrolny. Touch control
i usuń przy pomocy rm control
na przykład.
Kiedy go uruchomisz, sprawdź, czy istnieje, czy go zniszczysz i uruchom drugie zadanie, jeśli nie uruchomisz pierwszego i utworzysz je.
Nie musisz niczego sprawdzać wewnątrz pliku tylko jego istnienie.
Edytować
#!/bin/bash
$FILE=filename
if [-f $FILE]
then
#Task1
rm $FILE
else
#Task2
touch $FILE
fi
Możesz dodać więcej zadań, używając różnych nazw jako następnego skryptu:
#!/bin/bash
$FILE1=filename1
$FILE2=filename2
if [-f $FILE1]
then
#Task1
mv $FILE1 $FILE2
elif [-f $FILE2]
then
#Task2
rm $FILE2
else
#Task3
touch %FILE1
fi
W każdym razie myślę, że użycie tego z ponad 2 zadaniami nie jest dobrym pomysłem.