[bash][solved] Zmiana reprezentacji liczb

Bash, C, C++, Java, PHP, Ruby, GTK, Qt i wiele innych - wszystko tutaj.
Awatar użytkownika
blue_scv
Piegowaty Guziec
Piegowaty Guziec
Posty: 18
Rejestracja: 29 kwie 2008, 19:54
Płeć: Mężczyzna
Wersja Ubuntu: 10.10
Środowisko graficzne: GNOME
Architektura: x86_64
Kontakt:

[bash][solved] Zmiana reprezentacji liczb

Post autor: blue_scv »

Witam,
Mam pewien problem, bowiem napisałem pewien skrypt, który ma tworzyć katalogi z zerami wiodącymi, czyli zamiast wyświetlania liczb 1,2, ..., 10, ma wyświetlić 01, 02, ..., 10. Problem pojawia się przy liczbie 08, 09. Liczby te z tego co wygląda traktowane są jako liczby Oktalne. Wyświetlane błędy to:

08: value too great for base (error token is "08")
oraz
09: value too great for base (error token is "09")

Polecenie, które jest odpowiedzialne za wstawianie tych wiodących zer to:
seq -w 1 $zmienna

Wiem, że można opuścić opcję -w, aczkolwiek chciałbym aby numery zaczynały się od zera, gdy liczba utworzonych katalogów jest dwu lub więcej cyfrowa.

Czy istnieje jakieś formatowanie reprezentacji danych, coś jak deskryptor formatu w C?

Z góry dzięki za pomoc ;)
Awatar użytkownika
kabanek
Zakręcona Traszka
Zakręcona Traszka
Posty: 592
Rejestracja: 23 cze 2009, 20:34
Płeć: Mężczyzna
Wersja Ubuntu: 13.10
Środowisko graficzne: Xfce
Architektura: x86_64
Kontakt:

Odp: [bash] Zmiana reprezentacji liczb

Post autor: kabanek »

jak chcesz, żeby zaczynały się od 0 to po prostu utwórz katalog poza pętlą o nazwie "0" i po problemie :)

albo tez można zrobić to za pomocą 2 lub więcej zagnieżdżonych pętli. oto przykład:

Kod: Zaznacz cały

#!/bin/sh

for i in `seq 0 9`; do
	for j in `seq 0 9`; do
		mkdir $i$j;
	done;
done
mam nadzieję, że pomogłem
Awatar użytkownika
thalcave
Przyjaciel
Przyjaciel
Posty: 821
Rejestracja: 08 lis 2006, 12:17
Płeć: Mężczyzna
Wersja Ubuntu: inny OS
Środowisko graficzne: Fluxbox
Architektura: x86

Odp: [bash] Zmiana reprezentacji liczb

Post autor: thalcave »

może pomoże podanie zmiennej, do której przypisujesz liczby z zerami wiadącymi w " "
GNU/Linux user
Na pytania na PW/e-mail nie udzielam odpowiedzi!
Szanujmy innych użytkowników!
Wesprzyj akcje: Temat rozwiązany -> dodajemy [solved]
Awatar użytkownika
blue_scv
Piegowaty Guziec
Piegowaty Guziec
Posty: 18
Rejestracja: 29 kwie 2008, 19:54
Płeć: Mężczyzna
Wersja Ubuntu: 10.10
Środowisko graficzne: GNOME
Architektura: x86_64
Kontakt:

Odp: [bash] Zmiana reprezentacji liczb

Post autor: blue_scv »

Kod: Zaznacz cały

function building_tree
{
	echo "Funkcje budująca drzewo!"
	echo -n "Podaj pełną sciężkę do katalogu (MUSI ISTNIEĆ!), w którym ma zostać utworzone drzewo: "
	read path
	echo "Podałeś scieżkę: $path."
	echo "Przechodze do katalogu: $path."
	cd $path
	echo " "

	echo -n "Podaj nazwę serialu: "
	read serial_name
	echo "Tworzę katalog o nazwie: $serial_name."
	mkdir "$serial_name"
	echo "Przechodzę do katalogu $serial_name."
	cd "$serial_name"
	echo " "

	echo -n "Podaj ilość sezonów: "
	read number_of_seasons
	echo "Tworzę $number_of_seasons katalog/i/ów."
	for i in `seq 1 $number_of_seasons`;
	do
		mkdir s$i
	done	
	echo " "

	for i in `seq 1 $number_of_seasons`;
	do
		echo -n "Ile odcinków ma sezon: $i? :: "
		read number_of_episodes[$i]
	done


	for i in `seq 1 $number_of_seasons`;
	do
		cd s$i
		for j in `seq 1 ${number_of_episodes[$i]}`;
		do
			echo -n "Podaj nazwę odcinka $j sezonu $i = "
			read name_of_episode[$j]
			mkdir "$j - ${name_of_episode[$j]}"
		done
		echo "Katalogi utworzone!"
		cd ../
	done

	
}
Jeśli zamiast lini:

Kod: Zaznacz cały

for i in `seq 1 $number_of_seasons`;
	do
		mkdir s$i
	done
oraz

Kod: Zaznacz cały

for i in `seq 1 $number_of_seasons`;
	do
		cd s$i
...
Wstawię odpowiednio opcję -w do polecenia seq. Wyglądać będzie to następująco.

Kod: Zaznacz cały

for i in `seq -w 1 $number_of_seasons`;
	do
		mkdir s$i
	done	
oraz

Kod: Zaznacz cały

for i in `seq -w 1 $number_of_seasons`;
	do
		cd s$i
...
To w takim przypadku, jeśli zmienna number_of_seasons przybierze wartość dwucyfrową, to podczas podawania nazwy dla odcinków sezonu 08, 09 wystąpi błąd i przeskoczy od razu do katalogu 10. Widocznie traktuje te katalogi (nazwy) jako liczby oktalne.

Kod: Zaznacz cały

Podaj nazwę odcinka 1 sezonu 07 = d
Katalogi utworzone!
./xd.sh: line 39: 08: value too great for base (error token is "08")
Katalogi utworzone!
./xd.sh: line 39: 09: value too great for base (error token is "09")
Katalogi utworzone!
Podaj nazwę odcinka 1 sezonu 10 = g
Katalogi utworzone!
Więc wydaje mi się, że rozwiązaniem mojego problemu było by tylko zmiana reprezentacji tych liczb (08, 09). Bo jak już wspomniałem, problem nie występuje, gdy liczby nie mają wiodącego zera. Aczkolwiek nie wiem jak to zrobić :)

Pozdrawiam;)
Awatar użytkownika
kabanek
Zakręcona Traszka
Zakręcona Traszka
Posty: 592
Rejestracja: 23 cze 2009, 20:34
Płeć: Mężczyzna
Wersja Ubuntu: 13.10
Środowisko graficzne: Xfce
Architektura: x86_64
Kontakt:

Odp: [bash] Zmiana reprezentacji liczb

Post autor: kabanek »

hmm... no to może zrób tak, że sprawdzasz czy liczba odcinków jest mniejsza od 10, Jeśli tak, to sprawa prosta, a jak jest równa lub równa 10 to leć 2 zagnieżdżonymi pętlami tak jak napisałem wyżej i powinno to załatwić sprawę :)
Awatar użytkownika
blue_scv
Piegowaty Guziec
Piegowaty Guziec
Posty: 18
Rejestracja: 29 kwie 2008, 19:54
Płeć: Mężczyzna
Wersja Ubuntu: 10.10
Środowisko graficzne: GNOME
Architektura: x86_64
Kontakt:

Odp: [bash] Zmiana reprezentacji liczb

Post autor: blue_scv »

Zrobiłem to trochę inaczej, niż napisałeś, aczkolwiek podsunąłeś mi pewien pomysł, dzięki :)

Funkcja wygląda teraz tak:

Kod: Zaznacz cały

function building_tree
{
	echo "Funkcje budująca drzewo!"
	echo -n "Podaj pełną sciężkę do katalogu (MUSI ISTNIEĆ!), w którym ma zostać utworzone drzewo: "
	read path
	echo "Podałeś scieżkę: $path."
	echo "Przechodze do katalogu: $path."
	cd $path
	echo " "

	echo -n "Podaj nazwę serialu: "
	read serial_name
	echo "Tworzę katalog o nazwie: $serial_name."
	mkdir "$serial_name"
	echo "Przechodzę do katalogu $serial_name."
	cd "$serial_name"
	echo " "

	echo -n "Podaj ilość sezonów: "
	read number_of_seasons

	if [ $number_of_seasons -lt 10 ]; then
		echo "Tworzę $number_of_seasons katalog/i/ów."
		for i in `seq 1 $number_of_seasons`;
		do
			mkdir "s0$i"
		done		
	else
		echo "Tworzę $number_of_seasons katalogi/ów."
		for i in `seq -w 1 $number_of_seasons`;
		do
			mkdir "s$i"
		done
	fi
	echo " "

	for i in `seq 1 $number_of_seasons`;
		do
			echo -n "Ile odcinków ma sezon: $i? :: "
			read number_of_episodes[$i]
		done

	if [ $number_of_seasons -lt 10 ]; then
		for i in `seq 1 $number_of_seasons`;
		do
			cd "s0$i"
			for j in `seq 1 ${number_of_episodes[$i]}`;
			do
				echo -n "$serial_name""S0$i""E"$j" = "
				read name_of_episode[$j]
				mkdir "$j - ${name_of_episode[$j]}"
			done
			echo "Katalogi utworzone!"
			cd ../
		done
	else
		for i in `seq 1 $number_of_seasons`;
		do
			if [ $i -lt 10 ]; then
				cd "s0$i"
			else
				cd "s$i"
			fi

			for j in `seq 1 ${number_of_episodes[$i]}`;
			do
				echo -n "$serial_name""S$i""E"$j" = "
				read name_of_episode[$j]
				mkdir "$j - ${name_of_episode[$j]}"
			done
			echo "Katalogi utworzone!"
			cd ../
		done
	fi
	
}
ODPOWIEDZ

Wróć do „Programowanie”

Kto jest online

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