Linux за българи: Форуми

Програмиране => Общ форум => Темата е започната от: ROKO__ в Dec 02, 2010, 12:12



Титла: BASH въпрос
Публикувано от: ROKO__ в Dec 02, 2010, 12:12
Предварително да кажа ако темата не е в правилния раздел нека бъде преместена където трябва..

Въпроса е следния...


if [ "$1" == 1 ]; then
 echo "Избрахте различно от "1" Системата ще се изключи! $( halt -p )"
else
 echo "Избрахте "1" Системата ще се рестартира! $( reboot )"
fi

Не гледайте какво пише то е просто пример та мисълта ми е да изпълни else при зададен "1"
А ако е зададен различен от "1" да се изпълни горната команда


Титла: Re: BASH въпрос
Публикувано от: b2l в Dec 02, 2010, 12:21
Код
GeSHi (Bash):
  1. if [ "$1" = 1 ];then
  2. echo "Избрахте "1" Системата ще се рестартира! $( reboot )"
  3. else
  4. echo "Избрахте различно от "1" Системата ще се изключи! $( halt -p )"
  5. fi
  6.  


Титла: Re: BASH въпрос
Публикувано от: ROKO__ в Dec 02, 2010, 12:29
Така изпълнява само "else" независимо какво ще напиша


Титла: Re: BASH въпрос
Публикувано от: bop_bop_mara в Dec 02, 2010, 12:48
... да изпълни else при зададен "1"
А ако е зададен различен от "1" да се изпълни горната команда
Т.е. искаш ако 1вия аргумент от командния ред е 1, да се изпълни "Избрахте различно от "1" Системата ще се изключи! $( halt -p )", а ако е различен от 1 - "Избрахте "1" Системата ще се рестартира! $( reboot )"??

Понеже малко недосхващам, ето напътствия

1. В "чистия" (стария Bourne) sh test-сравнението се прави само с =, == е bashism (или го избягвай, или внимавай с кой шел пускаш скрипта)

2. Понеже подозирам, че може да ти трябва отрицателно условие: if [ ! "$1" = 1 ]

3. $( reboot ) също е bashism, sh-варианта е `command`

4. Това $( reboot ) не просто ти изпълнява командата, а я изпълнява и ти дава низ със стандартния изход от нея:
Код
GeSHi (Bash):
  1. mara@BlackPearl:~$ n=$(echo xxxx)
  2. mara@BlackPearl:~$ echo $n
  3. xxxx
  4. mara@BlackPearl:~$
T.е. това, което би трябвало прави echo "Избрахте "1" Системата ще се рестартира! $( reboot )" е reboot и когато той завърши да сложи стандартния изход от него в този низ и чак тогава да ти го echo-не на ст. изход...
Код
GeSHi (Bash):
  1. mara@BlackPearl:~$ echo "Избрахте "1" Системата ще се рестартира! $( echo xxxx )"
  2. Избрахте 1 Системата ще се рестартира! xxxx
  3. mara@BlackPearl:~$
Нямам идея това ли е търсения от теб ефект...

Може да разкажеш отначало докрай какво искаш да постигнеш, за да има по-правилно насочена помощ.

ПС. С това "избрахте", "напиша" все ми се струва, че искаш интерактивен скрипт, т.е. че имаш питане "Въведи" и искаш да обработиш отговора от него. Така ли е?


Титла: Re: BASH въпрос
Публикувано от: ROKO__ в Dec 02, 2010, 12:56
... да изпълни else при зададен "1"
А ако е зададен различен от "1" да се изпълни горната команда
Т.е. искаш ако 1вия аргумент от командния ред е 1, да се изпълни "Избрахте различно от "1" Системата ще се изключи! $( halt -p )", а ако е различен от 1 - "Избрахте "1" Системата ще се рестартира! $( reboot )"??

Понеже малко недосхващам, ето напътствия

1. В "чистия" (стария Bourne) sh test-сравнението се прави само с =, == е bashism (или го избягвай, или внимавай с кой шел пускаш скрипта)

2. Понеже подозирам, че може да ти трябва отрицателно условие: if [ ! "$1" = 1 ]

3. $( reboot ) също е bashism, sh-варианта е `command`

4. Това $( reboot ) не просто ти изпълнява командата, а я изпълнява и ти дава низ със стандартния изход от нея:
Код
GeSHi (Bash):
  1. mara@BlackPearl:~$ n=$(echo xxxx)
  2. mara@BlackPearl:~$ echo $n
  3. xxxx
  4. mara@BlackPearl:~$
T.е. това, което би трябвало прави echo "Избрахте "1" Системата ще се рестартира! $( reboot )" е reboot и когато той завърши да сложи стандартния изход от него в този низ и чак тогава да ти го echo-не на ст. изход...
Код
GeSHi (Bash):
  1. mara@BlackPearl:~$ echo "Избрахте "1" Системата ще се рестартира! $( echo xxxx )"
  2. Избрахте 1 Системата ще се рестартира! xxxx
  3. mara@BlackPearl:~$
Нямам идея това ли е търсения от теб ефект...

Може да разкажеш отначало докрай какво искаш да постигнеш, за да има по-правилно насочена помощ.

ПС. С това "избрахте", "напиша" все ми се струва, че искаш интерактивен скрипт, т.е. че имаш питане "Въведи" и искаш да обработиш отговора от него. Така ли е?

Да правилно ме разбираш трябва да се направи потребителски избор и той да изпълни според избора. И както съм казал ползвам bourne shell (bash) #!/bin/bash


Титла: Re: BASH въпрос
Публикувано от: bop_bop_mara в Dec 02, 2010, 13:01
Ами тогава защо по дяволите сравняваш $1 с 1??? $1 ти е 1вия аргумент от командния ред, т.е. като пуснеш скрипта с /path/to/my/script aaa bb c, $1 ти е aaa. Ако го пуснеш без аргументи $1 ти е "". Съвсем нормално е ВИНАГИ да ти се изпълнява else-а...

Код
GeSHi (Bash):
  1. echo "Enter value"
  2. read answer
  3. if [ "$answer" = 1 ]
  4. then
  5. echo "rebooting"
  6. /sbin/reboot
  7. else
  8. echo "halting"
  9. /sbin/halt
  10. fi
  11.  


Титла: Re: BASH въпрос
Публикувано от: ROKO__ в Dec 02, 2010, 13:03
www.extremebg.co.cc/files/test2.bash


Титла: Re: BASH въпрос
Публикувано от: bop_bop_mara в Dec 02, 2010, 13:07
www.extremebg.co.cc/files/test2.bash
Какво за това?

Код
GeSHi (Bash):
  1. mara@BlackPearl:~$ ./test2.bash
  2. ./test2.bash: line 3: 1=1: command not found
  3.  
  4. Избрахте различно от 1 Системата ще се изключи!
  5. mara@BlackPearl:~$


Титла: Re: BASH въпрос
Публикувано от: ROKO__ в Dec 02, 2010, 13:09
хм ^^ нещо да не е от версиите на bash


Титла: Re: BASH въпрос
Публикувано от: b2l в Dec 02, 2010, 13:10
хм ^^ нещо да не е от версиите на bash

Сигурно.... Може да е от задклавиатурното нещо...

ROKO__, к'во е това на третия ред:
Код:
1="1"
???


Титла: Re: BASH въпрос
Публикувано от: ROKO__ в Dec 02, 2010, 13:11
Стана номера, но странно защо по пример от bash documentation се изпълнява само else (малко не помня как се пише и се консултирам със документацията)


Титла: Re: BASH въпрос
Публикувано от: bop_bop_mara в Dec 02, 2010, 13:13
Стана номера, но странно защо по пример от bash documentation се изпълнява само else (малко не помня как се пише и се консултирам със документацията)
Дай да го видим тоз пример тогава. И дай да видим как стана номера, че да разберем какво искаше :)

И, между другото, ако искаш да сложиш стойността на 1вия команден аргумент да е 1, това се прави със set...


Титла: Re: BASH въпрос
Публикувано от: b2l в Dec 02, 2010, 13:14
http://tldp.org/HOWTO/Bash-Prog-Intro-HOWTO-6.html ($2)
Код
GeSHi (Bash):
  1. #!/bin/bash
  2.            if [ "foo" = "foo" ]; then
  3.               echo expression evaluated as true
  4.            else
  5.               echo expression evaluated as false
  6.            fi


Титла: Re: BASH въпрос
Публикувано от: ROKO__ в Dec 02, 2010, 13:14
хм ^^ нещо да не е от версиите на bash

Сигурно.... Може да е от задклавиатурното нещо...

ROKO__, к'во е това на третия ред:
Код:
1="1"
???

Уж променлива :) за да може после да пиша просто $1


Титла: Re: BASH въпрос
Публикувано от: ROKO__ в Dec 02, 2010, 13:16
Стана номера, но странно защо по пример от bash documentation се изпълнява само else (малко не помня как се пише и се консултирам със документацията)
Дай да го видим тоз пример тогава. И дай да видим как стана номера, че да разберем какво искаше :)

И, между другото, ако искаш да сложиш стойността на 1вия команден аргумент да е 1, това се прави със set...

Ам правя си подготовка за една предстояща работа иначе скрипта който ще видите няма да ви хареса особено :D но важното е че заработи


(1:302)$ cat test.bash

===================================

#!/bin/bash

func() {
 printf "\e[1;37mДрасти е мурук\n"
 printf "\e[1;37mИ добре дошъл в моя ад\n"
 printf "\e[1;37m За пълна информация изпълнете скрипта като root\n"
}

info() {
 printf "\e[0;36mСистемна информация: $( lsb_release -a )\n"
 printf "\e[1;34mПроцесор информация: $( cat /proc/cpuinfo )\n"
}
func
info

echo
echo
echo

printf "\e[0;31mКакъв процесор използвате ? AMD или intel\n"

#!/bin/bash
amd="amd"
intel="intel"

echo "Напишете марката с малки букви"
read answer
if [ "$answer" == intel ]
then
echo "Избрахте интел... Изглежда сте дебил който си няма понятие от хардуер. Системата ще се рестартира! $( reboot )"
else
echo "Избрахте АМД. Моите поздравления :)"
fi

===========================


(1:303)$ . test.bash
Драсти е мурук
И добре дошъл в моя ад
 За пълна информация изпълнете скрипта като root
No LSB modules are available.
Системна информация: Distributor ID:   Debian
Description:   Debian GNU/Linux testing (squeeze)
Release:   testing
Codename:   squeeze
Процесор информация: processor   : 0
vendor_id   : AuthenticAMD
cpu family   : 15
model      : 107
model name   : AMD Athlon(tm) 64 X2 Dual Core Processor 4000+
stepping   : 1
cpu MHz      : 2100.000
cache size   : 512 KB
physical id   : 0
siblings   : 2
core id      : 0
cpu cores   : 2
apicid      : 0
initial apicid   : 0
fpu      : yes
fpu_exception   : yes
cpuid level   : 1
wp      : yes
flags      : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush mmx fxsr sse sse2 ht syscall nx mmxext fxsr_opt rdtscp lm 3dnowext 3dnow rep_good extd_apicid pni cx16 lahf_lm cmp_legacy svm extapic cr8_legacy 3dnowprefetch
bogomips   : 4188.82
TLB size   : 1024 4K pages
clflush size   : 64
cache_alignment   : 64
address sizes   : 40 bits physical, 48 bits virtual
power management: ts fid vid ttp tm stc 100mhzsteps

processor   : 1
vendor_id   : AuthenticAMD
cpu family   : 15
model      : 107
model name   : AMD Athlon(tm) 64 X2 Dual Core Processor 4000+
stepping   : 1
cpu MHz      : 2100.000
cache size   : 512 KB
physical id   : 0
siblings   : 2
core id      : 1
cpu cores   : 2
apicid      : 1
initial apicid   : 1
fpu      : yes
fpu_exception   : yes
cpuid level   : 1
wp      : yes
flags      : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush mmx fxsr sse sse2 ht syscall nx mmxext fxsr_opt rdtscp lm 3dnowext 3dnow rep_good extd_apicid pni cx16 lahf_lm cmp_legacy svm extapic cr8_legacy 3dnowprefetch
bogomips   : 4188.82
TLB size   : 1024 4K pages
clflush size   : 64
cache_alignment   : 64
address sizes   : 40 bits physical, 48 bits virtual
power management: ts fid vid ttp tm stc 100mhzsteps



Какъв процесор използвате ? AMD или intel
Напишете марката с малки букви
intel
bash: reboot: командата не е открита
Избрахте интел... Изглежда сте дебил който си няма понятие от хардуер. Системата ще се рестартира!
1418/3021MB   0.63 0.43 0.23 2/350 1893
[14754:2441 0:304] 01:15:53 чт дек 02 [roko__@Debian64: +1] ~
(1:304)$


(1:304)$ . test.bash
Драсти е мурук
И добре дошъл в моя ад
 За пълна информация изпълнете скрипта като root
No LSB modules are available.
Системна информация: Distributor ID:   Debian
Description:   Debian GNU/Linux testing (squeeze)
Release:   testing
Codename:   squeeze
Процесор информация: processor   : 0
vendor_id   : AuthenticAMD
cpu family   : 15
model      : 107
model name   : AMD Athlon(tm) 64 X2 Dual Core Processor 4000+
stepping   : 1
cpu MHz      : 1000.000
cache size   : 512 KB
physical id   : 0
siblings   : 2
core id      : 0
cpu cores   : 2
apicid      : 0
initial apicid   : 0
fpu      : yes
fpu_exception   : yes
cpuid level   : 1
wp      : yes
flags      : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush mmx fxsr sse sse2 ht syscall nx mmxext fxsr_opt rdtscp lm 3dnowext 3dnow rep_good extd_apicid pni cx16 lahf_lm cmp_legacy svm extapic cr8_legacy 3dnowprefetch
bogomips   : 1994.67
TLB size   : 1024 4K pages
clflush size   : 64
cache_alignment   : 64
address sizes   : 40 bits physical, 48 bits virtual
power management: ts fid vid ttp tm stc 100mhzsteps

processor   : 1
vendor_id   : AuthenticAMD
cpu family   : 15
model      : 107
model name   : AMD Athlon(tm) 64 X2 Dual Core Processor 4000+
stepping   : 1
cpu MHz      : 1000.000
cache size   : 512 KB
physical id   : 0
siblings   : 2
core id      : 1
cpu cores   : 2
apicid      : 1
initial apicid   : 1
fpu      : yes
fpu_exception   : yes
cpuid level   : 1
wp      : yes
flags      : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush mmx fxsr sse sse2 ht syscall nx mmxext fxsr_opt rdtscp lm 3dnowext 3dnow rep_good extd_apicid pni cx16 lahf_lm cmp_legacy svm extapic cr8_legacy 3dnowprefetch
bogomips   : 1994.67
TLB size   : 1024 4K pages
clflush size   : 64
cache_alignment   : 64
address sizes   : 40 bits physical, 48 bits virtual
power management: ts fid vid ttp tm stc 100mhzsteps



Какъв процесор използвате ? AMD или intel
Напишете марката с малки букви
amd
Избрахте АМД. Моите поздравления :)
1381/3021MB   0.59 0.43 0.24 4/350 1911
[14754:2441 0:305] 01:16:21 чт дек 02 [roko__@Debian64: +1] ~
(1:305)$


ПС: Не гледайте че съм с дебиан това е просто временно :D смятах че ще ми е удобен за работа но уви


Титла: Re: BASH въпрос
Публикувано от: b2l в Dec 02, 2010, 13:17
Абе Intel се пише с главна букна бе :D :D :D :D.


Титла: Re: BASH въпрос
Публикувано от: bop_bop_mara в Dec 02, 2010, 13:18
хм ^^ нещо да не е от версиите на bash

Сигурно.... Може да е от задклавиатурното нещо...

ROKO__, к'во е това на третия ред:
Код:
1="1"
???

Уж променлива :) за да може после да пиша просто $1
$1 е специална променлива и тя означава 1вия аргумент от командния ред (не знам за кой път го казвам в тая тема).... Или позлваш друго име за променливата, или си set-ваш кои са ти аргументите от командния ред...


Титла: Re: BASH въпрос
Публикувано от: ROKO__ в Dec 02, 2010, 13:20
Горе долу това е което ми трябваше за скриптинга...

Сега остава Питоня :D Ама по късно ще пиша тема за него


Титла: Re: BASH въпрос
Публикувано от: bop_bop_mara в Dec 02, 2010, 13:26
Мн интересн скрипт... Изключваме bashism-ите, но какво прави по средата на кода #!/bin/bash??? И за какво ти е
Код
GeSHi (Bash):
  1. amd="amd"
  2. intel="intel"
след като после имаш
Код
GeSHi (Bash):
  1. if [ "$answer" == intel ]
което е еквивалентно на
Код
GeSHi (Bash):
  1. if [ "$answer" == "intel" ]
НЕ на
Код
GeSHi (Bash):
  1. if [ "$answer" == $intel ]


Титла: Re: BASH въпрос
Публикувано от: ROKO__ в Dec 02, 2010, 13:26
Марче благодаря за помощта


Титла: Re: BASH въпрос
Публикувано от: ROKO__ в Dec 02, 2010, 13:27
Мн интересн скрипт... Изключваме bashism-ите, но какво прави по средата на кода #!/bin/bash??? И за какво ти е
Код
GeSHi (Bash):
  1. amd="amd"
  2. intel="intel"
след като после имаш
Код
GeSHi (Bash):
  1. if [ "$answer" == intel ]
което е еквивалентно на
Код
GeSHi (Bash):
  1. if [ "$answer" == "intel" ]
НЕ на
Код
GeSHi (Bash):
  1. if [ "$answer" == $intel ]

Позабравил съм нещата за това че не обръщай внимание на грешките след като опресних знанията няма да ги допускам отново

Доста полезна ми беше тази помощ поне ще мога да си довърша инсталатора за моя училищен проект. (След време може да го пренапиша на Python ако сметна за необходимо)


Титла: Re: BASH въпрос
Публикувано от: bop_bop_mara в Dec 02, 2010, 13:36
Марче благодаря за помощта
За нищо...

Цитат
Доста полезна ми беше тази помощ поне ще мога да си довърша инсталатора за моя училищен проект. (След време може да го пренапиша на Python ако сметна за необходимо)
Ако това е код за инсталатор... доста интересен ще бъде... А за Python - какъв смисъл има да го пренаписваш, не мисля, че имаш нужда от нещо, което Bash не ти предоставя, а Python - да... Ти си знаеш де, на нас ще ни е интересно да видим какво пишеш на Python :)


Титла: Re: BASH въпрос
Публикувано от: ROKO__ в Dec 02, 2010, 13:39
http://extremebg.co.cc/gentoo/gentoo-installer
http://extremebg.co.cc/gentoo/Chroot

Ще ползвам за база тези скриптове от предишен мой успешен но не много удачен опит и ще го внедря в "ArchLinux за училище" :) Ако имате някакви критики относно тези скриптове ги кажете


Титла: Re: BASH въпрос
Публикувано от: romeo_ninov в Dec 02, 2010, 13:40
Хора, четете документацията, за сравняване на числа се ползва -eq, а не =

Код:
if [ $1 -eq 1 ]; then......


Титла: Re: BASH въпрос
Публикувано от: ROKO__ в Dec 02, 2010, 13:40
Марче благодаря за помощта
За нищо...

Цитат
Доста полезна ми беше тази помощ поне ще мога да си довърша инсталатора за моя училищен проект. (След време може да го пренапиша на Python ако сметна за необходимо)
Ако това е код за инсталатор... доста интересен ще бъде... А за Python - какъв смисъл има да го пренаписваш, не мисля, че имаш нужда от нещо, което Bash не ти предоставя, а Python - да... Ти си знаеш де, на нас ще ни е интересно да видим какво пишеш на Python :)

Е да тук си права че ще е същото но на работа някой път си казват искам този не онзи и така :) Но в конкретния случай това ми е за инсалатора както и предварителна подготовка за работа


Титла: Re: BASH въпрос
Публикувано от: shoshon в Dec 02, 2010, 13:40
Мале мале....


за сравнения на числа се използват -eq -lt -gt. За сравнения на низове се използва = .

Всякви останали разсъждения са излишни
I="ivan"
[ivan@ivan-laptop ~]$ if [ "$I" = "ivan" ]; then echo "balabla"; else echo "not alabala"; fi
balabla


RTFM

А гледам че докато съм си изливал "съчувствието" са отговорили преди мене :)


Ооо... сега гледам че ROKO_ е "внедрител". Тежко им на дечицата...


Титла: Re: BASH въпрос
Публикувано от: romeo_ninov в Dec 02, 2010, 13:43
Мале мале....


за сравнения на числа се използват -eq -lt -gt. За сравнения на низове се използва = .

Всякви останали разсъждения са излишни
I="ivan"
[ivan@ivan-laptop ~]$ if [ "$I" = "ivan" ]; then echo "balabla"; else echo "not alabala"; fi
balabla


RTFM

А гледам че докато съм си изливал "съчувствието" са отговорили преди мене :)


Ооо... сега гледам че ROKO_ е "внедрител". Тежко им на дечицата...
Аз докато напиша моето станаха две страници :)


Титла: Re: BASH въпрос
Публикувано от: ROKO__ в Dec 02, 2010, 13:46
Мале мале....


за сравнения на числа се използват -eq -lt -gt. За сравнения на низове се използва = .

Всякви останали разсъждения са излишни
I="ivan"
[ivan@ivan-laptop ~]$ if [ "$I" = "ivan" ]; then echo "balabla"; else echo "not alabala"; fi
balabla


RTFM

А гледам че докато съм си изливал "съчувствието" са отговорили преди мене :)


Ооо... сега гледам че ROKO_ е "внедрител". Тежко им на дечицата...

Спокойно бре няма да напиша точно това.. Това е просто пример по който по лесно да си припомня материала. Иначе ми трябва като правя инсталатора да може да сравнява зададените параметри например файлова система точки на монтиране \ако не е зададена точка за / да изпише съобщение и такива/ абе знаеш за какво говоря да не разтъкавам локуми


Титла: Re: BASH въпрос
Публикувано от: bop_bop_mara в Dec 02, 2010, 13:49
за сравнения на числа се използват -eq -lt -gt. За сравнения на низове се използва = .
Сега, 1во виж последните скриптове на Роко, ползва точно -eq, тъй че спокойно. Второ, в случая за равенство на практика е все едно, така или иначе всички променливи в bash са низове (-lt, -gt само казват да сравнява тия низове все едно са числа). Стилово все пак може би -eq е по-добре.

Роко, ето какво забелязвам по скриптовете (без да чета много надълбоко какви действия извършват):
1. Като установиш, че юзърът не е root и му кажеш да го пусне като root, продължаваш с изпълнението на скрипта...
2. Никъде не се проверява всякак изпълнена команда как е завършила - успешно или неуспешно - и според това как трябва да се продължи. В (ba)sh командите се изпълняват една след друга, ако някоя завърши неуспешно, не спира изпълнението на скрипта, а се продължава със следващата. Доколкото съм виждала и чувала, сериозните скриптове са пълни с if и case.


Титла: Re: BASH въпрос
Публикувано от: ROKO__ в Dec 02, 2010, 13:52
за сравнения на числа се използват -eq -lt -gt. За сравнения на низове се използва = .
Сега, 1во виж последните скриптове на Роко, ползва точно -eq, тъй че спокойно. Второ, в случая за равенство на практика е все едно, така или иначе всички променливи в bash са низове (-lt, -gt само казват да сравнява тия низове все едно са числа). Стилово все пак може би -eq е по-добре.

Роко, ето какво забелязвам по скриптовете (без да чета много надълбоко какви действия извършват):
1. Като установиш, че юзърът не е root и му кажеш да го пусне като root, продължаваш с изпълнението на скрипта...
2. Никъде не се проверява всякак изпълнена команда как е завършила - успешно или неуспешно - и според това как трябва да се продължи. В (ba)sh командите се изпълняват една след друга, ако някоя завърши неуспешно, не спира изпълнението на скрипта, а се продължава със следващата. Доколкото съм виждала и чувала, сериозните скриптове са пълни с if и case.

Да това и сам го казах че този скрипт ми беше още в самото начало когато започнах с bash и не всичко съм изпипал и сега това ще тествам докато стане както трябва


Титла: Re: BASH въпрос
Публикувано от: ROKO__ в Dec 02, 2010, 14:05
Още едно въпрос:

Значи определям процесорната архитектура в инсталатора.. Та мисълта ми е има ли начин да опиша в скрипта преди да започне инсталация да провери "uname -m" и ако е различно от зададената архитектура да прекъсне инсталацията. В конкретния случай правя за 64 битова инсталация


Титла: Re: BASH въпрос
Публикувано от: bop_bop_mara в Dec 02, 2010, 14:11
Ако uname -m за всички 64-битови връща x86_64:
Код
GeSHi (Bash):
  1. [ `uname -m` != 'x86_64' ] && exit 1
(или разписано с if, ама ме мързи да пиша).


Титла: Re: BASH въпрос
Публикувано от: ROKO__ в Dec 02, 2010, 14:28
Ако uname -m за всички 64-битови връща x86_64:
Код
GeSHi (Bash):
  1. [ `uname -m` != 'x86_64' ] && exit 1
(или разписано с if, ама ме мързи да пиша).

хм нещо се дъни :)


Този скрипт е предназначен за инсталиране на Gentoo Linux от вече съществуващ Линукс (Например Mandriva Sabayon Calculate Toorox Ubuntu). Необходимо е да имате някоя от тези или друга дистрибуция както и интернет връзка.
Единствено трябва да сте търпеливи (Поне тези които сте с по стар хардуер)
Автор ROKO__ (Росен Александров - sandikata@yandex.ru)
Важно! Тази инсталация е за 64 бита. Трябва да имате съответния хардуер.
bash: [: !==: очаква се бинарен оператор
bash: [: !==: очаква се бинарен оператор


Титла: Re: BASH въпрос
Публикувано от: b2l в Dec 02, 2010, 14:37
@shoshon, @romeo_ninov: първо да кажа, че с този пост целя само да се заяждам с вас двамцата. Еми господа "RTFM" - ако това в tldp.org ($2) не е RTFM кое е тогава??? А така като гледам примера свавняват стринга "foo" със стринга "foo" с едно просто равно не с -eq...


Титла: Re: BASH въпрос
Публикувано от: bop_bop_mara в Dec 02, 2010, 14:47
bash: [: !==: очаква се бинарен оператор
Аз не виждам !== в
Код
GeSHi (Bash):
  1. [ `uname -m` != 'x86_64' ]


Титла: Re: BASH въпрос
Публикувано от: ROKO__ в Dec 02, 2010, 15:49
bash: [: !==: очаква се бинарен оператор
Аз не виждам !== в
Код
GeSHi (Bash):
  1. [ `uname -m` != 'x86_64' ]

Смотри..

www.extremebg.co.cc/images/shet.png


Титла: Re: BASH въпрос
Публикувано от: bop_bop_mara в Dec 02, 2010, 15:59
bash: [: !==: очаква се бинарен оператор
Аз не виждам !== в
Код
GeSHi (Bash):
  1. [ `uname -m` != 'x86_64' ]

Смотри..

www.extremebg.co.cc/images/shet.png

Роко... аз какво съм ти написала, във файла ти какво пише???
Прегледай си пак тоя 23 ред на кода и много внимателно прочети какво си написал... Ако не можеш да осъзнаеш, пейстни го тук, за да ти обясним какво правиш...

ПС. Разбираш ли какво прави
Код
GeSHi (Bash):
  1. [ `uname -m` != 'x86_64' ] && exit 1


Титла: Re: BASH въпрос
Публикувано от: tyuio в Dec 02, 2010, 16:06
//офф
Роко, то е ясно че никакви програмни езици не щпрехаш, ама барем български не говориш ли?


Титла: Re: BASH въпрос
Публикувано от: ROKO__ в Dec 02, 2010, 16:10
Добре сега ще покажа идеята...

if [[ $(uname -m) == "x86_64" ]]; then printf "\e[0;32mПроцесорът ви поддържа x64"; else printf "\e[0;31mПроцесорът ви не поддържа x64"; fi

Това е въпросния ред.. Работи но искам да го направя когато не съответства архитектурата да прекъсва инсталацията ^^ добавях exit 1 след скобите но се получават грешки и нещо не мога да го разбера как трябва да стане


Титла: Re: BASH въпрос
Публикувано от: tyuio в Dec 02, 2010, 16:18
а нямали да ни кажеш как точно го слагаш тоя изход, или какви грешки дава?


Титла: Re: BASH въпрос
Публикувано от: ROKO__ в Dec 02, 2010, 16:19
Не гледаш ли на снимката какво се получава ?


Титла: Re: BASH въпрос
Публикувано от: bop_bop_mara в Dec 02, 2010, 16:23
Добре сега ще покажа идеята...

if [[ $(uname -m) == "x86_64" ]]; then printf "\e[0;32mПроцесорът ви поддържа x64"; else printf "\e[0;31mПроцесорът ви не поддържа x64"; fi

Това е въпросния ред.. Работи но искам да го направя когато не съответства архитектурата да прекъсва инсталацията ^^ добавях exit 1 след скобите но се получават грешки и нещо не мога да го разбера как трябва да стане

Вариант 1
Код
GeSHi (Bash):
  1. if [[ $(uname -m) == "x86_64" ]] #щом искаш да ползваш [[ ]] варианта
  2. then
  3. printf "Процесорът ви поддържа x64" #или каквото искаш там
  4. else
  5. printf "Процесорът ви не поддържа x64"
  6. exit 1 # излизаме от скрипта с код на завършване, означаващ неуспех
  7. fi
  8.  
  9.  


Вариант 2
Код
GeSHi (Bash):
  1. if [[ $(uname -m) != "x86_64" ]] #щом искаш да ползваш [[ ]] варианта
  2. then
  3. printf "Процесорът ви не поддържа x64" #или каквото искаш там
  4. exit 1 # излизаме от скрипта с код на завършване, означаващ неуспех
  5. else
  6. printf "Процесорът ви поддържа x64"
  7. fi
  8.  
  9.  

Вариант 3
Код
GeSHi (Bash):
  1. [[ $(uname -m) != "x86_64" ]] && printf "Процесорът ви не поддържа x64" && exit 1
  2. printf "Процесорът ви поддържа x64"
  3.  


Не гледаш ли на снимката какво се получава ?
Това на снимката е от
Код
GeSHi (Bash):
  1. if [[ $(uname -m) == "x86_64" ] && exit 1 ]
което си е синтактично неправилно.


Титла: Re: BASH въпрос
Публикувано от: tyuio в Dec 02, 2010, 16:25
а що изход е в тия скоби? изкарай го след показването на текста!
Опааа, марчето ме изпреварила :)


Титла: Re: BASH въпрос
Публикувано от: ROKO__ в Dec 02, 2010, 16:29
а що изход е в тия скоби? изкарай го след показването на текста!
Опааа, марчето ме изпреварила :)

Ако е грешно значи и документацията на bash  е грешна от там гледам за примери


Титла: Re: BASH въпрос
Публикувано от: ROKO__ в Dec 02, 2010, 16:31
www.extremebg.co.cc/images/work.png

Така се получи... Ето и целия код (има малки въпросителни още но мисля че и за тях има решение)


#!/bin/bash
# Инсталатор за Gentoo Linux
# Автор: Росен Александров - sandikata@yandex.ru
# Лиценз: Свободен (По желание на потребителя може да почерпи с кашонче бира :)

# Проверка за администраторски права
if [ `id -u` != "0" ]; then
echo "Добре дошли в инсталатора на Gentoo Linux"
echo "За да изпълните този скрипт ви трябва root."
echo "Моля стартирайте скрипта като root."
fi

echo
echo
echo
printf "\e[1;37mТози скрипт е предназначен за инсталиране на Gentoo Linux от вече съществуващ Линукс (Например Mandriva Sabayon Calculate Toorox Ubuntu). Необходимо е да имате някоя от тези или друга дистрибуция както и интернет връзка.\n"
printf "\e[1;37mЕдинствено трябва да сте търпеливи (Поне тези които сте с по стар хардуер)\n"
printf "\e[1;37mАвтор ROKO__ (Росен Александров - sandikata@yandex.ru)\n"
printf "\e[1;37mВажно! Тази инсталация е за 64 бита. Трябва да имате съответния хардуер.\n"

echo
echo
#if [[ $(uname -m) == "x86_64" ]]; then printf "\e[0;32mПроцесорът ви поддържа x64"; else printf "\e[0;31mПроцесорът ви не поддържа x64"; fi

[[ $(uname -m) != "x86_64" ]] && printf "\e[0;31mПроцесорът ви не поддържа x64\n" && exit 1
printf "\e[0;32mПроцесорът ви поддържа x64\n"

echo "За да продължите с инсталацита натиснете произволен бутон"
read key

echo "Изберете дял за root (/)"
echo "Например : /dev/sda1"
read BOOTPART
echo "Изберете дял за SWAP (Допълнителна виртуална памет)"
read SWAP

mkswap $SWAP
swapon $SWAP

echo
echo "Изберете файлова система .. Например reiserfs, ext4"
read fs
if [ "$fs" == reiserfs ]
then
mkfs.reiserfs $BOOTPART
else
mkfs.ext4 $BOOTPART
fi

mkdir /mnt/gentoo
mount $BOOTPART /mnt/gentoo

cd /mnt/gentoo

echo "Изтегляне на Stage3 файл..."
echo "Изберете сървър...(1-4)"
echo "1-  САЩ"
echo "2 - България"
echo "3 - Германия"
echo "4 - Холандия"
echo
echo "Pick number:"
read LOC

if [ $LOC -eq 1 ]
then
echo "Изтегляне на Stage 3..."
wget http://distfiles.gentoo.org/releases/amd64/current-stage3/http://distfiles.gentoo.org/releases/amd64/current-stage3/stage3-amd64-20101021.tar.bz2

elif [ $LOC -eq 2 ]
then
echo "Изтегляне на Stage 3..."
wget ftp://ftp.gentoo.bg/releases/amd64/current-stage3/http://distfiles.gentoo.org/releases/amd64/current-stage3/stage3-amd64-20101021.tar.bz2

elif [ $LOC -eq 3 ]
then
echo "Изтегляне на Stage 3..."
wget http://mirror.netcologne.de/gentoo/releases/amd64/current-stage3/http://distfiles.gentoo.org/releases/amd64/current-stage3/stage3-amd64-20101021.tar.bz2

elif [ $LOC -eq 4 ]
then
echo "Изтегляне на Stage 3..."
wget http://gentoo.tiscali.nl/releases/amd64/current-stage3/http://distfiles.gentoo.org/releases/amd64/current-stage3/stage3-amd64-20101021.tar.bz2
else
echo "Изберете бутон от (1-4)!"
echo "Downloading Stage 3 from default..."
wget http://darkstar.ist.utl.pt/gentoo/releases/amd64/current-stage3/stage3-amd64-20100408.tar.bz2
fi

echo "Изтегляне на Portage..."
echo "Изберете сървър...(1-4)"
echo "1-  САЩ"
echo "2 - България"
echo "3 - Германия"
echo "4 - Холандия"
echo
echo "Изберете бутон (1-4)!"
read LOC

if [ $LOC -eq 1 ]
then
echo "Изтегляне на Portage..."
wget http://distfiles.gentoo.org/snapshots/portage-latest.tar.bz2

elif [ $LOC -eq 2 ]
then
echo "Изтегляне на Portage..."
wget ftp://ftp.gentoo.bg/snapshots/portage-latest.tar.bz2

elif [ $LOC -eq 3 ]
then
echo "Изтегляне на Portage..."
wget http://mirror.netcologne.de/gentoo/releases/amd64/current-stage3/stage3-amd64-20100408.tar.bz2

elif [ $LOC -eq 4 ]
then
echo "Изтегляне на Portage..."
wget http://gentoo.tiscali.nl/snapshots/portage-latest.tar.bz2
else
echo "You have to pick a number between (1-4)!"
echo "Downloading Portage from default..."
wget http://darkstar.ist.utl.pt/gentoo/snapshots/portage-latest.tar.bz2
fi

#Unpacks Stage3 tar file
clear
echo
echo "Stage3 е изтеглен"
echo "Portage е изтеглен"
echo "Разархивирам Stage3 и Portage..."

tar xjpf stage3*
tar xjf portage-latest.tar.bz2 -C /mnt/gentoo/usr

echo "Готово!"
echo

#Copies DNS information
echo "Копирам DNS"
cp -L /etc/resolv.conf /mnt/gentoo/etc/resolv.conf

#Mounts Proc filesystem
echo "Монтирам proc и dev файлови системи"
mount -t proc proc /mnt/gentoo/proc
mount -o bind /dev /mnt/gentoo/dev
echo "За да продължите инсталацията ви трябва Chroot скрипт. Можете да го изтеглите от тук -> http://extremebg.co.cc/gentoo/Chroot"
#Chroots into new Enviroment"
echo "Вход в новата система"

chroot /mnt/gentoo /bin/bash
env-update
source /etc/profile


Титла: Re: BASH въпрос
Публикувано от: romeo_ninov в Dec 02, 2010, 16:42
Код:
if [ `id -u` != "0" ]; then
Код:
if [ `id -u` -ne 0 ]; then


Титла: Re: BASH въпрос
Публикувано от: neter в Dec 02, 2010, 17:04
# Проверка за администраторски права
if [ `id -u` != "0" ]; then
echo "Добре дошли в инсталатора на Gentoo Linux"
echo "За да изпълните този скрипт ви трябва root."
echo "Моля стартирайте скрипта като root."
fi
Сложи и еxit, за да прекъснеш скрипта при изпълнение на условието. В противен случай на потребителя ще се изпише, че трябва да е root, но скриптът ще продължи изпълнението си.

echo "Изберете дял за SWAP (Допълнителна виртуална памет)"
read SWAP
Всички подобни комплекти от echo и read по-добре да бъдат комплект от printf и read. Пример
Код
GeSHi (Bash):
  1. printf "Изберете дял за SWAP (Допълнителна виртуална памет): "
  2. read SWAP
  3.  

echo "Изберете дял за root (/)"
echo "Например : /dev/sda1"
read BOOTPART
echo "Изберете дял за SWAP (Допълнителна виртуална памет)"
read SWAP

mkswap $SWAP
swapon $SWAP
Ами ако потребителят въведе невалидно или несъществуващо устройство? Добави проверка за валидност на данните и коректност на изпълнението към всяко действие в скрипта. В зависимост от получените резултати (или твоите предпочитания) за действието, скриптът може да пита отново за данни или направо да спре изпълнението си.

4. Изнеси всякакви текстове и линкове като променливи в началото на скрипта, или по-добре в отделни файлове, от които да ги четеш. Гледай в кода да имаш възможно най-малко неща, които може да претърпят промяна в даден момент.

5. Оправи си печатните и граматическите грешки.

Не съм гледал за синтактични грешки в кода ти, но ако има такива, ще си проличи. Опитай се да проиграеш всички варианти, които ти хрумнат, за да провериш максимално скрипта си за бъгове.

P.S.: Едно допълнение към ядовете ти от предните страници на темата. Никъде и никога не слагай имена на твои променливи, започващи с цифра. Имената на променливите трябва да започват с буква. Иначе ще има много да си скубеш косата ;)


Титла: Re: BASH въпрос
Публикувано от: ROKO__ в Dec 02, 2010, 18:30
Дай пример за това съм публикувал тук целия скрипт за допълнителни идей


Титла: Re: BASH въпрос
Публикувано от: ROKO__ в Dec 02, 2010, 18:58
[ `id -u` != "0" ] && printf "\e[0;31mНямате администраторски права. Моля стартирайте скрипта като администратор (root)\n" && sleep 5s; exit 1
printf "\e[0;32mНапред (Enter)\n"
read key

Така дали ще се хареса на господата и госпожиците (и госпожите :D)


Титла: Re: BASH въпрос
Публикувано от: romeo_ninov в Dec 02, 2010, 19:16
[ `id -u` != "0" ] && printf "\e[0;31mНямате администраторски права. Моля стартирайте скрипта като администратор (root)\n" && sleep 5s; exit 1
printf "\e[0;32mНапред (Enter)\n"
read key

Така дали ще се хареса на господата и госпожиците (и госпожите :D)
пак сравняваш числа, пробвай с -ne вместо !=


Титла: Re: BASH въпрос
Публикувано от: bop_bop_mara в Dec 02, 2010, 19:32
Роко, имаш
Код
GeSHi (Bash):
  1. [ `id -u` != "0" ] && printf "...." && sleep 5s; exit 1
  2. printf "...."
  3. read key
Мислиш ли, че това ще стигне до 2рото printf и до read??


Титла: Re: BASH въпрос
Публикувано от: ROKO__ в Dec 02, 2010, 20:46
Аз го оправих вече това ^^ Но сега малко почивка


Титла: Re: BASH въпрос
Публикувано от: neter в Dec 03, 2010, 14:00
Дай пример за това съм публикувал тук целия скрипт за допълнителни идей
Нямам много време да се занимавам с това сега, но ето някои насочващи примери:

# Проверка за администраторски права
if [ `id -u` != "0" ]; then
echo "Добре дошли в инсталатора на Gentoo Linux"
echo "За да изпълните този скрипт ви трябва root."
echo "Моля стартирайте скрипта като root."
fi
Това става така
# Проверка за администраторски права
if [ `id -u` -ne 0 ]; then
echo "Добре дошли в инсталатора на Gentoo Linux"
echo "За да изпълните този скрипт ви трябва root."
echo "Моля стартирайте скрипта като root."
exit 1
fi

За изнесените стрингове и url-та във външни файлове, става с командата source. Тя изчита подадения файл и вмъква описаните променливи и техните стойности в твоя скрипт. Данните във външните файлове се описват така:
Цитат
var1="value1"
var2="value2"
var3="value3"
След това в началото на скрипта (за да са достъпни за целия скрипт, иначе не е задължително да седи в началото) слагаш подобен ред:
Код
GeSHi (Bash):
  1. source ВЪНШНИЯТ_ФАЙЛ
В скрипта викаш променливите с техните имена ($var1, $var2, $var3). Препоръчвам ти да си направиш два отделни файла за стринговете и за url-тата (информацията да се раздели смислово).

Проверките за валидност и коректност на изпълнението са строго специфични за всяко проверявано действие. Прояви въображение, когато мислиш проверките. За пример, може това
echo "Изберете дял за root (/)"
echo "Например : /dev/sda1"
read BOOTPART
да стане така
Код
GeSHi (Bash):
  1. while ! fdisk -s $BOOTPART &>/dev/null; do
  2.    printf "Въведете съществуващ дял, който да се използва за root (/) [например: /dev/sda1]: "
  3.    read BOOTPART
  4. done
Проверяваме с fdisk дали зададеният дял съществува (флагът "-s" връща размера на дяла, ако съществува), и ако потребителят е въвел невалиден или несъществуващ дял, то цикълът ще се завърти отново и отново ще се даде предложение на потребителя да въведе (това не е списък за избор, така че думата "изберете" не пасва) нужния дял. Може да ползваш същата проверка и за $SWAP.
Давай нататък ;)


Титла: Re: BASH въпрос
Публикувано от: ROKO__ в Dec 03, 2010, 14:19
Дай пример за това съм публикувал тук целия скрипт за допълнителни идей
Нямам много време да се занимавам с това сега, но ето някои насочващи примери:

# Проверка за администраторски права
if [ `id -u` != "0" ]; then
echo "Добре дошли в инсталатора на Gentoo Linux"
echo "За да изпълните този скрипт ви трябва root."
echo "Моля стартирайте скрипта като root."
fi
Това става така
# Проверка за администраторски права
if [ `id -u` -ne 0 ]; then
echo "Добре дошли в инсталатора на Gentoo Linux"
echo "За да изпълните този скрипт ви трябва root."
echo "Моля стартирайте скрипта като root."
exit 1
fi

За изнесените стрингове и url-та във външни файлове, става с командата source. Тя изчита подадения файл и вмъква описаните променливи и техните стойности в твоя скрипт. Данните във външните файлове се описват така:
Цитат
var1="value1"
var2="value2"
var3="value3"
След това в началото на скрипта (за да са достъпни за целия скрипт, иначе не е задължително да седи в началото) слагаш подобен ред:
Код
GeSHi (Bash):
  1. source ВЪНШНИЯТ_ФАЙЛ
В скрипта викаш променливите с техните имена ($var1, $var2, $var3). Препоръчвам ти да си направиш два отделни файла за стринговете и за url-тата (информацията да се раздели смислово).

Проверките за валидност и коректност на изпълнението са строго специфични за всяко проверявано действие. Прояви въображение, когато мислиш проверките. За пример, може това
echo "Изберете дял за root (/)"
echo "Например : /dev/sda1"
read BOOTPART
да стане така
Код
GeSHi (Bash):
  1. while ! fdisk -s $BOOTPART &>/dev/null; do
  2.    printf "Въведете съществуващ дял, който да се използва за root (/) [например: /dev/sda1]: "
  3.    read BOOTPART
  4. done
Проверяваме с fdisk дали зададеният дял съществува (флагът "-s" връща размера на дяла, ако съществува), и ако потребителят е въвел невалиден или несъществуващ дял, то цикълът ще се завърти отново и отново ще се даде предложение на потребителя да въведе (това не е списък за избор, така че думата "изберете" не пасва) нужния дял. Може да ползваш същата проверка и за $SWAP.
Давай нататък ;)

Благодаря за информацията, после ще публикувам целия скрипт (може да представлява за някого интерес)