一些经常使用的Shell编程(脚本)命令和语句,能够满足一般需求。


接收到的命令參数:

  • 參数个数:

$#


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

退出命令:

exit


echo命令:

  • 换行:

echo

  • 输出后不换行:
echo -n "请选择(y/n)?"
  • 输出后不换行,并把光标移到最左(以便下次输出覆盖当前行)
echo
-ne "$i\r"

  • 利用转义符号输出双引號:

echo "欢迎使用\"正式server\"部署工具。"


  • 输出中带变量:
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

实例:
1、倒计时:
#!/bin/sh

seconds_left=15

echo "请等待${seconds_left}秒……"
while [ $seconds_left -gt 0 ];do
echo -n $seconds_left
sleep 1
seconds_left=$(($seconds_left - 1))
echo -ne "\r \r" #清除本行文字
done
echo "done!"

2、命令运行失败时自己主动重试,直到成功(比方运行svn checkout命令,可能由于网络问题不成功):
svn checkout $svn_dir

while [ ! $? -eq 0 ];do
echo "重试……"
svn checkout $svn_dir
done; echo "done!"

(原创文章,转载请注明转自Clement-Xu的博客:http://blog.csdn.net/clementad/article/details/46793827)

很多其它的使用实例请參考:

Shell编程(脚本)的经常使用命令和语句的更多相关文章

  1. Shell编程——脚本编写思路与过程

    Linux系统Shell编程——脚本编写思路与过程 “ 前段时间有小伙伴问我一些问题,涉及到shell脚本的编写问题,事后,我深入思考了下,实际生产环境的确也会经常用到,因此如何写这个脚本?它的思路在 ...

  2. shell编程:定义简单标准命令集

    shell是用户操作接口的意思,操作系统运行起来后都会给用户提供一个操作界面,这个界面就叫shell,用户可以通过shell来调用操作系统内部的复杂实现,而shell编程就是在shell层次上进行编程 ...

  3. Shell编程 | 脚本参数与交互及常见问题

    在执行一个脚本程序时,会经常需要向脚本传递一些参数,并根据输入的参数值生成相应的数据或执行特定的逻辑. 向脚本传递参数 执行Shell脚本时可以带有参数,在Shell脚本中有变量与之对应进行引用.这类 ...

  4. shell编程基础(七): 处理文件命令sed与awk

    一.sed(以行为单位处理文件) sed意为流编辑器(Stream Editor),在Shell脚本和Makefile中作为过滤器使用非常普遍,也就是把前一个程序的输出引入sed的输入,经过一系列编辑 ...

  5. shell编程必须要掌握的命令-xargs

    一,说xargs命令前,说一下什么是shell编程 什么是shell编程呢,说白了就是按一定的规则把各种命令组织起来,完成一定的事情.纯属个人理解,哈哈.不管是交互式的shell,还是非交互的shel ...

  6. Linux编程 23 shell编程(结构化条件判断 命令if -then , if-then ... elif-then ...else,if test)

    一.概述 在上一篇里讲到了shell脚本,shell按照命令在脚本中出现的顺序依次进行处理,对于顺序操作已经足够了,但许多程序要求对shell脚本中的命令加入一些逻辑流程控制,这样的命令通常叫做 结构 ...

  7. linux shell编程学习笔记(二) --- grep命令

    Linux系统中grep命令是一种强大的文本搜索工具,它能使用正则表达式搜索文本,并把匹 配的行打印出来.grep全称是Global Regular Expression Print,表示全局正则表达 ...

  8. Linux Shell编程(21)——复杂命令

    更高级的用户命令find-exec COMMAND \;在每一个find 匹配到的文件执行 COMMAND 命令. 命令序列以 ; 结束( ";" 是 转义符 以保证 shell ...

  9. Shell 编程-常见的文件处理命令

    touch 命令 touch命令用于创建空文件,例如有时应用程序希望在它们写入数据之前,某个日志文件就已经存在.这时可用touch命令创建一个空文件:touch test1:touch命令还可以用来改 ...

  10. 3.shell编程-文件查找之find命令

    3.1.语法格式 find [路劲][选项][操作] 选项参数对照表 3.2.-name 查找/etc/目录下以.conf结尾的文件 find /etc/ -name "*.conf&quo ...

随机推荐

  1. 翻译:MLAPP(2.1节 概率概述)

    笔者:尝试翻译MLAPP(Machine Learning: a Probabilistic Perspective)一书,供机器学习的学者参考,如有错误理解之处请指出,不胜感激!(如需转载,请联系本 ...

  2. fastdfs5.x Java客户端简单例子

    下载源码, 使用maven编译并安装 https://github.com/happyfish100/fastdfs-client-java.git 新建maven工程,引入fastdfs-clien ...

  3. jquery datatable的详细用法

    1,首先需要引用下面两个文件 <link rel="stylesheet" href="https://cdn.datatables.net/1.10.16/css ...

  4. LR 报错误: C interpreter run time error: Error -- Unresolved symbol : vuser_end解决方法

    Action.c(33): Error: C interpreter run time error: Action.c (33):  Error -- Unresolved symbol : vuse ...

  5. Intel Code Challenge Final Round (Div. 1 + Div. 2, Combined) E - Goods transportation 最大流转最小割转dp

    E - Goods transportation 思路:这个最大流-> 最小割->dp好巧妙哦. #include<bits/stdc++.h> #define LL long ...

  6. Scrapy 笔记(二)

    一个scrapy爬虫知乎项目的笔记 1.通过命令创建项目 scrapy startproject zhihucd zhihuscrapy genspider zhihu www.zhihu.com(临 ...

  7. Python并发编程-生产消费模型

    生产消费模型初步 #产生两个子进程,Queue可以在子进程之间传递消息 from multiprocessing import Queue,Process import random import t ...

  8. java_方法

    方法 1.1方法概述 在我们的日常生活中,方法可以理解为要做某件事情,而采取的解决办法. 如:小明同学在路边准备坐车来学校学习.这就面临着一件事情(坐车到学校这件事情)需要解决,解决办法呢?可采用坐公 ...

  9. SpringMVC框架 注解 (转)

    原文地址:http://www.cnblogs.com/yjq520/p/6734422.html 1.@Controller @Controller 用于标记在一个类上,使用它标记的类就是一个Spr ...

  10. here with you

    Here With You - Asher Book To all my friends对我所有好友来讲The night is young夜未央The music's loud乐未殇They pla ...