Linux Shell "getopts" 简记(一) 我的误解

在实际工作当中,较多情况下,写shell程序的时候实际上是为了简化重复操作。

一些自己写的shell自己使用,几乎都不会有什么问题,不过偶尔会想,shell往里面传参数的时候,如果选项(option)和参数(parameter)个数不固定,这个时候该怎么办呢?

正好这周翻到《Linux命令行与shell脚本编程大全》这本书看了一下,就是用shell中的 getopts 这个。

一开始按照自己的理解,照着书上的实例敲了一下。最开始没有出想要的效果,反复读了几遍,发现首先先要接收剧情设定,举个例子:

~/$ ./myshell -n "my name" -s "Male" -y /home/user1/log

上面这条命令,-n -s 和 -y都是选项。假如 getopts ":n:s:y" opt

那么/home/user1/log 就属于额外的参数。

shift $[ $OPTIND - 1 ]之后,

循环中会有输出/home/user1/log

如果最后没有输/home/user1/log,则最后的一个循环不会有输出内容

即:书中的shell,最后输出的,是非选项中的参数,也就是说"my name" 和 "Male" 是不包含在内的!

而我最初以为,shift后面的循环,可以输出"my name" 、 "Male" 和 /home/user1/log 三个值。不过后来想想,如果是输出了三个值,如何判断哪个是额外参数,就成了一个新的问题。

模拟ls命令的 -l 和 -i 参数:

#!/bin/bash

while getopts ":li" opt
do
        case "$opt" in
        l) long="-l"; echo $long        ;;
        i) inode="-i"; echo $inode      ;;
        *) echo "What's the fuck you input ?!"
        p=$[$OPTIND-1]
        echo "Error: \"${!p}\"";;
        esac
done
shift $[ $OPTIND - 1 ]

count=1
for param in "$@"
do
        ls $long $inode $param
        count=$[ $count + 1 ]
done

 

输出:

[root@cent-dev ~]# cd dev/option/
[root@cent-dev option]# ./ls -l -i -a . ..
-l
-i
What's the fuck you input ?!
Error: "-a"
total 12
25517749 -rwxr-xr-x. 1 root root 317 Nov  3 14:54 ls
25517746 -rwxr-xr-x. 1 root root 439 Nov  3 13:32 myopt
25517745 -rwxr-xr-x. 1 root root 430 Nov  3 13:30 org
total 40
25574518 drwxr-xr-x. 2 root root 275 Mar 12  2018 autorsa
25575945 -rw-r--r--. 1 root root  32 Sep  5 23:24 config
16797776 -rw-r--r--. 1 root root   9 Feb 10  2018 eof.sh
16815732 -rw-r--r--. 1 root root  26 Feb  9  2018 file
16815730 -rw-r--r--. 1 root root   0 Feb  9  2018 file1
25575946 -rwxr-xr-x. 1 root root 533 Sep 19 22:14 initcg
25600646 -rw-r--r--. 1 root root 226 Oct  3 09:10 input_passwd
17299352 -rwxr-xr-x. 1 root root  80 Feb 21  2018 limit
25517736 -rwxr-xr-x. 1 root root  64 Oct 19 09:04 mon
25180069 drwxr-xr-x. 2 root root 100 Oct 13 10:12 myshell
17299344 -rw-------. 1 root root 791 Feb 22  2018 nohup.out
25574517 prw-r--r--. 1 root root   0 Sep 13 22:57 npipe.txt
25517734 drwxr-xr-x. 2 root root  89 Nov  3 14:54 option
25731125 -rwxr-xr-x. 1 root root 121 Mar 14  2018 remain
17299350 -rwxr-xr-x. 1 root root 666 Feb 22  2018 test

就是这样↑

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值