Portál AbcLinuxu, 5. listopadu 2025 18:17
# cat skript.sh
#!/bin/bash SNAPSHOT="fotky" lvcreate -s -L 2G -n $SNAPSHOT-snap /dev/vg01/$SNAPSHOTMá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í:)
#!/bin/bash lvcreate -s -L 2G -n $1-snap /dev/vg01/$1
./skript.sh foo bar #!/bin/bash echo "Skript $0 a parametry $1 a $2."
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:~ $
#!/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.
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
?
Slovíčkaření. Když tomu Bash říká Arrays, nevidím důvod nazývat to seznam, najdu tam, co neznám nebo jakkoliv jinak.
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ý
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[@]}" .....
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
declare -a ARG_ARRAY=("$@")
Tiskni
Sdílej:
ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.