shift
命令用于对参数的移动(左移),通常用于在不知道传入参数个数的情况下依次遍历每个参数然后进行相应处理(常见于Linux中各种程序的启动脚本)
shift(shift 1) 命令每执行一次,变量的个数($#)减一,移动2位可以 执行2次shift
Shell脚本$变量的含义
1、$#:表示执行脚本传入参数的个数
2、$*:表示执行脚本传入参数的列表(不包括$0)
3、$$:表示进程的id;Shell本身的PID(ProcessID,即脚本运行的当前 进程ID号)
4、$!:Shell最后运行的后台Process的PID(后台运行的最后一个进程的 进程ID号)
5、$@:表示执行脚本传入参数的所有个数(不包括$0)
6、$0:表示执行的脚本名称
7、$1:表示第一个参数
8、$2:表示第二个参数
9、$?:表示脚本执行的状态,0表示正常,其他表示错误
(())双小括号
双小括号 (( )) 是 Bash Shell 中专门用来进行整数运算的命令,不能对小数(浮点数)或者字符串进行运算。
[[]]和[]
尽量使用[[ … ]]条件判断结构, 而不是[ ], 能够防止脚本中的许多逻辑错误. 比如,&&, ||, <, 和> 操作符能够正常存在于[[]]条件判断结构中, 但是如果出现在[ ]结构中的话, 会报错。
[]
[ ] 两个符号左右都要有空格分隔
内部操作符与操作变量之间要有空格:如 [ “a” = “b” ]
字符串比较中,> < 需要写成\> \< 进行转义:如 [ “a” < “b” ]
\字符串变量尽量使用"" 双引号扩住,避免值未定义引用而出错
[ ] 中可以使用 –a –o 进行逻辑运算
[ ] 是bash 内置命令
[[]]
[[ ]] 两个符号左右都要有空格分隔
内部操作符与操作变量之间要有空格:如 [[ “a” = “b” ]]
字符串比较中,可以直接使用 > < 无需转义。如 [[ “a” < “b” ]]
[[ ]] 中字符串如未使用"" ,可以通过==和=~进行模式和正则表达式匹配
[[] ] 内部可以使用 && || 进行逻辑运算
[[ ]] 是关键字
[[ ]] 其他用法都和[ ] 一样
[[ ]] 和 [ ] 都可以和 ! 配合使用
case $1 in
;;
命令“;;”指出程序流应该跳到整个case语句的末尾,类似break。
case 需要满足的值 in #这里设置一个需要满足的条件判断条件1) #判断条件1,判断该条件是否符合需要满足的值子模块 #如果判断条件为 true,执行子模块1;; #结束整个循环判断条件2) #如果判断条件1没满足需要满足的值,则走到判断条件2,判断该条件是否符合需要满足的值子模块2 #如果判断条件为 true,执行子模块2;; #结束整个循环判断条件3) #如果判断条件2没满足需要满足的值,则走到判断条件3,判断该条件是否符合需要满足的值子模块3 #如果判断条件为 true,执行子模块3;; #结束整个循环……*) #如果之前的判断条件都没满足需要满足的值,则走到判断条件*子模块4 #走到判断条件*后,不管有没有满足都会执行下面的子模块;; #结束整个循环esac #结束语法
封装 sh run.sh arg1 arg2
function usage(){echo "Usage: ./run.sh -c /home/work/conf.conf -start /home/work/start.sh"echo "Usage: ./run.sh -c /home/work/conf.conf -stop /home/work/start.sh"
}function help(){}if [$# -eq 0]; thenusageexit 1
ifwhile [$# -gt 0];
do case $1 in -start)shiftSTART_PATH=$1shift;;-stop)shiftSTOP_PATH=$1shift;;-c)shiftCOUNT_TIME=$1if [[ $1 -lt 0]]; thenecho "-c must bigger than 0."exit 1fishift;;-h)usageexit 1;;esac
donefunction check_dir(){if [[! -d "log/" ]];thenmkdir logelseecho "log dir already exist."fi
}