Shell编程(脚本)的常用命令和语句

原创 2015年07月07日 20:25:47
一些常用的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

实例:
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)

更多的使用实例请参考:

版权声明:本文为原创文章,转载请注明转自Clement-Xu的csdn博客。 https://blog.csdn.net/ClementAD/article/details/46793827

Unity游戏文本自动化生成脚本工具

在游戏开发中,策划填写好配置表,程序拿到配置表后,根据配置表中的项,在代码中定义结构体,编写加载函数接口,获取数据接口,一旦配置表中的项增加或者删除,或者改变,程序就要在脚本中修改对应的结构体,否则就会在加载数据或者获取数据时报错,这对程序开发者来说非常繁琐的,而本课程主要是为解决这个问题而制作的。
  • 2017年10月18日 10:36

cmd脚本命令--之基本命令锦集

转自:http://www.jb51.net/article/26994.htm 目录 第一章 批处理基础 第一节 常用批处理内部命令简介 1、REM 和 :: 2、ECHO 和 @ ...
  • zhu2695
  • zhu2695
  • 2016-09-26 18:32:35
  • 2516

Bat脚本编写以及cmd命令

Bat脚本编写入门echo: 表示显示此命令后的字符 echo on: 表示在此语句后所有运行的命令都显示命令行本身 echo off: 表示在此语句后所有运行的命令都不显示命令行本身 @: 与ech...
  • miracle_8
  • miracle_8
  • 2017-12-27 10:08:26
  • 803

Shell脚本学习(一)Shell命令基础

Shell脚本学习(一)Shell命令基础
  • birdben
  • birdben
  • 2016-08-08 23:55:48
  • 27031

shell脚本:shell的基本元素-8 基本命令查找

当我们在终端输入一个命令的时候,shell会沿着查找路径$PATH来寻找命令。$PATH是一个以冒号分隔的目录列表,我们可以在列表所指定的目录下找到所要执行的命令。所找到的命令可能是编译后的可执行文件...
  • Arthur__yan
  • Arthur__yan
  • 2015-07-28 22:41:18
  • 386

Shell脚本基本命令

shell脚本运行方式 $sh script.sh $sh /home/path/script.sh $chmod a+x script.sh ; $./script.sh echo的三种使用方式...
  • zq602316498
  • zq602316498
  • 2015-06-01 18:49:11
  • 2313

shell脚本常用命令简单总结

$0 这个程序的执行名字 $n 这个程序的第n个参数值,n=1..9 $* 这个程序的所有参数,此选项参数可超过9个。 $# 这个程序的参数个数 $$ 这个程序的PID(脚本运行的当前进程ID号) $...
  • lijingkuan
  • lijingkuan
  • 2016-02-24 22:32:59
  • 346

shell脚本常用命令

basename 1. basename 是去除目录后剩下的名字 example: shell> temp=/home/temp/1.test shell> base=`basename $t...
  • jianke0503
  • jianke0503
  • 2017-09-18 17:05:43
  • 277

Shell 脚本常用命令

Shell脚本是Linux开发工作中常用的工具,但是我一直没有找到一个适合自己的简明扼要的HandBook。在工作过程中整理了一下,贴在这里已备查看。   1           Shell中的特...
  • lionfire
  • lionfire
  • 2011-07-26 11:22:15
  • 17164

shell语句

概念 “#!” 是一个约定的标记,它告诉系统这个脚本需要什么解释器来执行,即使用哪一种Shell。 执行脚本 ./test.sh #执行脚本 /bin/sh test.sh #这种方式运行的...
  • standmyground
  • standmyground
  • 2016-09-09 11:41:55
  • 1829
收藏助手
不良信息举报
您举报文章:Shell编程(脚本)的常用命令和语句
举报原因:
原因补充:

(最多只允许输入30个字)