#!/bin/bash
usage ()
{
echo "run with 1st argument
-mux2 or mux4 or mux8 or default(mux2) or all ( all the 3 mux)"
echo "2nd argument
-struct or ifs or cases or asgn or default(struct) or all(all the
conditions)"
echo "3rd argument
-on (waveform) or off (no wave) or default(off)'
echo "run
- should take mux2 struct off as arguments"
}
if [ "$1" == "mux2" -o "$1" == "mux4" -o "$1" == "mux8" ]; then
if [ "$2" == "struct" -o "$2" == "ifs" -o "$2" == "cases" -o "$2"=="asgn" ]; then
if [ "$3" == "on" ]; then
iverilog -o mux "$1".v "$1"TB.v -D "$2"
vvp mux
gtkwave T.vcd
elif [ "$3" == "off" -o "$3" == "" ]; then
iverilog -o mux "$1".v "$1"TB.v -D "$2"
vvp mux
else
usage
fi
elif [ "$2" == "all" ]; then
$0 $1 struct $3
$0 $1 ifs $3
$0 $1 cases $3
$0 $1 asgn $3
elif [ "$2" =="" ]; then
$0 $2 struct $3
else
usage
fi
elif [ "$1" == "all" ]; then
$0 mux2 $2 $3
$0 mux4 $2 $3
$0 mux8 $2 $3
elif [ "$1" == "" ]; then
$0 mux2 stuct
else
usage
fi
Использование отображается более одного раза, когда я запускаю скрипт со следующими аргументами:
run all jhjjk
run all all kjkj
Как можно сделать так, чтобы печать производилась только один раз?
решение1
Для анализа параметров и опций в вашем скрипте я бы использовалgetopts. Он предлагает функциональность, которую вы ищете.
Но в любом случае, чтобы ваш скрипт запустился, добавьте exit
после этой строки:
echo "run
- should take mux2 struct off as arguments"
exit
}
решение2
Опечатка после default(off)
, а у вас '
вместо "
. В остальном у меня все отлично работает. Я закомментировал большинство команд и вставил echo
s для отладки. Создание минимального примера часто бывает полезным. При этом использование all
в качестве первого аргумента работало отлично. Вот ваш исходный скрипт с "
исправлением и с улучшенными отступами, что значительно упрощает отладку.
#!/bin/bash
usage ()
{
echo "run with 1st argument
-mux2 or mux4 or mux8 or default(mux2) or all ( all the 3 mux)"
echo "2nd argument
-struct or ifs or cases or asgn or default(struct) or all(all the conditions)"
echo "3rd argument
-on (waveform) or off (no wave) or default(off)"
echo "run
- should take mux2 struct off as arguments"
}
if [ "$1" == "mux2" -o "$1" == "mux4" -o "$1" == "mux8" ]; then
if [ "$2" == "struct" -o "$2" == "ifs" -o "$2" == "cases" -o "$2"=="asgn" ]; then
if [ "$3" == "on" ]; then
iverilog -o mux "$1".v "$1"TB.v -D "$2"
vvp mux
gtkwave T.vcd
elif [ "$3" == "off" -o "$3" == "" ]; then
iverilog -o mux "$1".v "$1"TB.v -D "$2"
vvp mux
else
usage
fi
elif [ "$2" == "all" ]; then
$0 $1 struct $3
$0 $1 ifs $3
$0 $1 cases $3
$0 $1 asgn $3
elif [ "$2" =="" ]; then
$0 $2 struct $3
else
usage
fi
elif [ "$1" == "all" ]; then
$0 mux2 $2 $3
$0 mux4 $2 $3
$0 mux8 $2 $3
elif [ "$1" == "" ]; then
$0 mux2 stuct
else
usage
fi
А вот версия, которую я использовал и которая отлично работает.
#!/bin/bash
usage ()
{
echo "run with 1st argument
-mux2 or mux4 or mux8 or default(mux2) or all ( all the 3 mux)"
echo "2nd argument
-struct or ifs or cases or asgn or default(struct) or all(all the conditions)"
echo "3rd argument
-on (waveform) or off (no wave) or default(off)"
echo "run
- should take mux2 struct off as arguments"
}
if [ "$1" == "mux2" -o "$1" == "mux4" -o "$1" == "mux8" ]; then
if [ "$2" == "struct" -o "$2" == "ifs" -o "$2" == "cases" -o "$2"=="asgn" ]; then
if [ "$3" == "on" ]; then
# iverilog -o mux "$1".v "$1"TB.v -D "$2"
# vvp mux
# gtkwave T.vcd
echo 1
elif [ "$3" == "off" -o "$3" == "" ]; then
# iverilog -o mux "$1".v "$1"TB.v -D "$2"
# vvp mux
echo 2
else
usage
fi
elif [ "$2" == "all" ]; then
# $0 $1 struct $3
# $0 $1 ifs $3
# $0 $1 cases $3
# $0 $1 asgn $3
echo 3
elif [ "$2" =="" ]; then
# $0 $2 struct $3
echo 4
else
usage
fi
elif [ "$1" == "all" ]; then
# $0 mux2 $2 $3
# $0 mux4 $2 $3
# $0 mux8 $2 $3
echo 5
elif [ "$1" == "" ]; then
# $0 mux2 stuct
echo 6
else
usage
fi
run all jhjjk
и run all all kjkj
оба возвращаются, 5
как и ожидалось.
РЕДАКТИРОВАТЬ
Самый простой способ выбраться из рекурсивного ада, созданного
$0 mux2 $2 $3
$0 mux4 $2 $3
$0 mux8 $2 $3
сделать каждую группу команд подпрограммой. Затем используйте структуру ветвления, чтобы вызвать эти подпрограммы, или выведите использование, если это бессмыслица. По моему мнению, рекурсия слишком грязная для этой задачи.
решение3
Я предпочитаю использовать функцию, но когда необходимо использовать рекурсивное решение:
#!/bin/bash
usage()
{
echo Usage without recursive check
if [ "${USAGE_PRINTED}" = "notyet" ]; then
echo Usage xxxx
export USAGE_PRINTED="Yes the operator already understands it"
else
echo "ok"
fi
}
if [ -z "${USAGE_PRINTED}" ]; then
export USAGE_PRINTED="notyet"
fi
if [ $# -gt 1 ]; then
echo Parameters $*
usage
shift
$0 $*
else
echo Parameters $*
usage
fi
Вывод при запуске этой программы с параметрами 1 2 3 4:
Parameters 1 2 3 4
Usage without recursive check
Usage xxxx
Parameters 2 3 4
Usage without recursive check
ok
Parameters 3 4
Usage without recursive check
ok
Parameters 4
Usage without recursive check
ok
Строки с "Использование без рекурсивной проверки" демонстрируют проблему, смещение параметров выполняется для завершения рекурсивных вызовов через несколько шагов. Эхо "ok" можно удалить.