Nowe posty

Autor Wątek: prosty skrypt: tworzenie pliku i nadawanie uprawnień  (Przeczytany 9746 razy)

mareq85

  • Gość
Cześć, jestem początkujący w bashu, jeśli ktoś może mi pomóc z tym skryptem będę wdzięczny:

#!/bin/bash

# Ten skrypt służy do tworzenia nowych plików i jednoczesnego nadawania im uprawnień

TOUCH=`sudo touch echo $1`
CHMOD=`sudo chmod 777 echo $1`
PLIK=`echo $#`

if [ $PLIK -ne "1" ]; then
 echo "Usage: ./nowy nazwa_pliku (nazwa nie może zawierać spacji)"
elif [ -a /`pwd`/`echo $1` ]; then
   echo "Plik o podanej nazwie już istnieje"
   echo "Czy chcesz zmienić jego uprawnienia? [t/n]"
   read odp
    if [ "$odp" == "T" ] || [ "$odp" == "t" ]; then
      $CHMOD
    elif  [ "$odp" == "N" ] || [ "$odp" == "n" ]; then
     echo "Plik pozostanie niezmieniony"
    else
     echo "Nieprawidłowa odpowiedź"
    fi
else
   $TOUCH && $CHMOD
fi
problem z tym skryptem polega na tym, że wyświetla część z elif nawet, gdy plik jeszcze nie istnieje w bieżącym katalogu. Próbowałem już podstawiać zamiast -a także -f i -e.

ZipoKing

  • Gość
prosty skrypt: tworzenie pliku i nadawanie uprawnień
« Odpowiedź #1 dnia: 2007-09-20, 22:36:18 »
Twój problem polega na tym, że skrypt nawet nie musi wchodzić do if-a, żeby stworzyć plik (jest on tworzony na samym początku skryptu, zanim jeszcze plik wejdzie w if-a). Żeby to wyjaśnij, przyjrzyj się moim poprawkom, i porównaj ze swoją wersją:
#!/bin/bash

# Ten skrypt służy do tworzenia nowych plików i jednoczesnego nadawania im uprawnień

TOUCH='touch '$1
CHMOD='chmod 777 '$1
PLIK=`echo $#`

if [ $PLIK -ne "1" ]; then
 echo "Usage: ./nowy nazwa_pliku (nazwa nie może zawierać spacji)"
elif [ -a `pwd`/$1 ]; then
   echo "Plik o podanej nazwie już istnieje"
   echo "Czy chcesz zmienić jego uprawnienia? [t/n]"
   read odp
    if [ "$odp" == "T" ] || [ "$odp" == "t" ]; then
      $CHMOD
    elif  [ "$odp" == "N" ] || [ "$odp" == "n" ]; then
     echo "Plik pozostanie niezmieniony"
    else
     echo "Nieprawidłowa odpowiedź"
    fi
else
   $TOUCH && $CHMOD
fi
Jak widzisz, zmieniłem rodzaj apostrofów. Pisząc TOUCH=`touch echo $1` powodujesz to, że do zmiennej $TOUCH przypisywany jest wynik wykonania polecenia touch echo $1, a nie sama treść polecenia. Poza tym niepotrzebnie używasz wszędzie `echo $1` - wystarczy po prostu zwykłe $1.

Offline ultr

  • Users
  • Guru
  • *****
  • Wiadomości: 1177
    • Zobacz profil
prosty skrypt: tworzenie pliku i nadawanie uprawnień
« Odpowiedź #2 dnia: 2007-09-20, 23:28:59 »
Dodam tylko, że nazwa pliku może zawierać spacje. Wystarczy wywołać skrypt w ten sposób:
./nowy "nazwa pliku"
W zmiennej $1 będzie ciąg znaków "nazwa pliku". Jednak wtedy polecenia touch i chmod powinny wyglądać tak:
TOUCH='touch "$1"'
CHMOD='chmod 777 "$1"'
Zawsze dobrze jest w poleceniu zamknąć parametr w "", bo nigdy nie wiesz co user wpisze, a ty założyłeś w skrypcie, że ma być to jeden parametr, a nie wiele rozdzielonych spacjami.

Jeszcze jedna uwaga:
elif [ -a `pwd`/$1 ]; then
Nie potrzebnie używasz `pwd`. Jeżeli parametr będzie tylko nazwą pliku, to automatycznie odniesie się do aktualnego katalogu. Natomiast jeżeli użytkownik poda jako parametr całą ścieżkę do pliku (np: "/home/user/plik.txt"), to skrypt zadziała źle.

mareq85

  • Gość
prosty skrypt: tworzenie pliku i nadawanie uprawnień
« Odpowiedź #3 dnia: 2007-09-22, 22:44:32 »
Dzięki Zipo, faktycznie nie pomyślałem o tym, żeby usunąć echo. Teraz działa.
ultr: uwaga z niezamieszczaniem `pwd` jest słuszna, dzięki. Co się zaś tyczy wpisywania nazw w cudzysłowiu to jest to chyba niewykonalne. Jeśli zainicjuje zmienne w ten sposób:
TOUCH='touch "$1"'
CHMOD='chmod 777 "$1"'
to wtedy utworzy się plik o nazwie: "$1"
Podobnie bez cudzysłowiu. Jeśli zaś w cudzysłowiu, ale po apostrofach, to wyrzuci ostrzeżenie i utworzy dwa odmienne pliki (np: ./nowy "re w" utworzy re i w)