Bash sprawdzanie ilości parametrów

0

Hej chcę napisać skrypt który sprawdzi, czy podano więcej niż jeden parametr. Jeśli tak, to ma wyświetlać pierwszy parametr. Jeśli nie, to wyświetli komunikat, że nie podano
parametrów.
Nie wiem co dać do warunku w if żeby sprawdzało czy podało się więcej niż 1 parametr.
W załączniku jest mój dotychczas napisany skrypt.

0

A jak ten skrypt działa? Co robi dla przypadków: (a) 0 parametrów, (b) 1 parametr, (c) więcej niż 1 parametr?

0

@Silv: dla przypadków (a) i (b) ma pokazać "Nie podano parametrów" a dla (c) "Pierwszy parametr to: (no i tutaj co jest 1 parametrem)

0

OK, rozumiem, co chcesz uzyskać, ale miałem na myśli jak działa kod, który już napisałeś/aś (ten w załączniku).

1

@Silv:
sorki nie zrozumiałam
Tak to wygląda

1

OK, dzięki. Twój obecny skrypt Bash interpretuje tak:

  1. Patrzy, że jest instrukcja if.
  2. W związku z tym, że jest instrukcja if, zakłada, że to, co jest po tej instrukcji tym słowie kluczowym, jest poleceniem.
  3. W związku z tym próbuje to wykonać.
  4. W związku z tym otrzymujesz komunikat: command not found. Bo Bash nie może znaleźć w Twoim systemie polecenia [@.

(Tutaj masz oficjalną dokumentację instrukcji if -> https://www.gnu.org/software/bash/manual/bash.html#Conditional-Constructs (to tak na wszelki wypadek zamieszczam, jakbyś chciała kiedyś do poduszki poczytać. ;) Ale mówiąc poważnie warto korzystać, jak piszesz skrypty w Bashu, bo to naprawdę dobrze napisana dokumentacja)).

Domyślam się, że chodziło Ci raczej o wykorzystanie polecenia test (tutu dokumentacja), lub też [ (to to samo polecenie). Żeby Bash rozpoznał, że chodzi Ci o to polecenie, musi być spacja po nim, a także spacja przed nawiasem zamykającym. Czyli powinnaś napisać tak:

if [ @>1 ]

Nadal to jednak nie będzie działać. Dlaczego? Trzeba wejść głębiej. Ciąg znaków @>1 oznacza dla Basha "przekieruj wyjście polecenia @ do pliku o nazwie 1, usuwając wszystko, co jest w tym pliku". Gdybyś wykonała powyższy kod, zobaczyłabyś, że masz w bieżącym katalogu nowy plik o nazwie 1. (Mówiąc mimochodem, nie wiem, czemu akurat polecenie [ nie pokazuje żadnego błędu, ale poszukam z ciekawości).

Co więc zrobić, żeby to działało? Domyślam się, że chodziło Ci o coś takiego:

if [ $#>1 ]

W tym kodzie $# to tzw. special parameter (tutu dokumentacja), który określa liczbę positional parameters, czyli mówiąc potocznie, po prostu parametrów skryptu. Generalnie wszystkie parametry i zmienne w Bashu zaczynają się od znaku $ – to ważne, żeby zapamiętać.

Ale to nadal nie będzie działać. W innych językach zapewne zadziała, np. w C++. Ale w Bashu operator > oznacza sortowanie leksykograficzne (tutu dokumentacja). UPDATE Mój błąd, to nadal jest przekierowanie do pliku w tym kontekście.

Ostatecznie więc powinno to wyglądać tak:

if [ "$#" -gt 1 ]
then echo "$1"
else echo "Nie podano parametrów"
fi

Przy okazji dwie sprawy, niepowiązane z Twoim pytaniem:

  1. Kod zamieszczaj, proszę, w miarę możliwości bezpośrednio w poście – nie rób zrzutów ekranu. W ten sposób łatwiej mi/komuś będzie np. przekopiować go gdzieś i sprawdzić jego działanie (nie każdy ma interpreter Basha w głowie ;) ).
  2. Widzę, że nadałaś skryptowi prawo wykonywania za pomocą polecenia chmod +x <nazwa pliku>. Moim zdaniem nie jest to najlepsze z uwagi na bezpieczeństwo, bo w ten sposób każdy użytkownik systemu może ten skrypt wykonać. Lepiej robić tak: chmod u+x <nazwa pliku>. W ten sposób dany skrypt będzie mógł być wykonany jedynie przez jego właściciela. Więcej o poleceniu chmod możesz poczytać, wykonując w terminalu polecenie man chmod.

UPDATE2 Poprawię sam siebie: wygląda na to, że żeby operator > użyty w poleceniu [ sortował (jak napisałem wcześniej, ale skreśliłem), trzeba zrobić coś takiego: [ 1 \> 2 ]. Ale nie polecam tego robić – lepiej używać zawsze operatora -gt. Bardziej czytelna intencja autora kodu.


UPDATE3 Tutaj możesz więcej poczytać na temat operatorów > oraz -gt -> https://unix.stackexchange.com/questions/263371/difference-between-and-gt

1 użytkowników online, w tym zalogowanych: 0, gości: 1