在实际工作当中,较多情况下,写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
就是这样↑