Nowe posty

Autor Wątek: bash i ubuntu  (Przeczytany 4986 razy)

Bees

  • Gość
bash i ubuntu
« dnia: 2008-02-16, 12:30:01 »
Czy są jakieś szczególne różnice basha w Ubuntu od basha w innych systemach?
Przeglądam poradniki do pisania skryptów i rzadko co chce mi zadziałać. Sprawdzałem już rodzaj pliku ; koniec wiersza ; kodowanie nie wiem co jest grane.
np wykonuje cos takiego:
1.
#!/bin/bash
x=1
while [ $x -le 10 ]
do
echo "$x"
x= $ [ x + 1 ]
done
przez nazwa_pl.sh w konsoli i wpada w pętle nieskończoną z błędem
1
lp.sh: 7: $: not found

2.
#!/bin/bash
a=1
for((a=1;a<10;a++))
do
echo "LINUX"
done
efekt:
testy.sh: 3: Syntax error: Bad for loop variable

Skrypty biorę z podręczników na www bez żadnej modyfikacji.

arctgx

  • Gość
bash i ubuntu
« Odpowiedź #1 dnia: 2008-02-16, 13:28:18 »
Na moim bashu działa to:
#!/bin/bash
x=1
while [ $x -le 10 ]
do
        echo "$x"
        x=$(($x + 1))
done
Ale na temat działania kwadratowego nawiasu warto by zajrzeć do man bash.

W wersji, którą podałeś, na pewno skasowałbym spację między dolarem a nawiasem kwadratowym. Sprawia ona że zmienna x przyjmuje jako wartość znak dolara.

Chwilę prędzej dopisałem "a potem wykonuje polecenie test (które zastępujesz nawiasami kwadratowymi)", ale tak nie jest, bo albo przy tej spacji musiałby być średnik, albo (w skrypcie) znak nowej linii.

Można też po prostu dać
((x++))
zakładając że chcesz trzymać się pętli while zamiast choćby skorzystać z "for".

Tu znalazłem ciekawy tekst. Sam choćby dowiedziałem się z niego przed chwilą, jakie ułatwienie może dać wbudowana komenda declare.

konrad4s

  • Gość
bash i ubuntu
« Odpowiedź #2 dnia: 2008-02-16, 17:29:26 »
to tez powinno dzialac, tylko ze tak o:

#!/bin/bash
x=1
while [ $x -le 10 ]
do
echo "$x"
x=$[ x + 1 ]
done
Ps. Skoro ja pomoglem, to moze i mi ktos pomoze :P (nie zebym byl zaraz takim interesownym czlowiekiem, ale walcze z problemem od dwoch dni i nocy i szlag mnie trafia :/) ->  problem

arctgx

  • Gość
bash i ubuntu
« Odpowiedź #3 dnia: 2008-02-16, 17:40:41 »
To też ciekawe, konrad4s: spoglądałem, czym różni się Twoja podpowiedź od mojej - a tym że sam skasowałem tylko spację po dolarze (co jeszcze było za mało, ale było potrzebne), Ty również przed (i to dopiero zadziałało) :). Spacje mają szczególne znaczenie w bashu (ed: chyba że zaczniemy zmieniać odpowiednio IFS)...

Bees

  • Gość
bash i ubuntu
« Odpowiedź #4 dnia: 2008-02-16, 18:42:49 »
Dzięki za zainteresowanie.
Najdziwniejsze jest to, że w konsoli pisane po kolei działa natomiast jak przeniose do pliku i wywołam to nagle mija ochota i wyświetla błędy.
podane przez arctgx
#!/bin/bash
x=1
while [ $x -le 10 ]
do
        echo "LP to $x"
        x=$(($x+1))
done
działa także prze wywołanie z pliku.sh.

Natomiast podane przez konrad4s dziala w konsoli pisane po kolei ale z pliku.sh już nie:
daje taki wynik:
1
testy.sh: 7: x: not found
w nieskończoność
ot specyfika ...
Pozdrawiam!

arctgx

  • Gość
bash i ubuntu
« Odpowiedź #5 dnia: 2008-02-16, 20:53:56 »
Proponuję zagłębić się trochę w manual basha - po polsku jest - i poszukać. Sam pewnie bym zrobił to z ciekawości, ale mam masę innych ciekawych rzeczy, również z tą powłoką, do zrobienia, choćby opanować sposób na łatwe wyposażanie poleceń w zbiory możliwych dopełnień (np. ich opcji czy plików z odpowiednimi rozszerzeniami) i też czeka mnie trochę jazdy z podręcznikiem i eksperymentów.

Na podobieństwo zapuść sobie polecenie
Kod: bash [Zaznacz]
for i in /bin/*; do echo ${i##@(/bin|/bin/z)}; done

raz z linii poleceń, raz w skrypcie. U mnie jest tak, że alternatywa "@( | )" działa w linii poleceń, a w skrypcie już nie. W skrypcie trzeba włączyć opcję extglob (shopt -s extglob). Może u Ciebie jest jeszcze inna różnica ustawień. Aby to sprawdzić, odpal shopt bez parametrów raz ze skryptu, raz z linii poleceń.