Shell编程(脚本)的常用命令和语句
2015-07-07 20:25
751 查看
一些常用的Shell编程(脚本)命令和语句,可以满足一般需求。
接收到的命令参数:
参数个数:
$#
参数值:
命令本身:$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_no
read 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
(原创文章,转载请注明转自Clement-Xu的博客:http://blog.csdn.net/clementad/article/details/46793827)
接收到的命令参数:
参数个数:
$#
参数值:
命令本身:$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_no
read 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
(原创文章,转载请注明转自Clement-Xu的博客:http://blog.csdn.net/clementad/article/details/46793827)
相关文章推荐
- shell自动交互
- shell中test的使用
- 在 shell中, 我們可用 $0, $1, $2, $3 ... 這樣的变量分別提取命令行中变量
- shell编程控制结构:expr、let、for、while、until、shift、if、case、break、continue、功能、select
- 如何通过Shell脚本显示一幅图片
- shell中的$(( )) 的用途:主要用在整数的运算$(( a+b*c ))
- 【转载】Shell编程基础
- shell脚本自学成才之helloWold
- 利用ShellExecuteEx手动提升用户特权,以管理员权限来运行程序。win7会有UAC弹窗
- shell同步目录
- linux c编程中调用 shell 命令
- Linux远程管理器xshell和xftp使用教程
- shell基础学习-难点重点学习
- ShellExecute使用详解
- WinCE自启动Shell的问题
- FTP自动化上传的Shell脚本
- cygwin&nbsp;:bash:&nbsp;$&#039;…
- 35、Linux中shell数据重定向(输入重定向与输出重定向)
- 【转】linux shell 正则表达式(BREs,EREs,PREs)差异比较
- shell相关指令介绍$*和$#以及$?和if [[ ! -z $1 ]]