关闭

shell脚本编程(二)

标签: 标准存储编程脚本shell
344人阅读 评论(0) 收藏 举报
分类:

shell脚本编程(二)

  • 可以在shell脚本中使用管道或者重定向循环输出结果。
  • shell执行程序的位置参数通过标准数字表示时,其中01为第一个参数。类推。如果参数大于9个,必须用大括号括起来。
  • 位置参数都是通过空格分隔的,要想参数中包含空格,必须使用单引号或者双引号。
  • 编写带有参数的脚本的时候应当检查参数的存在。
  • 参数计数:$#,计算存储执行脚本中包含的命令行参数个数;${!#}可获取到最后一个参数;当命令行中没有任何参数时,$#赋给的值为0,但变量${!#}将返回明林能够行中使用的脚本名称。
  • 获取所有变量中的命令行参数:$*和$@:变量$×所有参数视为一个单词,而变量$@分别对待每个参数。
  • shift命令能够改变命令行参数的相对位置,默认参数变量左移一个位置。也可以通过shift命令提供一个参数来实行多位移变化:shift+n
  • 参数的引用时,最好用双引号括上参数($1,$×等)

  • 执行shell脚本时经常会遇到既需要使用选项又需要使用参数的情况,使用双破折号(- -)指示选项列表的结束。

    #!/bin/bash
#extracting options and parameters
while [ -n "$1" ]
do
    case "$1" in
    -a) echo "Found the -a option" ;;
    -b) echo "Found the -b option" ;;
    -c) echo "Found the -c option" ;;
    --) shift
    break;;
    *) echo "$1 is not an option";;
    esac
    shift
done
count=1
for param in $@
do
    echo "Parameter #$count:$param"
    count=$[ $count+1 ]
done
  • 有些选项需要附加的参数值,这种情况下,命令行格式与下面格式类似:
    #!/bin/bash
#extracting command line options and values
while [ -n "$1" ]
do
    case "$1" in
    -a) echo "Found the -a options";;
    -b) param="$2"
    echo "Found the -b option,with parameter value $param"
    shift ;;
    -c) echo "Found the -c option";;
    --) shift #使用双破折号(--)指示选项列表的结束。
    break;;
    *) echo "$1 is not an option";;
    esac
    shift
done
  • getopt命令处理命令行选项和参数时非常方便。对参数重新组织

    1. 命令格式:getopt options optstring parameters选项字符串(optstring)定义了命令行中有效字母,需要参数值选项后放一个冒号。,getopt根据定义的optstring解析参数。-q可以忽略getopt错误消息。
    2. 脚本中使用getopt:set命令的一个选项是双破折号,表示将命令行参数转换为set命令的命令行中的值。set -- 'getopt -q ab:cd "$@"'(反引号)
#!/bin/bash
#extracting command line options and values with getopt
set -- `getopt -q ab:c "$@"`
while [ -n "$1" ]
do
    case "$1" in
    -a) echo "Found the -a options";;
    -b) param="$2"
    echo "Found the -b option,with parameter value $param"
    shift ;;
    -c) echo "Found the -c option";;
    --) shift
    break;;
    *) echo "$1 is not an option";;
    esac
    shift
done
count=1
for param in "$@"
do
    echo "Parameter #$count: $param"
    count=$[ $count+1 ]
done
  • getopt命令不能很好地处理带有空格的参数值,它将空格解析为参数分隔符。
  • 更高级的getopts命令:getopts命令顺序地对现有shell参数进行处理(循环中解析所有命令行参数):getopts optstring variable在选项字符串中列出有效选项字母,如果选项字母需要参数值后面加上一个冒号。如果要禁止输出错误消息,那么使选项字符串以冒号开头。
  • getopts使用两个环境变量。环境变量OPTARG中包含需要参数值的选项要使用的值;OPTIND包含的值表示getopts停止处理时在参数列表中的位置。(getopts的case定义中不用破折号,选项字母和参数值中间可以没有空格,getopts将在命令行中找到的未定义的选项都绑定为单一的输出–问号)
  • getopts命令知道何时停止处理选项,留下参数。getopts每次处理选项,环境变量OPTIND的值会增加1。
    #!/bin/bash
while getopts :ab:cd test
do
    case $test in
    a) echo "Found the -a option";;
    b) echo "Found the -b option,with value $OPTARG";;
    c) echo "Found the -c option";;
    d) echo "Found the -d option";;
    *) echo "Unknown option:$test";;
    esac
done
shift $[ $OPTIND-1 ]
count=1
for param in $@
do
    echo "Parameter $count: $param"
    count=$[ $count+1 ]
done
  • 常用的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(标准错误)
  • 重定向错误
    1. 仅重定向错误:ls -al badfile 2>test4
    2. 重定向错误和数据:ls -al test test2 test3 badfile 2>test6 1>test7
    3. 使用&>符号,可以将STDEER和STDOUT输出重定向到同一个输出文件。(bash sshell自动使错误消息的优先级高于标准输出)
  • 在脚本中重定向输出:
    1. 临时重定向:重定向到某个文件描述符时,必须在文件描述符前添加&号e.g:echo "This is an error message" >&2
    2. 永久重定向:使用exec命令通知shell在脚本执行期间重定向特定的文件描述符:
#!/bin/bash
#redirecting all output to a file
exec 2>testerror
echo "This is a test of redirecting all output"
echo "from  a script to another file."
exec 1>testout
echo "without having to redirect every individual line"
echo "but this should go to the testerror file" >&2
  • 在脚本中重定向输入: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
    #实例
#!/bin/bash
#creating and using a temp file
tempfile=`mktemp test.XXXXXX`
exec 3>$tempfile
echo "This script writes to temp file $tempfile"
echo "This is the first line">&3
echo "This is the second line">&3
echo "This is the third line">&3
exec 3>&-
echo "Done creating temp file .The contents are:"
cat $tempfile
rm -f $tempfile 2> /dev/null
  • -t选项强迫mktemp在系统的临时文件夹中创建文件;-d选项让mktemp命令创建一个临时目录。
0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:87289次
    • 积分:1502
    • 等级:
    • 排名:千里之外
    • 原创:66篇
    • 转载:3篇
    • 译文:0篇
    • 评论:10条
    最新评论