BASH Proste pytanie

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

1

Jakoś tak.

if [ -x plik ]; then
    echo 'Plik wykonywalny'
else
    echo 'Plik nie jest wykonywalny'
fi
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

1

Użyj shift

2
Ktos napisał(a):

Jakoś tak.

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:

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

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

if [[ -x "$var" ]]; then
  echo "$var to plik wykonywalny";
else
  echo "$var to nie jest plik wykonywalny";
fi
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:

echo ${0##*/}
0

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

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

0
#!/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
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ś:

#!/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?

1
([ -d kat ] && (rm -rf kat && ls -al . ) ) || echo "Usunięcie katalogu nie powiodło się."
0

Mam jeszcze jedno pytanie tworze kalkulator i jest pewien problem

Tutaj urywek kodu:

#!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 *?

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.