接收到的命令参数:

参数个数: $#

参数值: 命令本身:$0 第一个参数:$1 第二个参数:$2 ……

退出命令: exit

echo命令:

换行: echo

输出后不换行: echo -n "请选择(y/n)?"

输出后不换行,并把光标移到最左(以便下次输出覆盖当前行) echo -ne "$i\r" 利用转义符号输出双引号: echo "欢迎使用"正式服务器"部署工具。"

输出中带变量: echo "即将部署项目:$project_name"

输出带转义符的字符串: echo -e "first\tsecond"

输出到文件 追加到文件尾:echo -e $log_info >> deploy.log 覆盖文件内容:echo -e $log_info > deploy.log

printf命令:

(可以代替echo,格式化输出,和C语言中的printf函数功能相同)

输出一个小数点后两位的数,并换行: printf "The number is %.2f.\n" 100

输出一个指定宽度的字符串: 左对齐:printf "%-20s %-15s %10.2f\n" "Stephen" "Liu" 35

右对齐:printf "|%10s|\n" hello

变量:

定义: profile="production"

使用: echo $profile

变量拼接: log_info="$log_info,$target_ip"

数组:

定义:servers=("192.168.0.31" "192.168.0.39") projects=("public" "industry" "logistics" "misc")

获得整个数组: ${projects[*]}

获得数组元素个数: ${#servers[@]}

数学运算:

加:x=$(expr "$a" + "$b")减:x=$(($a - $b))乘:x=$(expr $a * $b)除:x= $(expr $a / $b)

if 语句(条件判断同样适用于while语句和for语句):

判断一个变量(project)是否非空: if [ $project ];then echo "Variable "project" is null." fi

判断不等于: if [ $# -ne 3 ];then echo "命令行参数不是3个" fi

注:数值大小判断的一些命令: gt:大于(greater than) lt:小于(less than) eq:等于(equal) ne:不等于(not equal) ge:大于等于(greater or equal) le:小于等于 (less or equal)

布尔值判断: if [ "$is_ip_correct" = false ];then echo "无效的ip地址,请使用下面ip之一:" echo ${servers[*]} exit fi

字符串判断: 是否相等: if [ "$confirm" == "y" ] && [ "$confirm" != "n" ];do # do something... fi

是否为空(空返回true): if [-z $string ] 是否非空(非空返回true): if [ -n $string ]

正则表达式判断 if [[ $1 =~ ^public|industry$ ]] && [[ $3 =~ ^[yn]$ ]];then

do something...

fi

if [[ ! $deploy_more =~ [yn] ]];then

do something...

fi

判断文件是否存在: if [ ! -f target/$project.war ];then

do something...

fi

判断目录是否存在: if [ -d $2/webapps/$1 ];then # do something... fi

判断一个文件名(字符串)的后缀 backup_file="/backup/java_data/$1-$today.war" backup_file="/backup/java_data/$1-$today.gz"

if [ "${backup_file##*.}" = "war" ];then
  cp $backup_file $1.war
elif  [ "${backup_file##*.}" = "gz" ];then
  tar zxvf $backup_file
else
  echo "备份文件格式不对"
  exit
fi

read 语句(读取用户输入的字符串):

最简单的用法:读取用户输入到变量yes_or_noread yes_or_no 提示用户输入y或n read -e -p "是否备份:(y/n)?" -i "y" needbackup (参数说明:-e:不知有什么用,但如果去掉了,-i就失效了;-p:后面接着提示语句;-i:后面接着缺省输入;最后一个参数是保存用户输入的变量。)

select 语句(提示用户从列表中选择一个):

修改默认提示语(默认值是"#?"): PS3="请选择一个项目:"

提示用户从数组中选择一个值: select project in ${projects[*]};do if [ $project ];then break fi done

或加上退出条件: select target_ip in ${servers[*]} "Exit(退出)";do if [ "$target_ip" = "Exit(退出)" ]; then echo "谢谢使用!Good-Bye!" break fi

if [ $target_ip ]; then
    # do something
fi

done

case 语句: case $project in public) project_name="大众版" ;; logistics) project_name="配送版" ;; misc) project_name="杂项版" ;; esac

while 语句:

配合正则表达式判断使用: while [[ ! $needbackup =~ ^[yn]$ ]];do read -e -p "是否备份:(y/n)?" -i "y" needbackup done

用“...”做进度条 echo -n "等待$port 端口打开……" while [ ! $pid_new ];do #sleep 1 pid_new=netstat -nlp | grep $port | awk '{print $7}' | awk -F "/" '{print $1}' echo -n "…" done

for语句:

遍历: for ip_t in ${servers[*]};do if [ "$2" = "$ip_t" ];then is_ip_correct=true break fi done

调用其他程序:

使用``,并获得输出结果: PS3="请选择一个分支:" select branch in svn list svn://<svn_host>/java/code/branches;do if [ $branch ];then svn_dir="svn://<svn_host>/java/code/branches/$branch" project_dir=$branch break fi done

使用$(),并获得输出结果: today=$(date +%Y-%m-%d/%H:%M:%S) svn_version=$(svn info $svn_dir | grep "Last Changed Rev:" | awk '{print $4}')

无声地调用其他程序(不输出结果,即把结果输出到一个null设备中)rm $2/logs/m* $2/logs/l* $2/logs/h* $2/logs/catalina.2015* &>/dev/null &

awk(用来对字符串进行切片处理,一般配合grep使用):

获得以空格分隔的第四个字符串: svn_version=$(svn info $svn_dir | grep "Last Changed Rev:" | awk '{print $4}')

获得以特殊分隔符("/")分隔的第一个字符串 awk -F "/" '{print $1}'

print NF} 和 {print $NF}前者是输出了域个数,后者是输出最后一个字段的内容如:~# echo $PWD | awk -F/ '{print $NF}'

获取所有端口号为 $port 的进程,并杀掉 for pid in netstat -nlp | grep $port | awk '{print $7}' | awk -F "/" '{print $1}' do echo "==========================Warning========================" echo "无法正常关闭进程,端口:$port,直接kill掉,进程号:$pid" echo "==========================Warning========================" kill $pid done