#!/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)
가 있는 곳에 오타가 있습니다 . 그 외에도 그것은 나에게 잘 작동합니다. 대부분의 명령을 주석 처리하고 s를 넣어 디버깅했습니다. 최소한의 예제를 만드는 것이 유용한 경우가 많습니다. 이를 통해 첫 번째 인수로 사용하면 문제가 없었습니다. 다음은 수정 사항과 더 나은 들여쓰기 기능을 갖춘 원본 스크립트입니다. 이를 통해 디버깅이 훨씬 쉬워집니다.'
"
echo
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
각 명령 그룹을 서브루틴으로 만드는 것입니다. 그런 다음 분기 구조를 사용하여 이러한 서브루틴을 호출하거나, 의미가 없는 경우 사용법을 인쇄하십시오. IMO 재귀는 이 작업에 비해 너무 지저분합니다.
답변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"를 삭제할 수 있습니다.