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.
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.
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)