Итак, я хочу напечатать параметры сценария, которые удовлетворяют некоторым условиям:
t1=0
for i in $@; do
if [ $i == "-1" ] || [ $i == "-2" ] || [ $i == "-3" ]; then
t2=$(($t1+2))
echo $i $"$t2"
fi
t1=$(($t1+1))
done
Если я вызываю сценарий следующим образом:
./name_of_script -2 aaa -m bbb -3 ccc -4 ccc -1 ddd
, я хочу, чтобы он напечатал что-то например:
-2 aaa
-3 ccc
-1 ddd
Итак, я хочу напечатать параметр -1, -2 или -3 и каждый из параметров, следующих сразу после них. но я получаю это вместо этого:
-2 2
-3 6
-1 10
Я просто не могу превратить 2, 6 и 10 в 2, 6 и 10 долларов, чтобы можно было распечатать эти параметры сценария.
Есть идеи? Большое спасибо.
Хотя то, что вы пытаетесь сделать , может быть возможным, канонический способ получить следующий позиционный параметр в Сценарий оболочки использует встроенную функцию shift
. Так, например, вы могли бы сделать
#!/bin/bash
while [ $# -gt 0 ]; do
opt="$1"
case $opt in
-1|-2|-3)
shift
printf '%s %s\n' "$opt" "$1"
;;
*)
printf 'unknown option: %s\n' "$opt" >2
;;
esac
shift
done
. Однако то, что вы, похоже, делаете здесь, это переизобретение встроенного в getopts
:
#!/bin/bash
while getopts ":1:2:3:4:m:" opt; do
case $opt in
1|2|3)
printf -- '-%s %s\n' "$opt" "$OPTARG"
;;
*)
printf -- 'unknown option: -%s\n' "$opt" >2
;;
esac
done
затем
$ ./name_of_script -2 aaa -m bbb -3 ccc -4 ccc -1 ddd
-2 aaa
-3 ccc
-1 ddd