Portál AbcLinuxu, 6. května 2025 17:57

Dotaz: Skript a proměná

18.4.2017 14:42 Lederer
Skript a proměná
Přečteno: 510×
Odpovědět | Admin
Dobrý den,

# cat skript.sh
#!/bin/bash
SNAPSHOT="fotky"
lvcreate -s -L 2G -n $SNAPSHOT-snap /dev/vg01/$SNAPSHOT
Mám tady ukázku osekaného skriptíku a můj dotaz spočívá v tom, zda a jak se dá udělat, abych v něm nemusel natvrdo psát proměnnou, ale skript bych spustil např. ./skript.sh fotky a všechny proměnné SNAPSHOT by byly fotky. Pak bych zadal např. ./skript.sh root a všechny proměnné SNAPSHOT by byly root atd. Snad je to pochopitelné. Moc díky za nakopnutí:)
Nástroje: Začni sledovat (0) ?Zašle upozornění na váš email při vložení nového komentáře.

Odpovědi

18.4.2017 14:58 PEE
Rozbalit Rozbalit vše Re: Skript a proměná
Odpovědět | | Sbalit | Link | Blokovat | Admin
#!/bin/bash
lvcreate -s -L 2G -n $1-snap /dev/vg01/$1
18.4.2017 15:02 NN
Rozbalit Rozbalit vše Re: Skript a proměná
Odpovědět | | Sbalit | Link | Blokovat | Admin
./skript.sh foo bar

#!/bin/bash

echo "Skript $0 a parametry $1 a $2."
pVit avatar 20.4.2017 12:14 pVit | skóre: 11
Rozbalit Rozbalit vše Re: Skript a proměná
Odpovědět | | Sbalit | Link | Blokovat | Admin

Pro pevný počet argumentů:

#!/bin/bash

ARG_COUNT=$#

SCRIPT_NAME=$0

ARG_1=$1

ARG_2=$2

ARG_3=$3

echo "NAME - $SCRIPT_NAME, Arguments - $ARG_COUNT, 1. argument - $ARG_1, 2. argument - $ARG_2, 3. argument - $ARG_3"

 

Výstup:

pi@raspberrypi:~ $ /home/pi/args prvni druhy treti

NAME - /home/pi/args, Arguments - 3, 1. argument - prvni, 2. argument - druhy, 3. argument - treti

 

 

Další možností může být naplnění pole argumenty:

#!/bin/bash

declare -a ARG_ARRAY=(`echo $@`);

for i in "${ARG_ARRAY[@]}"

do echo $i

done

 

Výstup:

pi@raspberrypi:~ $ /home/pi/arguments jedna dva tri ctyri pet

jedna

dva

tri

ctyri

pet

pi@raspberrypi:~ $

Writing multithreaded code is easy... to get wrong.
pVit avatar 20.4.2017 13:37 pVit | skóre: 11
Rozbalit Rozbalit vše Re: Skript a proměná
Jinak analogicky k tvému problému můžeš udělat script, který vykoná tvůj příkaz pro všechny argumenty.

#!/bin/bash

declare -a ARG_ARRAY=(`echo $@`);

for i in "${ARG_ARRAY[@]}"

do

lvcreate -s -L 2G -n $i-snap /dev/vg01/$i

done

Pak si dáš jen ./skript.sh fotky root dalsi dalsi a vytvoří ti to všechno automaticky naráz.

Writing multithreaded code is easy... to get wrong.
20.4.2017 13:45 Michal Kubeček | skóre: 72 | Luštěnice
Rozbalit Rozbalit vše Re: Skript a proměná

Jakou výhodu získáte tím polem oproti obvyklému

while [ $# -gt 0 ]; do
    lvcreate -s -L 2G -n "${1}-snap" "/dev/vg01/$1"
    shift
done

nebo

for v in "$@"; do
    lvcreate -s -L 2G -n "${v}-snap" "/dev/vg01/$v"
done

?

pVit avatar 20.4.2017 13:59 pVit | skóre: 11
Rozbalit Rozbalit vše Re: Skript a proměná
Síla zvyku, mám radši pole pro přehlednost a orientaci při více odkazech do něj. V tomto jednoduchém případě je samozřejmě lepší využít tvůj způsob.
Writing multithreaded code is easy... to get wrong.
20.4.2017 20:17 Kit | skóre: 45 | Brno
Rozbalit Rozbalit vše Re: Skript a proměná
Jaké pole? Žádné pole v jeho řešení nevidím. Pouze seznamy.
Komentáře označují místa, kde programátor udělal chybu nebo něco nedodělal.
20.4.2017 22:18 Andrej | skóre: 51 | blog: Republic of Mordor
Rozbalit Rozbalit vše Re: Skript a proměná

Slovíčkaření. Když tomu Bash říká Arrays, nevidím důvod nazývat to seznam, najdu tam, co neznám nebo jakkoliv jinak.

20.4.2017 22:14 Andrej | skóre: 51 | blog: Republic of Mordor
Rozbalit Rozbalit vše Re: Skript a proměná

Ne že bych čekal ve jménech zařízení mezery, ale proč je nepodporovat, když to jde? A vůbec, je lepší mít vždycky všechno bezpečně oescapované, pokud se nějak pracuje se vstupem z příkazové řádky.

#!/bin/bash                                                                                                                                
ARGS=("$0" "$@")                                                                                                                           
for idx in "${!ARGS[@]}"; do                                                                                                               
  echo "Argument číslo ${idx}: ${ARGS[idx]}"                                                                                               
done                                                                                                                                       
Tohle^^^ taky názorně ukazuje konvenci kolem argv[0] a některé detaily chování "$@". Příklad:
$ /tmp/zee první 'druhý s mezerami' 't ř e t í' čtvrtý
Argument číslo 0: /tmp/zee
Argument číslo 1: první
Argument číslo 2: druhý s mezerami
Argument číslo 3: t ř e t í
Argument číslo 4: čtvrtý
21.4.2017 17:34 thuner
Rozbalit Rozbalit vše Re: Skript a proměná
Tohle by se mělo objevovat častěji, používám to osobně ve skriptu s unison a rsync:
OPTS1=(-copyprog "rsync -aX --rsh='ssh -p 22 -i /root/.ssh/unison/id_rsa -c arcfour' --inplace"
       -copyprogrest "rsync -aX --rsh='ssh -p 22 -i /root/.ssh/unison/id_rsa -c arcfour' --partial --inplace"
       -copythreshold 0
       -copyquoterem true
       )

unison "${OPTS1[@]}" "${OPTS2[@]}" .....
21.4.2017 19:17 Jindřich Makovička | skóre: 17
Rozbalit Rozbalit vše Re: Skript a proměná
To echo je tam zbytečně, viz shellcheck. Stačí
#!/bin/bash
declare -a ARG_ARRAY=($@)
for i in "${ARG_ARRAY[@]}"
do
    lvcreate -s -L 2G -n "$i-snap" "/dev/vg01/$i"
done
21.4.2017 19:19 Jindřich Makovička | skóre: 17
Rozbalit Rozbalit vše Re: Skript a proměná
Oops, vypadly mi uvozovky v declare -a ARG_ARRAY=("$@")

Založit nové vláknoNahoru

Tiskni Sdílej: Linkuj Jaggni to Vybrali.sme.sk Google Del.icio.us Facebook

ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.