Strona 1 z 1

[bash]Coś jak strumień wejścia w C++ i zamiana ostatniej linni pliku.

: 23 mar 2010, 21:12
autor: Miziak
Witam,
Tak jak w temacie mam pytanie czy w bash'u istnieje coś takiego jak np w C++ strumień wejścia czyli wprowadzenie wartości tekstowej do programu(w tym przypadku skryptu) oraz jak zamienić ostatnią linię pliku na inną bądź porostu usunąć i dodać na jej miejsce nową.

Z góry dzięki za pomoc, pozdrawiam,
Miziak

Odp: [bash]Coś jak strumień wejścia w C++ i zamiana ostatniej linni pliku.

: 23 mar 2010, 23:20
autor: Kuriozalny
Chodzi o parametry wywolania?
./skrypt parametr1 parametr2

Jesli tak to:
#!/bin/bash
echo "Nazwa pierwszego argumentu : $1"
echo "Nazwa drugiego argumentu : $2"
echo "Wszystkie argumenty: $*"
echo "$# - tyle argumentow"

Odp: [bash]Coś jak strumień wejścia w C++ i zamiana ostatniej linni pliku.

: 24 mar 2010, 06:42
autor: beluosus
Strumień != argument

Poniższy kod tworzy plik temp, przepisuje do niego dane ze standardowego wejścia i zamienia ostatnią linię.

Kod: Zaznacz cały

#!/bin/bash

rm temp

while read line
do
    echo "$line" >> temp
done

sed -i '$d' temp
echo "ostatnia linia" >> temp
Przykład użycia:

Kod: Zaznacz cały

./test.sh < jakis.txt

Odp: [bash]Coś jak strumień wejścia w C++ i zamiana ostatniej linni pliku.

: 24 mar 2010, 17:51
autor: Miziak
Okej, bo konkretnie chcę sobie napisać skrypcik do zmiany tapety we fluxbox'e bo sama ta zmiana jest uciążliwa bo po numero uno trzeba wklepać komendę do terminala potem z edytować plik który wywoła tapetę przy włączeniu flux'a a skrypcik by mi to ułatwił teraz na co mi strumień a no na to żeby wprowadzić do skryptu ścieżkę do tapety potem polecenie:

Kod: Zaznacz cały

fbsetbg -f + wprowadzona ścieżka
ustawi tapetę a następnie z pliczku usunie ostatnią linijkę i wstawi nową z podstawioną nową ścieżką tapety.
Zrobiłem taki prototyp ale nie działa ;/

Kod: Zaznacz cały

#!/bin/bash
echo Podaj lokalizację tapety:
read SCIERZKA

fbsetbg -f $SCIERZKA
Bardzo proszę o pomoc :(

Odp: [bash]Coś jak strumień wejścia w C++ i zamiana ostatniej linni pliku.

: 24 mar 2010, 21:08
autor: beluosus
To pewnie dlatego, że scieRZka pisze się przez Ż z kropką... Jeśli w nazwie są spacje to musisz zmienną dać w cudzysłów ("$...").

Powyższy sposób z readem jednak głupi jest (myślałem, że są Ci potrzebny konkretnie strumień, a nie owijanie w bawełnę). Zamiast while lepiej zrobić np:

Kod: Zaznacz cały

cp jakis.txt temp
Na jedno wyjdzie tylko szybciej i nie utnie spacji.

Odp: [bash]Coś jak strumień wejścia w C++ i zamiana ostatniej linni pliku.

: 25 mar 2010, 20:29
autor: Miziak
OKej ale to nadal nie rozwiązuje ani nie zmniejsza mego problemu ;/

Odp: [bash]Coś jak strumień wejścia w C++ i zamiana ostatniej linni pliku.

: 26 mar 2010, 13:04
autor: sulti
Pokaż jeszcze tą końcówkę pliku w którym chcesz zamieniać ostatnią linię, oraz podaj przykładową linię którą chcesz tam umieścić.
Dodaj też wywołanie komendy fbsetbg z linii poleceń, która na prawdę działa. Ubierze się to wszystko w skrypt.

Odp: [bash]Coś jak strumień wejścia w C++ i zamiana ostatniej linni pliku.

: 26 mar 2010, 20:17
autor: Miziak
@up
Okej więc tak:
Opis:
Konkretnie potrzebny mi skrypt który po wywołaniu u mnie z menu flux'a otworzy mi terminal i wypisze - "Podaj ścieżkę do tapety:" po czym podaję /to/jest/sciezka/do/tapety.jpg wtedy skrypt miałby ustawić tapetę za pomocą polecenia:

Kod: Zaznacz cały

fbsetbg -f /tutaj/wprowadzona/sciezka/do/tapety.jpg
Okej skryptu ustawił mi tapetkę jest pół biedy teraz flux ma ją ustawiać przy każdym włączeniu komputera za to opowiada plik o ścieżce:

Kod: Zaznacz cały

~/.fluxbox/init
gdzie init to plik konfiguracyjny nie katalog!
w nim na samym końcu jest taka linijka:

Kod: Zaznacz cały

session.screen0.rootCommand:	fbsetbg -f /tutaj/wprowadzona/sciezka/do/tapety.jpg
i trzeba ją zastąpić identyczną ale z zaktualizowaną ścieżką i to tyle terminal sie wyłącza i koniec działania skryptu.

Proszę bardzo o pomoc i pozdrawiam...

Odp: [bash]Coś jak strumień wejścia w C++ i zamiana ostatniej linni pliku.

: 26 mar 2010, 22:23
autor: sulti
Spróbuj coś takiego:

Kod: Zaznacz cały

#!/bin/bash

if [ ! $# -eq 1 ]; then
  echo "Usage: $0 /path/to/wallpaper.jpg"
  exit 1
fi

if [ ! -e $1 ]; then
  echo "$1 is not a file."
  exit 1
else
  echo "Setting wallpaper to $1."
  fbsetbg -f $1
fi

if [ ! -e "~/.fluxbox/init" ]; then
  echo "Couldn't find fluxbox config file."
  exit 1
else
  echo "Saving settings to config file."
  sed -i "s,\(session.screen0.rootCommand.*fbsetbg -f \).*,\1$1," ~/.fluxbox/init
fi

exit 0

Odp: [bash]Coś jak strumień wejścia w C++ i zamiana ostatniej linni pliku.

: 26 mar 2010, 22:45
autor: Miziak
Powiedz mi jeszcze jak do tego wyrażenia wprowadzić ścieżkę:

Kod: Zaznacz cały

sed -i "s,\(session.screen0.rootCommand.*fbsetbg -f \).*,\1$1," ~/.fluxbox/init
aby dopisywało coś w ten deseń:

Kod: Zaznacz cały

session.screen0.rootCommand:	fbsetbg -f /sciezka/do/tapety.jpg
ale podanej w parametrze a nie tak na sztywno

Odp: [bash]Coś jak strumień wejścia w C++ i zamiana ostatniej linni pliku.

: 26 mar 2010, 22:48
autor: sulti
Już jest - $1. Ten sed zamienia ciąg session.screen0...... na odpowiedni razem ze ścieżką podaną jako parametr, właśnie ten $1.
Skrypt jest zrobiony tak że powinien działać... Sprawdź :)

edit:
w całym skrypcie $1 jest parametrem w postaci "/sciezka/do/pliku"

Odp: [bash]Coś jak strumień wejścia w C++ i zamiana ostatniej linni pliku.

: 27 mar 2010, 14:01
autor: Miziak
A no racja ale teraz przyrzekam ostatnie pytanie :P jak zrobić aby skrypt otworzył nowy terminal i w nim dopiero się wykonał??