Nie jesteś zalogowany.
Jeśli nie posiadasz konta, zarejestruj je już teraz! Pozwoli Ci ono w pełni korzystać z naszego serwisu. Spamerom dziękujemy!
Prosimy o pomoc dla małej Julki — przekaż 1% podatku na Fundacji Dzieciom zdazyć z Pomocą.
Więcej informacji na dug.net.pl/pomagamy/.
Strony: 1
Próbuję stworzyć skrypt, który będzie tworzył plik podobny do /etc/passwd. I utknałem w jednym miejscu.
Jak do seda przekazać zmienną ze skryptu lub jak ją zmodyfikować tak aby została zapamiętana do następnego odpalenia skryptu? Wiem trochę to pokręcone ale "pojaśnienia" sytuacji kod (na razie wersja prealfa ;])
#!/bin/bash SCRIPT=$0 LOGIN=$1 HASH=$(mkpasswd -5 $2); DIR=$3 SHELL="/bin/false" PASS_FILE="/path/to/my_passwd" LAST_UID=10000 CALLER_GID=$(id -g) echo $LOGIN:$HASH:$LAST_UID:$CALLER_GID:$DIR:$SHELL > $PASS_FILE NEW_UID=$(($LAST_UID + 1)) /bin/sed -i -e 's/^LAST_UID=/LAST_UID=$NEW_UID/' $SCRIPT
Oczywiście takie wywołanie seda nie działa ;)
Przy pierwszym odpaleniu LAST_UID ma wartość 10000 i chciałbym aby po każdym uruchomieniu dziadostwa zmienna ta się zwiększała (czyli przy drugim wartość jest 10001, przy trzeci 10003, etc). Mam nadzieję, że coś z tego rozumiecie :))
Ostatnio edytowany przez winnetou (2011-08-23 21:07:40)
Offline
azhag@tyrael ~ % FOO=bar azhag@tyrael ~ % echo "$FOO" bar azhag@tyrael ~ % echo '$FOO' $FOO azhag@tyrael ~ %
Mam nadzieję, że to wyjaśnia.
W razie czego pytanie naprawadzające: jaka jest różnica między apostrofem (zwanym z niewiadomych mi powodów pojedynczym cudzysłowiem) a cudzysłowiem (podwójnym) w konktekście zmiennych?
Tak w ogóle — po co edytować skrypt (nie jestem w ogóle pewien czy zapisywanie wykonywanego pliku jest możliwe), nie lepiej zapisywać dane w osobnym pliku (najpierw wczytywanym do zmiennej, potem zapisywanym najzwyjlejszym przekierowaniem echo)?
Ostatnio edytowany przez azhag (2011-08-23 20:06:04)
Offline
1. Używaj readlink do odczytania bezwzględnej ścieżki do skryptu, bo Ci się rozjedzie jak zaczniesz go uruchamiać z różnych lokalizacji.
2. NEW_UID jest tworzony na podstawie zmiennej UUID, która nigdzie wcześniej nie jest zdefiniowana.
3. Twój sed zamienia tylko LAST_UID=, bez jego wartości.
4. Musisz zmienną powłoki umieścić poza nawiasami apostrofami, o tak (zwróć uwagę na apostrofy i cudzysłowy):
/bin/sed -i -e 's/^LAST_UID=/LAST_UID='"$NEW_UID"'/' $SCRIPT
5. Zawsze otaczaj zmienne cudzysłowami, zaoszczędzisz sobie wiele kłopotów.
Działający przykład po wszystkich poprawkach:
#!/bin/bash SCRIPT="$(readlink -f $0)" LOGIN="$1" HASH="$(mkpasswd -5 $2)" DIR="$3" SHELL="/bin/false" PASS_FILE="/path/to/my_passwd" LAST_UID=1000 CALLER_GID="$(id -g)" echo "$LOGIN:$HASH:$LAST_UID:$CALLER_GID:$DIR:$SHELL" NEW_UID=$((LAST_UID + 1)) /bin/sed -i -e 's/^LAST_UID=.\+/LAST_UID='"$NEW_UID"'/' "$SCRIPT"
azhag: skrypt się edytuje po to, żeby nie musieć tej zmiennej przechowywać w innym pliku. Akurat to rozwiązanie jest całkiem niezłe. Właściwe pytanie zaś brzmi:
dlaczego po prostu nie użyć pętli, skoro zmienna ma być inkrementowana z każdym kolejnym przebiegiem?
Offline
Minio napisał(-a):
dlaczego po prostu nie użyć pętli, skoro zmienna ma być inkrementowana z każdym kolejnym przebiegiem?
Ponieważ poszczególne wywołania nie muszą występować po sobie automatycznie i od razu.
Ty też dopiero przekombinowałeś z cudzysłowiami i apostrofami ;)
/bin/sed -i -e "s/^LAST_UID=.\+/LAST_UID=${NEW_UID}/" "$SCRIPT"
Ostatnio edytowany przez azhag (2011-08-23 21:21:09)
Offline
Na początek UUID był literówką - po zmianie nazewnictwa zmiennych ;) powinno być LAST_UID.
Tak jak zauważył azhag - skrypt będzie odpalany na "widzimisię"
Wiem jaka jest różnica między ' a ".
Zaraz przetestuję seda z cudzysłowami - nie wiem dlaczego ale od zawsze jak go używam to jechałem z apostrofem ;]
Zmienne na ogół albo traktuję przez "$ZMIENNA" albo ${ZMIENNA}. Sam skrypt jest w fazie baaaardzo wczesnej ;)
EDYTKA:
Dzięki azhag. Śmiga jak ta lala ;) Nie wpadłbym pewnie na to, że seada można zamknać w " " zamiast w ' ' ;))
Ostatnio edytowany przez winnetou (2011-08-23 21:07:24)
Offline
azhag napisał(-a):
Ty też przekombinowałeś z cudzysłowiami i apostrofami ;)
Kod:
/bin/sed -i -e "s/^LAST_UID=.\+/LAST_UID=${NEW_UID}/" "$SCRIPT"
To celowy zabieg. Z przyzwyczajenia polecenia sed-a zamykam w apostrofy.
winnetou napisał(-a):
Zmienne na ogół albo traktuję przez "$ZMIENNA" albo ${ZMIENNA}.
Ale te zapisy nie są równoważne:
minio@pingwin tmp ]:-> ZMIENNA="zmienna testowa" minio@pingwin tmp ]:-> echo $ZMIENNA zmienna testowa minio@pingwin tmp ]:-> for i in $ZMIENNA; do echo ---"$i"---; done ---zmienna--- ---testowa--- minio@pingwin tmp ]:-> for i in ${ZMIENNA}; do echo ---"$i"---; done ---zmienna--- ---testowa--- minio@pingwin tmp ]:-> for i in "$ZMIENNA"; do echo ---"$i"---; done ---zmienna testowa---
W cudzysłowy zmienną zamykamy, jeżeli zawiera jakieś znaki, które mogą być interpretowane przez powłokę. W klamerki — jeżeli zaraz po zmiennej musimy umieścić inny znak, który powłoka mogłaby interpretować jako część nazwy zmiennej:
${LICZBA}zł
Offline
Jeszcze dodam:
Minio napisał(-a):
azhag: skrypt się edytuje po to, żeby nie musieć tej zmiennej przechowywać w innym pliku. Akurat to rozwiązanie jest całkiem niezłe.
Nie jestem pewien czy to takie dobre rozwiązanie. Wg mnie lepiej zapisywać w osobnym pliku dodatkowe dane (i po wczytaniu je sprawdzać) niż edytować cały skrypt. Mniejsze ryzyko zrobienia Czegoś Niedobrego™ w przypadku Katastrofalnej Awarii® (np. zapełnienie dysku lub błąd systemu plików w wyniku czego "nowy" skrypt nie zapisze się w całości).
Offline
O klamerkach i cudzysłowach nie wiedziałem do końca, że taka jest różnica ;) Dzięki za uświadomienie.
Widzę, że Minio jak też z przyzwyczajenia seda pakuje w apostrofy ;)
Człowiek uczy się całe życie ;) W każdym razie działa jak miało działać (no prawie ale to się dopieści).
Dzięki za wskazówki i w ogóle
Proszę podać nr kont to przeleję po 5.40 + VAT :)
Offline
azhag: wszystko zależy od potrzeb. Ja ten skrypt interpretowałem w kategoriach „zrób co masz do zrobienia i nie wracaj”, czyli takiego trochę bardziej rozbudowanego one-linera. W takiej sytuacji uważam że nadpisywanie skryptu jest zupełnie w porządku. Jeżeli skrypt ma być częścią czegoś większego, to pewnie warto rozważyć użycie pliku konfiguracyjnego (lub jego namiastki).
winnetou napisał(-a):
Proszę podać nr kont to przeleję po 5.40 + VAT :)
Jest na mojej stronie domowej ;) .
Offline
Strony: 1