Linux shell case参数转到默认参数
我正在编写一个带有选项的shell脚本。我不明白为什么我的脚本直接转到默认选项 这里是剧本Linux shell case参数转到默认参数,linux,shell,sh,Linux,Shell,Sh,我正在编写一个带有选项的shell脚本。我不明白为什么我的脚本直接转到默认选项 这里是剧本 args=("$@") ELEMENTS=${#args[@]} LENGTH=$# if [ $LENGTH -eq 0 ] || [ $LENGTH -ne 10 ] then args[0]="-h" ELEMENTS=1 fi for ((i=0; i<$ELEMENTS; i++ )) do PARAMETER=${args[${i}]} cas
args=("$@")
ELEMENTS=${#args[@]}
LENGTH=$#
if [ $LENGTH -eq 0 ] || [ $LENGTH -ne 10 ]
then
args[0]="-h"
ELEMENTS=1
fi
for ((i=0; i<$ELEMENTS; i++ ))
do
PARAMETER=${args[${i}]}
case $PARAMETER in
-H)
i=$(( i + 1 ))
HOSTNAME="${args[${i}]}"
;;
-C)
i=$(( i + 1 ))
COMMUNITY="${args[${i}]}"
;;
-T)
i=$(( i + 1 ))
TYPE="${args[${i}]}"
;;
-i)
i=$(( i + 1 ))
INTERFACE="${args[${i}]}"
;;
-h|--help|*)
echo "Usage:
./check_CMT.sh -H <HOSTNAME> [-C <COMMUNITY>] -T <TYPE> -i <INTERFACE>
TYPE:
1. INTER -- gr-0/0/0
2. SPEED
3. ERROR
4. DISCARD
5. STATUS
6. TRAFIC
-h | --help --> For help"
exit
;;
esac
done
我认为我使用了正确的选项。如果您在我的代码中发现错误,请告诉我。谢谢你用8个参数开始了你的脚本。由于这既不是0也不是10,
args[0]
被设置为-h
,而$ELEMENTS
被设置为1
您可以使用
set-xv
调试脚本(我就是这么做的)。您用8个参数启动脚本。由于这既不是0也不是10,args[0]
被设置为-h
,而$ELEMENTS
被设置为1
您可以使用
set-xv
调试脚本(我就是这么做的)。您用8个参数启动脚本。由于这既不是0也不是10,args[0]
被设置为-h
,而$ELEMENTS
被设置为1
您可以使用
set-xv
调试脚本(我就是这么做的)。您用8个参数启动脚本。由于这既不是0也不是10,args[0]
被设置为-h
,而$ELEMENTS
被设置为1
您可以使用
set-xv
调试您的脚本(我就是这么做的)。顺便说一句,不要为您自己的变量使用所有caps名称。请参阅POSIX规范第四段:“包含小写字母的环境变量名称的名称空间是为应用程序保留的。应用程序可以使用此名称空间中的名称定义任何环境变量,而无需修改标准实用程序的行为。”--请记住,shell变量和环境变量共享一个名称空间。为什么要使用args
?最后,您只需对“$@”中的参数使用;docase$parameter of…
。我改为大写字母和chepner的解决方案。它起作用了。谢谢顺便说一句,不要为自己的变量使用所有大写名称。请参阅POSIX规范第四段:“包含小写字母的环境变量名称的名称空间是为应用程序保留的。应用程序可以使用此名称空间中的名称定义任何环境变量,而无需修改标准实用程序的行为。”--请记住,shell变量和环境变量共享一个名称空间。为什么要使用args
?最后,您只需对“$@”中的参数使用;docase$parameter of…
。我改为大写字母和chepner的解决方案。它起作用了。谢谢顺便说一句,不要为自己的变量使用所有大写名称。请参阅POSIX规范第四段:“包含小写字母的环境变量名称的名称空间是为应用程序保留的。应用程序可以使用此名称空间中的名称定义任何环境变量,而无需修改标准实用程序的行为。”--请记住,shell变量和环境变量共享一个名称空间。为什么要使用args
?最后,您只需对“$@”中的参数使用;docase$parameter of…
。我改为大写字母和chepner的解决方案。它起作用了。谢谢顺便说一句,不要为自己的变量使用所有大写名称。请参阅POSIX规范第四段:“包含小写字母的环境变量名称的名称空间是为应用程序保留的。应用程序可以使用此名称空间中的名称定义任何环境变量,而无需修改标准实用程序的行为。”--请记住,shell变量和环境变量共享一个名称空间。为什么要使用args
?最后,您只需对“$@”中的参数使用;docase$parameter of…
。我改为大写字母和chepner的解决方案。它起作用了。谢谢
./check_interface.sh -H ip_address -C Comm -T SPEED -i gr-0/0/0