linux command Line and shell script bible(笔记八)

26 篇文章 0 订阅

这是暑假回来看linux命令行与shell脚本编程大全的一些笔记,并不是全部的,只是结合本人觉得需要的一些记录,在整理发表博文时也当作一种回顾!欢迎交流指正!!


13.1.1读取参数
*每个参数都是用空格分隔的,所以shell会将空格当成分隔两个值的分隔符,要在参数中包含空格,必须用引号(单双都可以)
*多于九个命令行参数,第九个之后,要引用就必须在变量数字周围加花括号,如${10}
*读取程序名,$0;但是当传给¥0变量的真是字符串是整个脚本的路径时,那么$0就是整个路径。可以用basename命令只返回程序名而不包含路径,name=`basename $0`
13.2.1 参数计数
$# 特殊变量含脚本运行时就有的命令行参数的个数。另外不能在花括号内使用美元符号,所以表示最后一个参数,可以用${!#}而不是${$#}
$* 变量会将命令上上提供的所有参数当作单个单词保存
$@ 变量会将命令行上提供的所有参数当作同一字符串中的多个独立的单词,允许遍历所有值。
13.3 移动变量
在使用shift命令时,默认情况下它会将每一个参数变量减一,如$3的值会移到$2,依次类推,将所有参数的位置都移动一位,而变量$1的值会被删除($0表示程序名,不会改变)

13.4 处理选项
1.处理简单选项
while [ -n "$1" ]
do case "$1" in
    -a) echo "Found the -a option" ;;
    -b) echo "Found the -b option" ;;
    *) echo "$1" is not an option" ;;
    
   esac
   shift
done

2.分离参数和选项
*对于linux来说,这个特殊的字符就是双破折号(--)。shell会用--来表明选项结束了,看到--之后,脚本会安全地将剩下的命令行参数当作参数来处理
要检查--,只要在case语句用加一项就行了。
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
*当遇到--就停止处理选项了,并将剩下的参数都当作命令行参数

3.处理带值的选项
*知道哪个选项带值的前提下,在in语句中当判断为但值的选项就同时执行shift多一次
while [ -n "$1" ]
do
    case "$1" in
    -a) echo "Found the -a option" ;;
    -b) param="$2"
        echo "Found the -b option with a paramer value $param"
        shift;;
    -c) echo "Found the -c option" ;;
    --) shift
        break;;
    *)  echo "$1 is not an option" ;;
    esca
    shift
done    
count=1
for param in "$@"
do
    echo "Paramer #$count: $param"
    count=$[ $count + 1 ]
done

$ sh test4.sh -a -b lijiancai -d -c -- tes1 tes2
Found the -a option
Found the -b option with a paramer value lijiancai
-d is not an option
Found the -c option
Paramer #1: tes1
Paramer #2: tes2

13.4.2 使用getopt命令
*getopt命令可以接受一系列任意形式的命令行和参数,并自动将他们转换成适当的格式。命令格式如下:
 getopt options optstring parameters
*optstring是个关键,它定义了命令行有效的选项字母,还定义了哪些选项字母需要参数值,
 首先在optstring中列出你要在脚本中用到的每个命令行选项字母,然后在每个需要参数值的选项字母后面加一个冒号,getopt会基于定义的optstring解析提供的参数
$ getopt ab:cd -a -b test1 -cd test2 test3
结果解析为:-a -b test1 -c -d -- test2 test3

2.在脚本中使用getopt
方法:用getopt命令生成的格式化后的版本来替换已有的命令行选项和参数,这时用到set命令去实现。
该方法是将原始的脚本的命令行参数传给getopt命令,之后再将getopt命令的输出传给set命令。
如:set -- `getopt -q ab:cd "$@"`(其中getopt中的-q选项忽略因指定了一个不在optstring中的选项而产生错误输出信息)

set -- `getopt -q ab:c "$@"`      ########和上例子一样,只是多了这一句来帮忙格式化命令行参数,就能处理-ac此类合并的选项了
while [ -n "$1" ]
do
        case "$1" in
        -a) echo "Found the -a option" ;;
        -b) param="$2"
            echo "Found the -b option with a paramer value $param"
            shift;;
        -c) echo "Found the -c option" ;;
        --) shift
            break;;
        *)  echo "$1 is not an option" ;;
        esca
        shift
done    
count=1
for param in "$@"
do
        echo "Paramer #$count: $param"
        count=$[ $count + 1 ]
done

13.4.3 使用更高级的getopts
*此命令每次调用它时,它只处理 一个 命令行上检测到的参数。处理完之后,会退出并返回一个大于0的状态码。
格式如:getopts optstring variable
*getopts命令解析命令行选项时,会移除开头的单破折号,所以在case定义中不用单破折号。
*可以在参数值中包含空格 ./test.sh "test1 test2" -a
*可以将选项字母和参数值放在一起使用,而不用加空格。./test.sh -atest1 能勾从中解析出test1值
*能将命令行上找到的所有未定义在optstring中的选项统一输出成问号。
*getopts命令知道何时停止处理选项,并将参数留给你处理。在处理每个选项时,它会将OPTIND环境变量值增一。故可以将OPTIND值和shift命令一起使用来移动参数。
*用到两个环境变量,如果选项需要跟一个参数值的,OPTARG环境变量会保存正在处理这个值,OPTIND环境变量保存了参数列表中getopts正在处理的参数位置
eg.
while getopts :ab:cd opt    (去掉错误消息在optstring前加冒号)
do
    case "$opt" 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 "Unknow option: $opt" ;;
    esac
done
shift $[ $OPTIND - 1 ]
count=1
for param in "$@"
do
    echo "Parameter $count: $param"
    count=$[ $count + 1 ]
done



$ read -p "Please enter you age:" age
read命令会将输入保存在后面的变量中,如果变量表在数据之前用完,剩下的数据就都会分配给最后一个变量。
可以在read中不指定变量,那么收到的任何数据都放进特殊环境变量REPLY中。
-t 选项指定了read命令等待输入的秒数,过期就会返回一个非零状态码
-n1将-n和1一起使用,告诉read命令在接受单个字符后退,同理可以设置接受其他数量字符后自动退出
-s选项会阻止传给read的数据显示在显示器上

13.6.4 从文件中读取
每次调用read命令会从文件中读取一行文本。常见方法是将文本运行cat命令后输出通过管道直接传给含有read命令的while命令。
count=1
cat file | while read line
do
    echo "Line $count: $line"
    count=$[ $count + 1 ]
done

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值