Getopts
传统的 UNIX 和 Linux 命令将一些传递的参数看作选项。过去,这些参数是单个的字符开关,与其他参数的区别在于拥有一个前导的连字符或负号。为方便起见,若干个选项可以合并到 ls -lrt 命令中,它提供了一个按修改时间(-t 选项)反向(-r 选项)排序的长(-l 选项)目录清单。
您可以对 shell 脚本使用同样的技术,getopts 内置命令可以简化您的任务。要查看此命令的工作原理,可以考虑如下所示的示例脚本 testopt.sh。
OPTIND自动进1 多了一个空参数
如果短横线后面一次性跟了两个参数值,下一个需要处理的参数是短横线后的第二个,所以此时OPTIND为1
OPTARG
获取参数与脚本内参数进行匹配
Getopts 执行短横线后的语句
例1-4
#!/bin/bash
while getopts "st" opname
#获取短横线后的参数
do
case "$opname" in
s)
echo "Hello sara"
;;
#为s时输出Hello sara
t)
echo "Hello tom"
;;
#为t时输出Hello tom
*)
echo $"Usage: $0 -s|-t“
#为其他参数是输出此参数不合法 不是-s或-t
esac
done
传统的 UNIX 和 Linux 命令将一些传递的参数看作选项。过去,这些参数是单个的字符开关,与其他参数的区别在于拥有一个前导的连字符或负号。为方便起见,若干个选项可以合并到 ls -lrt 命令中,它提供了一个按修改时间(-t 选项)反向(-r 选项)排序的长(-l 选项)目录清单。
可以对 shell 脚本使用同样的技术,getopts 内置命令可以简化任务。
getopts 命令使用了两个预先确定的变量OPTIND和OPTARG。OPTIND:这个表示命令行的下一个选项或参数的索引(文件名不算选项或参数)。OPTARG:表示将选项后面的参数(或者描述信息DESCPRITION)保存在这个变量当中。
例:testopts,sh
#!/bin/bash
#输出参数索引
echo "OPTIND starts at $OPTIND"
#接收参数,前导冒号告诉getops保持静默并抑制正常的错误消息,之后脚本将提供他自己的错误处理
while getopts ":pq:" optname
do
case "optname" in
"p")
echo "Option $optname is specified"
;;
#如果参数为p则输出 参数P指定
"q")
echo "Option $optname has value $OPTARG"
;;
#如果参数为q则输出 参数q有值为
"?")
echo "Unknown option $OPTARG"
;;
#包含问号,输出未知操作,并将描述信息写入参数
":")
echo "No argument value for option $OPTARG"
;;
#该选项无参数值
*)
echo "Unknown error while processing option"
;;
#错误参数
esac
echo "OPTIND is now $OPTIND"
done
此例中的前导冒号告诉 getopts 保持静默(silent)并抑制正常的错误消息,因为此脚本将提供它自己的错误处理。
此例中的第二个参数opname是一个变量名,该变量将接收找到选项的名称。如果预期某optname个选项应该拥有一个值,而且目前存在该值,则会把该值放入 OPTARG 变量中。在静默模式下,可能出现以下两种错误情况。
如果发现不能识别的选项,则 optname 将包含一个 ? 而 OPTARG 将包含该未知选项。
如果发现一个选项需要值,但是找不到这个值,则 optname 将包含一个 : 而 OPTARG 将包含丢失参数的选项的名称。
如果不是在静默模式,则这些错误将导致一条诊断错误消息而 OPTARG 不会被设置。脚本可能在 optname 中使用 ? 或 : 值来检测错误(也可能处理错误)
对于一个基本的Shell程序来说,应该拥有以下基本元素:
第1行的“#!/bin/bash”。
注释:说明某些代码的功能。
可执行语句:实现程序的功能。
例 :第一个Shell程序 helloshell.sh
#!/bin/bash
#输出字符串
echo "Hello Shell!"
除了/bash命令解释器外,还可指定
More脚本解释器
在PHP脚本文件中指定PHP语言的解释器,然后执行文件中的PHP代码。
注释:
#单行注释
:<<block
BLOCK 多行注释
执行:
在Linux中,如果要执行某个Shell脚本,用户可以通过3种方式来实现。这3种方式分别为:
授予用户执行该脚本文件的权限,使得该脚本能够直接执行。
通过调用Shell脚本解释器来执行。
通过source命令来执行。
其中:source命令是一个Shell内部命令,其功能是读取指定的Shell程序文件,并且依次执行其中的所有的语句。该命令与前面2种方式的区别在于只是简单地读取脚本里面的语句,并且依次在当前的Shell里面执行,并没有创建新的子Shell进程。脚本里面所创建的变量都会保存到当前的Shell里面
返回状态:
在UNIX或者Linux中,每个命令都会返回一个退出状态码。退出状态码是一个整数,其有效范围为0~255。通常情况下,成功的命令返回0,而不成功的命令返回非0值。非0值通常都被解释成一个错误码。行为良好的UNIX命令,程序和工具都会返回0作为退出码来表示成功。
Shell脚本中的函数和脚本本身也会返回退出状态码。在脚本或者是脚本函数中执行的最后的命令会决定退出状态码。另外,用户也可以在脚本中使用exit语句将指定的退出状态码传递给Shell。
例:1-9
#!/bin/bash
echo "hello world"
#退出状态为0, 因为命令执行成功.
echo $?
#无效命令.
abc
#非零的退出状态, 因为命令执行失败.
echo $?
echo
#返回120退出状态给shell.
exit 120
Exit 128 语句 指定返回状态码
简单命令堆积,不用写解释器