Wpis z mikrobloga

Mirki z #linux #bash, może też #programowanie

Chcę zrobić skrypt, który będzie mógł być wykonywany krokowo w zależności od potrzeb. Taki kod jako template

while :
do
case $1 in
"") set -- a ;;
"a") echo "a"; set -- b ;;
"b") echo "b"; set -- c ;;
"c") echo "c"; set -- d ;;
"d") echo "d"; break ;;

esac
done

więc jak skrypt uruchomię z parametrem "b", to się wykonają kroki od b w dół. Jak parametrem będzie "c", to się wykona od c. Gdy uruchomiony bez parametru, wtedy wykonują się wszystkie kroki.

To działa, przetestowałem.

Natomiast chciałem lekko to zmienić i zamiast brać krok z parametru $1, chcę go wziąć ze zmiennej. Schematycznie:
`
krok=$1
while :
do
case $krok in
"") set -- a ;;
"a") echo "a"; set -- b ;;
"b") echo "b"; set -- c ;;
"c") echo "c"; set -- d ;;
"d") echo "d"; break ;;

esac
done
`

W tej wersji nie działa. Output:
- bez parametru (lub z parametrem nie uwzględnionym w case) skrypt się zatrzymuje i nie robi nic.
- z parametrem "d" wyświetla literkę d i się kończy.
- z parametrami "a", "b" lub "c" wyświetla zadany parametr w nieskończonej pętli.

Co jest nie tak?
  • 6
  • Odpowiedz
  • Otrzymuj powiadomienia
    o nowych komentarzach

1. przed przypisaniem zmiennej krok=$1 ustaw pustą zmienną krok: krok=""
2. no i tak ma być
3. set co? przypisz wartość zmiennej, przy kolejnej iteracji będzie miał tą wartość: krok="cośtam"
  • Odpowiedz
@tegie: to nie jest czasem tak, że set ustawia Ci parametr i jeżeli ten parametr przypiszesz nie w pętli, to zmienna będzie miała pierwszą wartość? Na moje oko, to powinieneś mieć coś takiego:

"a") echo "a"; set b; krok=$1 ;;
i tak dalej
  • Odpowiedz
W tej wersji nie działa. Output:

- bez parametru (lub z parametrem nie uwzględnionym w case) skrypt się zatrzymuje i nie robi nic.

- z parametrem "d" wyświetla literkę d i się kończy.

- z parametrami "a", "b" lub "c" wyświetla zadany parametr w nieskończonej pętli.


@tegie: co do ostatniego, to masz moją
  • Odpowiedz
via Wykop Mobilny (Android)
  • 0
@tegie: a set dlatego "nie działał", że set -- b ustawiał $1 na b, bo set ustawia parametry pozycyjne. set a b by dał $1=a, $2=b. -- jest potrzebny chyba tylko gdy któraś z wartości zaczyna się na -
  • Odpowiedz