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!

Ogłoszenie

Prosimy o pomoc dla małej Julki — przekaż 1% podatku na Fundacji Dzieciom zdazyć z Pomocą.
Więcej informacji na dug.net.pl/pomagamy/.

#1  2011-08-23 19:42:19

  winnetou - złodziej wirków ]:->

winnetou
złodziej wirków ]:->
Skąd: Jasło/Rzeszów kiedyś Gdańs
Zarejestrowany: 2008-03-31
Serwis

[SOLVED] [Bash + sed] Wprowadzanie zmian w skrypcie "live"

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 ;])

Kod:

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


LRU: #472938
napisz do mnie: ola@mojmail.eu
Hołmpejdż | Galerie | "Twórczość" || Free Image Hosting

Offline

 

#2  2011-08-23 19:56:13

  azhag - Admin łajza

azhag
Admin łajza
Skąd: Warszawa
Zarejestrowany: 2005-11-15

Re: [SOLVED] [Bash + sed] Wprowadzanie zmian w skrypcie "live"

Kod:

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)


Błogosławieni, którzy czynią FAQ.
opencaching :: debian sources.list :: coś jakby blog :: polski portal debiana :: linux user #403712

Offline

 

#3  2011-08-23 20:09:49

  Minio - Użyszkodnik

Minio
Użyszkodnik
Skąd: Poznań, Polska
Zarejestrowany: 2007-12-22
Serwis

Re: [SOLVED] [Bash + sed] Wprowadzanie zmian w skrypcie "live"

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

Kod:

/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:

Kod:

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

 

#4  2011-08-23 20:56:18

  azhag - Admin łajza

azhag
Admin łajza
Skąd: Warszawa
Zarejestrowany: 2005-11-15

Re: [SOLVED] [Bash + sed] Wprowadzanie zmian w skrypcie "live"

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

Kod:

/bin/sed -i -e "s/^LAST_UID=.\+/LAST_UID=${NEW_UID}/" "$SCRIPT"

Ostatnio edytowany przez azhag (2011-08-23 21:21:09)


Błogosławieni, którzy czynią FAQ.
opencaching :: debian sources.list :: coś jakby blog :: polski portal debiana :: linux user #403712

Offline

 

#5  2011-08-23 21:04:51

  winnetou - złodziej wirków ]:->

winnetou
złodziej wirków ]:->
Skąd: Jasło/Rzeszów kiedyś Gdańs
Zarejestrowany: 2008-03-31
Serwis

Re: [SOLVED] [Bash + sed] Wprowadzanie zmian w skrypcie "live"

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)


LRU: #472938
napisz do mnie: ola@mojmail.eu
Hołmpejdż | Galerie | "Twórczość" || Free Image Hosting

Offline

 

#6  2011-08-23 21:23:54

  Minio - Użyszkodnik

Minio
Użyszkodnik
Skąd: Poznań, Polska
Zarejestrowany: 2007-12-22
Serwis

Re: [SOLVED] [Bash + sed] Wprowadzanie zmian w skrypcie "live"

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:

Kod:

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:

Kod:

${LICZBA}zł

Offline

 

#7  2011-08-23 21:29:35

  azhag - Admin łajza

azhag
Admin łajza
Skąd: Warszawa
Zarejestrowany: 2005-11-15

Re: [SOLVED] [Bash + sed] Wprowadzanie zmian w skrypcie "live"

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


Błogosławieni, którzy czynią FAQ.
opencaching :: debian sources.list :: coś jakby blog :: polski portal debiana :: linux user #403712

Offline

 

#8  2011-08-23 21:41:24

  winnetou - złodziej wirków ]:->

winnetou
złodziej wirków ]:->
Skąd: Jasło/Rzeszów kiedyś Gdańs
Zarejestrowany: 2008-03-31
Serwis

Re: [SOLVED] [Bash + sed] Wprowadzanie zmian w skrypcie "live"

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


LRU: #472938
napisz do mnie: ola@mojmail.eu
Hołmpejdż | Galerie | "Twórczość" || Free Image Hosting

Offline

 

#9  2011-08-23 22:21:24

  Minio - Użyszkodnik

Minio
Użyszkodnik
Skąd: Poznań, Polska
Zarejestrowany: 2007-12-22
Serwis

Re: [SOLVED] [Bash + sed] Wprowadzanie zmian w skrypcie "live"

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

 

Stopka forum

Powered by PunBB
© Copyright 2002–2005 Rickard Andersson
To nie jest tylko forum, to nasza mała ojczyzna ;-)