BASH Proste pytanie

N6
  • Rejestracja:około 8 lat
  • Ostatnio:około 8 lat
  • Postów:5
0

Witam,mam do napisania skrypt w bashu,który :

• Po wywołaniu bez parametrów, winien wyprowadzić napis:
Ten skrypt przechowywany jest w pliku „nazwa pliku”, a następnie winien zbadać atrybut wykonywalności pliku przez bieżącego użytkownika i wyświetlić odpowiednio komunikat: Plik wykonywalny albo Plik niewykonywalny.

Ktoś jest w stanie mi powiedzieć jak sprawdzić czy dany plik jest wykonywalny ale nie poprzez wpisanie ręcznie z klawiatury ls -l tylko aby sam skrypt to sprawdzal ,jeżeli jest to wypisać poprzez echo - Plik wykonywalny w przeciwnym wypadku - Plik niewykonywalny

edytowany 2x, ostatnio: NP693vqavw
Ktos
Moderator
  • Rejestracja:prawie 23 lata
  • Ostatnio:około 8 godzin
1

Jakoś tak.

Kopiuj
if [ -x plik ]; then
    echo 'Plik wykonywalny'
else
    echo 'Plik nie jest wykonywalny'
fi
N6
  • Rejestracja:około 8 lat
  • Ostatnio:około 8 lat
  • Postów:5
0

Dziękuje,działa,a jak zrobić aby wypisał wszystkie parametry, które podałem,tylko własnie nie wszystkie w jednej lini - $@
tylko
parametr 1=
parametr 2=
itd...
Mam problem właśnie jak w petli wypisać kolejne parametry ,bo standardowo wypisuje sie to poprzez $1=1 parametr , $2 = 2 parametr itd... a jeżeli dam $i to wypisuje mi tylko cyfry pętli a chce aby sie zwiekszala wartość $1 o 1 wypisywała kolejne parametry....

O tą pozycje mi chodzi :
screenshot-20170405234011.png

edytowany 12x, ostatnio: NP693vqavw
hauleth
Moderator
  • Rejestracja:ponad 17 lat
  • Ostatnio:9 dni
1

Użyj shift


DR
  • Rejestracja:ponad 22 lata
  • Ostatnio:ponad 6 lat
  • Postów:683
2
Ktos napisał(a):

Jakoś tak.

Kopiuj
if [ -x plik ]; then
    echo 'Plik wykonywalny'
else
    echo 'Plik nie jest wykonywalny'
fi

Lepiej jest użyć składni [[ ]] ponieważ to jest built-in.

Iteracja po wszystkich argumentach przekazanych do skryptu najlepiej jest wykonać poprzez zmienną $@ która reprezentuje wszystkie argumenty np:

Kopiuj
for var in "$@"; do
  echo "$var";
done

Dodaj do tego powyższe sprawdzenie czy plik jest wynonywany:

Kopiuj
if [[ -x "$var" ]]; then
  echo "$var to plik wykonywalny";
else
  echo "$var to nie jest plik wykonywalny";
fi
MO
  • Rejestracja:około 10 lat
  • Ostatnio:9 minut
  • Lokalizacja:Tam gdzie jest (centy)metro...
1

Jeśli prowadzący jest "upierdliwym szczególarzem", może się jeszcze przyczepić do określenia nazwy pliku. W przypadku przekazania ścieżki w $0 obetniesz katalogi pozostawiając sam plik z użyciem:

Kopiuj
echo ${0##*/}

Każdy problem w informatyce można rozwiązać, dodając kolejny poziom pośredniości,z wyjątkiem problemu zbyt dużej liczby warstw pośredniości — David J. Wheeler
edytowany 1x, ostatnio: Mokrowski
hauleth
A dlaczego nie basename?
MO
A napisałem że dla "upierdliwego szczególarza".. miało być w bash a basename to zewnętrzna aplikacja.
hauleth
Ogólnie jeśli można, to należy unikać bashizmów kiedy tylko się da. Zwłaszcza, że z tego co napisał niżej używa sh nie basha.
N6
  • Rejestracja:około 8 lat
  • Ostatnio:około 8 lat
  • Postów:5
0

Reasumując mam do wykonania w całości takie zadanie:

Kopiuj
Napisz skrypt, który:
• Po wywołaniu bez parametrów, winien wyprowadzić napis:
Ten skrypt przechowywany jest w pliku „nazwa pliku”, a następnie
winien zbadać atrybut wykonywalności pliku przez bieżącego użytkownika
i wyświetlić odpowiednio komunikat: Plik wykonywalny albo Plik niewykonywalny.

• Po wywołaniu z parametrami, powinien podać ich liczbę oraz wyprowadzić wartości
kolejnych parametrów w postaci: 

a. Parametr nr 1: wartość1
b. Parametr nr 2: wartość2
itd.

Skrypt powinien działać poprawnie dla maksymalnie 9 parametrów wywołania, niezależnie
od tego jak zostanie nazwany przechowujący go plik. 10-ty i następne parametry
powinny być ignorowane.
UWAGA: weź pod uwagę różne sposoby uruchamiania pliku wykonywalnego.

Napisałem to w taki sposób,nie wiem czy dobrze zrozumiałem polecenie,jeżeli coś jest źle poprawcie mnie(wstawiam zdjęcie kodu bo nie wiem jak kopiować tekst z konsoli)- Skrypt działa,ale nie wiem czy miałem go tak zrobić.

screenshot-20170406123111.png

hauleth
Czemu screenshot a nie skopiujesz tekstu tutaj jak człowiek?
MO
Super... to bash czy sh? Druga sprawa to "po wywołaniu z parametrami" co oznacza że bez parametrów ma nie wyświetlać podanych parametrów.
N6
Bash pomyliłem sie .... ,,Druga sprawa to "po wywołaniu z parametrami" co oznacza że bez parametrów ma nie wyświetlać podanych parametrów'' Przecież tak działa właśnie skrypt???
MO
  • Rejestracja:około 10 lat
  • Ostatnio:9 minut
  • Lokalizacja:Tam gdzie jest (centy)metro...
0
Kopiuj
#!/usr/bin/env bash

echo "Ten plik przechowywany jest w pliku \"${0##*/}\""
echo -n "Plik "
if [[ -x "$0" ]]; then 
    echo "wykonywalny"
else 
    echo "niewykonywalny"
fi

echo -n "Podano $# parametr"
if [[ $# -lt 2 ]]; then
    :
elif [[ $# -lt 5 ]]; then
    echo -n "y"
else
    echo -n "ów"
fi
echo " wywołania."

PARAMETERS=($@)

for INDEX in ${!PARAMETERS[*]};
do
    echo "Parametr nr" $(($INDEX + 1)) ":" ${PARAMETERS[$INDEX]}
    if [[ $INDEX -eq 8 ]]; then
        break
    fi 
done

Każdy problem w informatyce można rozwiązać, dodając kolejny poziom pośredniości,z wyjątkiem problemu zbyt dużej liczby warstw pośredniości — David J. Wheeler
edytowany 2x, ostatnio: Mokrowski
N6
  • Rejestracja:około 8 lat
  • Ostatnio:około 8 lat
  • Postów:5
0

Dziękuje bardzo za pomoc,mam jeszcze ostatnie pytanie dotyczące basha...
Dostałem jeszcze jedno zadanie,którego treść brzmi :

Opracuj 1-wierszowy skrypt z warunkowym wykonaniem, który w bieżącym katalogu:

  • usunie katalog kat wraz z jego podkatalogami,
  • w razie powodzenia, wylistuje ze szczegółami zawartość katalogu bieżącego,
  • w razie niepowodzenia, wypisze komunikat: „Usunięcie katalogu nie powiodło
    się.”

Zrobiłem takie coś:

Kopiuj
#!/bin/bash 


 
if [ -d katalog ];
then 
rm -r katalog
ls -l
else 
echo "Usuniecie katalogu nie powiodlo sie" 
fi

Lecz nie wiem co prowadzący miał na myśli pisząc Opracuj 1-wierszowy skrypt.
Ktoś pomoże?

MO
  • Rejestracja:około 10 lat
  • Ostatnio:9 minut
  • Lokalizacja:Tam gdzie jest (centy)metro...
1
Kopiuj
([ -d kat ] && (rm -rf kat && ls -al . ) ) || echo "Usunięcie katalogu nie powiodło się."

Każdy problem w informatyce można rozwiązać, dodając kolejny poziom pośredniości,z wyjątkiem problemu zbyt dużej liczby warstw pośredniości — David J. Wheeler
N6
  • Rejestracja:około 8 lat
  • Ostatnio:około 8 lat
  • Postów:5
0

Mam jeszcze jedno pytanie tworze kalkulator i jest pewien problem

Tutaj urywek kodu:

Kopiuj
#!bin/bash
read a
read b
read opr


if [ $opr = "*" ]   <--- TUTAJ
    then 
        op=`expr $a \* $b`
        echo "$a * $b = $op"

Podaje 1 liczbe
Podaje 2 liczbe
Podaje wynik działania czyli * i wyskakuje jakiś błąd coś tam za dużo argumentow...,gdy zamienie to na jakikolwiek inny znak np ^ itp.. to wszystko ladnie wypisuje,co zrobic aby wykrywalo to *?

edytowany 10x, ostatnio: NP693vqavw

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.