快捷搜索:   nginx

Shell高级编程(2)


如果运行脚本时输入了非法的参数,getopts命令将会输出如下形式的出错信息,同时把一个问号(?)字符存储到name变量中:
script_name: illegal option--option_letter
 
getopts命令的返回值取决于是否成功地获取了选项。如果读取选项(包括非法的选项),getopts语句将返回数值0。
例:
while getopts abs var
do
case ${var} in
a)echo option -a found;;
b)echo option -b found;;
c)echo option -c found;;
esac
done
运行脚本:$testing -adc
 
如果选项带有参数,则需要在相应的选项字母后面附加一个冒号“:”字符。如果存在冒号,则选项后的字符串将存储到OPTORG变量中。如:while getopts a:b:s var。一个选项要求提供选项参数而未提供,getopts语句将会输出下列形式的出错信息:
script_name: option requires an argument-optiond_letter
 
当getopts语句执行结束后,OPTIND变量的值将会指向第一个非选项参数的位置参数,也即第一个命令参数。我们可以利用 shift,使之左移$OPTIOND-1个位置,即可使$1指向第一个命令参数,$2指向第二个命令参数,如此等等。
 
例:
while getopts o:r:nt var
do
case ${var} in
o)output_file="${OPTARG}";;
r)report_file="${OPTARG}";;
n)number_option="yes";;
t)title="no";;
\?)exit2;;
esac
done
echo "Output file=${output_file}"
echo "Report file=${report_file}"
echo "Numbering option=${number_option:-no}"
echo "Title option=${title:-yes}"
echo "Arguments before shift: ${*}"
shift 'expr ${OPTIND}-1'
echo "Arguments afters shif:${*}"
 

10、while循环的I/O重定向
 为了达到循环结构代码块的I/O重定向的目的,可在循环结构结束标志(如关键字done)后面附加运算符<和适当的输入文件。
对于while循环结构语句,下列语法格式表示,循环结构块所需的所有的输入数据均取自指定的输入文件:
while [condition-is-true]
do
command-list
done < datafile
 
until循环的I/O重定向与while循环的I/O重定向完全相同。
 
tee命令实现标准输出的I/O重定向,显示并保存脚本的输出数据。语法格式:
tee [-a] file
-a,表示输出的内从附加到文件后面,并不覆盖文件的内容。
 
basename 路径名,它可以提取路径中的文件名。如:basename /etc/passwd,将提取出文件名passwd。basename "fsafsa",将出去双引号只剩下字符串fsafsa。
 
for循环的I/O重定向也类似,还可以在 done后使用管道符号(|)进行重定向。
 
11、here文档
 here文档是一种具有特殊用途的代码块。here文档采用I/O重定向的方法,把一系列需要从键盘上的输入的命令,模拟人工输入方法,一行一行的提交给交互式程序或命令。here文档的格式:
COMMAND<<LimitString
command1
command2
.....
commandN
LimitString
特殊I/O重定向符号"<<"和"LimitString"表明here文档的开始,而第二个"LimitString"表示here文档的结束。重定向的效果是将here文档的命令提交给交互程序或命令的标准输入。
 
选择字符串分隔符"LimitString"时应确保它在Shell脚本中是唯一的,至少在其界定的一系列命令中间不应该出现,以避免产生混淆。
 
例:
vi $1<<EOF
i
I cannot choose the best
The best choose me.
^[
:wq
EOF
注释:^[是一个字符,表示ESC键。
 
here文档也支持变量和命令的替换,为了禁止here文档中使用参数替换或命令替换,可以在第一个字符串分隔符"LimitString"前后增加单引号或双引号,或在第一个字符串分隔符前加转义字符。
 
利用here文档和":"命令,可以注解掉shell脚本中的代码。从而避免了在每一行前加注解字符(#)。
 
12、函数
 函数的语法格式:
function_name(){
command-list
}
注意,如果整个函数定义与命令位于同一行上,则左花括号和右花括号之前必须存在一个空格。同时,每个命令之后除附加分号之外,至少必须有一个空格。如:function_name(){ com1; com2; ...}
另外,函数与圆括号之间必须连在一起,之间不能有空格。
例:
exchange()
{
temp=${colors1}
colors1=${colors2}
colors2=${temp}
return
}
 
在定义函数时,不能在函数体内使用exit命令,因为函数的执行不是子程序调用,函数与当前的shell脚本同属于一个进程。当在函数中执行exit命令时,将会引起当前shell脚本或进程的终止执行。
在函数定义中,表示整个函数执行结束的替代方法是利用shell的内部命令return实现,用来终止函数的执行。只有在函数定义中才可以使用return命令,但也并非必需的。实际上,仅当期望的函数返回数值时,才需要使用return语句,如果函数中未用到return命令,则函数运行结束时将返回函数体中的执行的最后一条命令的出口状态。如同exit语句,return语句也可以带一个整数参数选项,以便作为函数执行结束时返回一个出口状态数值,并将这个出口状态赋值到$?变量。return [n]
 
例:计算闰年
$cat leap-year
#!/bin/sh
leap-year(){
if [ 'expr $1%4' -ne 0 ]

顶(1)
踩(0)

您可能还会对下面的文章感兴趣:

最新评论