shell脚本编程(二)
文章目录
- 可以在shell脚本中使用管道或者重定向循环输出结果。
- shell执行程序的位置参数通过标准数字表示时,其中$0为程序名称,$1为第一个参数。类推。如果参数大于9个,必须用大括号括起来。
位置参数都是通过空格分隔的,要想参数中包含空格,必须使用单引号或者双引号。
编写带有参数的脚本的时候应当检查参数的存在。
参数计数:$#,计算存储执行脚本中包含的命令行参数个数;${!#}可获取到最后一个参数;当命令行中没有任何参数时,$#赋给的值为0,但变量${!#}将返回明林能够行中使用的脚本名称。
获取所有变量中的命令行参数:$*和$@:变量$×所有参数视为一个单词,而变量$@分别对待每个参数。
shift命令能够改变命令行参数的相对位置,默认参数变量左移一个位置。也可以通过shift命令提供一个参数来实行多位移变化:
shift+n
参数的引用时,最好用双引号括上参数($1,$×等)
执行shell脚本时经常会遇到既需要使用选项又需要使用参数的情况,使用双破折号(- -)指示选项列表的结束。
|
|
- 有些选项需要附加的参数值,这种情况下,命令行格式与下面格式类似:
|
|
getopt命令处理命令行选项和参数时非常方便。对参数重新组织
- 命令格式:
getopt options optstring parameters
选项字符串(optstring)定义了命令行中有效字母,需要参数值选项后放一个冒号。,getopt根据定义的optstring解析参数。-q可以忽略getopt错误消息。 - 脚本中使用getopt:set命令的一个选项是双破折号,表示将命令行参数转换为set命令的命令行中的值。
set -- 'getopt -q ab:cd "$@"'(反引号)
- 命令格式:
|
|
- getopt命令不能很好地处理带有空格的参数值,它将空格解析为参数分隔符。
- 更高级的getopts命令:getopts命令顺序地对现有shell参数进行处理(循环中解析所有命令行参数):
getopts optstring variable
在选项字符串中列出有效选项字母,如果选项字母需要参数值后面加上一个冒号。如果要禁止输出错误消息,那么使选项字符串以冒号开头。 - getopts使用两个环境变量。环境变量OPTARG中包含需要参数值的选项要使用的值;OPTIND包含的值表示getopts停止处理时在参数列表中的位置。(getopts的case定义中不用破折号,选项字母和参数值中间可以没有空格,getopts将在命令行中找到的未定义的选项都绑定为单一的输出–问号)
- getopts命令知道何时停止处理选项,留下参数。getopts每次处理选项,环境变量OPTIND的值会增加1。
|
|
常用的Linux命令行选项
选项 描述 选项 描述 -a 显示所有对象 -n 使用非交互式(批量)模式 -c 生成计算 -o 指定一个输出文件来重定向输出 -d 指定目录 -q 以quiet模式执行 -e 展开对象 -r 递归处理目录和文件 -f 指定读取数据的文件 -s 以silent模式执行 -h 显示命令的帮助信息 -v 生成verbose输出 -i 忽略大小写 -x 排除和拒绝 -l 生成长格式的输出 -y 设置所有提问的回答为yes 获取用户输入:
- 基本读取:read命令,read命令行中如果不指定变量,那read命令将接收到的数据防止在环境变量REPLY中。
- 计时:read的-t参数可以计时
- 默读:read的-s参数
标准文件描述符:0:STDIN(标准输入);1:STDOUT(标准输出);2:STDERR(标准错误)
重定向错误
- 仅重定向错误:
ls -al badfile 2>test4
- 重定向错误和数据:
ls -al test test2 test3 badfile 2>test6 1>test7
- 使用
&>
符号,可以将STDEER和STDOUT输出重定向到同一个输出文件。(bash sshell自动使错误消息的优先级高于标准输出)
- 仅重定向错误:
在脚本中重定向输出:
- 临时重定向:重定向到某个文件描述符时,必须在文件描述符前添加&号
e.g:echo "This is an error message" >&2
- 永久重定向:使用exec命令通知shell在脚本执行期间重定向特定的文件描述符:
- 临时重定向:重定向到某个文件描述符时,必须在文件描述符前添加&号
|
|
- 在脚本中重定向输入:
exec 0< testfile
- 使用exec命令还可以创建自己的重定向,在shell中最多可以有9个打开的文件描述符
exec 3>test
- 重定向文件描述符和创建输入文件描述符
- 创建读取/写入文件描述符:
exec 3<>testfile
- 关闭文件描述符&-:
exec 3>&-
- lsof命令列出整个Linux系统上所有开放文件描述符。(它向非系统管理员提供了Linux系统的信息。许多Linux系统都隐藏了该命令,以防用户无意中使用了它)
- 不希望显示任何脚本输出时可以将STDERR重定向到空文件(null file)的特殊文件。shell输出到空文件的任何数据都不会保存。该文件的位置是dev/null,任何重定向到该位置的数据都将丢失且不会显示。
- Linux使用/tmp目录处理不需要永久保存的文件,很多Linux系统配置在启动时自动删除/tmp中的文件。
- mktemp命令可以在/tmp创建临时文件,仅文件所有者有读写权限。
- mktemp默认在本地目录创建文件。只需指定一个文件名模板和6个X:
mktemp testing.XXXXXX
|
|
- -t选项强迫mktemp在系统的临时文件夹中创建文件;-d选项让mktemp命令创建一个临时目录。