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

Bash, C, C++, Java, PHP, Ruby, GTK, Qt i wiele innych - wszystko tutaj.
Miziak
Sędziwy Jeż
Sędziwy Jeż
Posty: 33
Rejestracja: 05 lut 2010, 21:39
Płeć: Mężczyzna
Wersja Ubuntu: 13.10
Środowisko graficzne: Unity
Architektura: x86_64

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

Post 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
Kuriozalny
Piegowaty Guziec
Piegowaty Guziec
Posty: 26
Rejestracja: 26 sty 2007, 18:03
Płeć: Mężczyzna
Wersja Ubuntu: 16.04
Środowisko graficzne: Unity
Architektura: x86_64

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

Post 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"
Awatar użytkownika
beluosus
Zakręcona Traszka
Zakręcona Traszka
Posty: 695
Rejestracja: 01 paź 2006, 15:32
Płeć: Mężczyzna
Wersja Ubuntu: inny OS
Środowisko graficzne: Xfce
Architektura: x86
Kontakt:

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

Post 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
Kurs Linuksa: for i in $(ls /bin); do man $i; done
__________________
http://beluosus.pl/
Miziak
Sędziwy Jeż
Sędziwy Jeż
Posty: 33
Rejestracja: 05 lut 2010, 21:39
Płeć: Mężczyzna
Wersja Ubuntu: 13.10
Środowisko graficzne: Unity
Architektura: x86_64

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

Post 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 :(
Awatar użytkownika
beluosus
Zakręcona Traszka
Zakręcona Traszka
Posty: 695
Rejestracja: 01 paź 2006, 15:32
Płeć: Mężczyzna
Wersja Ubuntu: inny OS
Środowisko graficzne: Xfce
Architektura: x86
Kontakt:

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

Post 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.
Kurs Linuksa: for i in $(ls /bin); do man $i; done
__________________
http://beluosus.pl/
Miziak
Sędziwy Jeż
Sędziwy Jeż
Posty: 33
Rejestracja: 05 lut 2010, 21:39
Płeć: Mężczyzna
Wersja Ubuntu: 13.10
Środowisko graficzne: Unity
Architektura: x86_64

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

Post autor: Miziak »

OKej ale to nadal nie rozwiązuje ani nie zmniejsza mego problemu ;/
Awatar użytkownika
sulti
Serdeczny Borsuk
Serdeczny Borsuk
Posty: 139
Rejestracja: 17 wrz 2007, 15:31
Płeć: Mężczyzna
Wersja Ubuntu: 12.10
Środowisko graficzne: Unity
Architektura: x86

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

Post 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.
You tried, and you failed, so the lesson is, never try.
Miziak
Sędziwy Jeż
Sędziwy Jeż
Posty: 33
Rejestracja: 05 lut 2010, 21:39
Płeć: Mężczyzna
Wersja Ubuntu: 13.10
Środowisko graficzne: Unity
Architektura: x86_64

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

Post 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...
Awatar użytkownika
sulti
Serdeczny Borsuk
Serdeczny Borsuk
Posty: 139
Rejestracja: 17 wrz 2007, 15:31
Płeć: Mężczyzna
Wersja Ubuntu: 12.10
Środowisko graficzne: Unity
Architektura: x86

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

Post 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
You tried, and you failed, so the lesson is, never try.
Miziak
Sędziwy Jeż
Sędziwy Jeż
Posty: 33
Rejestracja: 05 lut 2010, 21:39
Płeć: Mężczyzna
Wersja Ubuntu: 13.10
Środowisko graficzne: Unity
Architektura: x86_64

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

Post 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
Awatar użytkownika
sulti
Serdeczny Borsuk
Serdeczny Borsuk
Posty: 139
Rejestracja: 17 wrz 2007, 15:31
Płeć: Mężczyzna
Wersja Ubuntu: 12.10
Środowisko graficzne: Unity
Architektura: x86

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

Post 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"
You tried, and you failed, so the lesson is, never try.
Miziak
Sędziwy Jeż
Sędziwy Jeż
Posty: 33
Rejestracja: 05 lut 2010, 21:39
Płeć: Mężczyzna
Wersja Ubuntu: 13.10
Środowisko graficzne: Unity
Architektura: x86_64

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

Post autor: Miziak »

A no racja ale teraz przyrzekam ostatnie pytanie :P jak zrobić aby skrypt otworzył nowy terminal i w nim dopiero się wykonał??
ODPOWIEDZ

Wróć do „Programowanie”

Kto jest online

Użytkownicy przeglądający to forum: Obecnie na forum nie ma żadnego zarejestrowanego użytkownika i 51 gości