前言
为什么学习脚本编写???
你有没有遇到过这样场景,繁杂并且重复的操作 N 多件~~~
那么这个时候我们是不是可以想一些其他更快捷、更方便的方法呢!(答案是肯定的,肯定有撒因为我们人类可是很懒的高级哺乳动物) 好了!那么我们步入今天的正题!
一、shell 中特殊变量 1 2 3 4 5 6 7 8 9 10 11 #!/bin/bash echo $0 echo $n echo $# echo $* echo $@ echo $? echo $$ echo $_ echo $!
示例:
1 2 3 4 5 6 7 8 9 10 11 12 13 $ ./test.sh test test1 test2 test3 test4 ./test.sh 5 test test1 test2 test3 test4 test test1 test2 test3 test4 0 12305 12305
$* 和 $@ 都表示传递给函数或脚本的所有参数,不被双引号 (“”) 包含时,都以”$1””$2” … “$n” 的形式输出所有参数。 但是当它们被双引号 (“”) 包含时,”$*”会将所有的参数作为一个整体,以”$1 $2 … $n”的形式输出所有参数;”$@”会将各个参数分开,以”$1””$2” … “$n” 的形式输出所有参数。
例如:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 #!/bin/bash echo "\$*=" $*echo "\"\$*\"=" "$*" echo "\$@=" $@ echo "\"\$@\"=" "$@ " echo "print each param from \$*" for var in $*do echo "$var " done echo "print each param from \$@" for var in $@ do echo "$var " done echo "从 \"\$*\" 获取并打印每一个参数" for var in "$*" do echo "$var " done echo "从 \"\$@\" 获取并打印每一个参数" for var in "$@ " do echo "$var " done
返回结果:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 $*= test test1 test2 "$*" = test test1 test2$@ = test test1 test2"$@ " = test test1 test2print each param from $*test test1 test2 print each param from $@ test test1 test2 从 "$*" 获取并打印每一个参数 test test1 test2从 "$@ " 获取并打印每一个参数 test test1 test2
二、手工处理参数 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 while [ -n "$1 " ]do case "$1 " in -a) echo "发现 -a 选项" ;; -b) echo "发现 -b 选项" echo "-b 选项的参数值是:$2 " shift ;; -c) echo "发现 -c 选项" echo "-c 选项的参数值是:$2 " shift ;; -d) echo "发现 -d 选项" ;; *) echo "$1 is not an option" ;; esac shift done 发现 -a 选项 发现 -b 选项 -b 选项的参数值是:t2 发现 -c 选项 -c 选项的参数值是:t3 发现 -d 选项
三、getopt 处理参数 下面 getopt ab:c:d “$@” 中的 abcd 分别代表四个选项,后面带有冒号的表示选项需要参数值。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 GETOPTOUT=`getopt ab:c:d "$@ " ` set -- $GETOPTOUT while [ -n "$1 " ] do case $1 in -a) echo "发现 -a 选项" ;; -b) echo "发现 -b 选项" echo "-b 选项的参数值是:$2 " shift ;; -c) echo "发现 -c 选项" echo "-c 选项的参数值是:$2 " shift ;; -d) echo "发现 -d 选项" ;; --) shift break ;; *) echo "未知选项:" $1 "" ;; esac shift done ./proxychains4.sh -a -b t2 -c t3 -d 发现 -a 选项 发现 -b 选项 -b 选项的参数值是:t2 发现 -c 选项 -c 选项的参数值是:t3 发现 -d 选项
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 ARGV=($(getopt -o 短选项1[:]短选项2[:]...[:]短选项n -l 长选项1,长选项2,...,长选项n -- "$@ " )) eval set -- "$ARGV " while true do case "$1 " in -短选项1|--长选项1) process shift ;; -短选项2|--长选项2) opt = $2 process shift 2 ;; ... ... -短选项3|--长选项3) process ;; --) break ;; esac done
关于 eval 这个命令,用一个小例子解释:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 foo=10 x=foo y='$' $x echo $y echo $foo eval y='$' $x echo $y $foo 10 10
四、getopts 处理参数 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 while getopts :ab:c:d ARGSdo case $ARGS in a) echo "发现 -a 选项" ;; b) echo "发现 -b 选项" echo "-b 选项的值是:$OPTARG " ;; c) echo "发现 -c 选项" echo "-c 选项的值是:$OPTARG " ;; d) echo "发现 -d 参数" ;; *) echo "未知选项:$ARGS " ;; esac done
这种方法最方便简单。接下来基于这种方法深入讲解。
五、传参意外处理 1 2 3 4 5 6 7 8 9 10 11 "?" ) echo "未知选项 $OPTARG " ;; ":" ) echo "没有输入任何选项 $OPTARG " ;; *) echo "处理选项时出现未知错误" ;;
参考链接:
Shell 脚本传参方法总结 Bash 参数和参数扩展 shell中的getopt与getopts