Shell 脚本基础和应用实例

1 shell 简介和说明

Shell 既是一种命令语言,又是一种程序设计语言。Shell 是指一种应用程序,这个应用程序提供了一个界面,用户通过这个界面访问操作系统内核的服务

Shell 脚本(shell script),是一种为 shell 编写的脚本程序。

需要写代码的文本编辑器和解释执行的脚本解释器

Linux 的 Shell 种类众多,常见的有:

Bourne Shell (/usr/bin sh  或者 /bin/sh)

Bourne Again Shell (/bin/bash)

主要学习bash

vim一个test.sh文件

#!/bin/bash。--约定的标记,它告诉系统这个脚本需要什么解释器来执行(使用哪一种 Shell)

echo "Hello World !”。--向窗口输出

运行前先设定脚本有执行权限:chmod +x ./test.sh 

./test.sh.       ./ 是表示在当前目录找

2 Shell 变量

变量名和等号之间不能有空格,注意命名规则 如:your_name="runoob.com"

使用变量:在变量名前面加美元符号 echo $your_name 或者echo ${your_name}

变量可以被重新定义

只读变量不能被重新定义

readonly your_name

删除变量:unset variable_name

变量类型:

局部变量 只在当前shell实例中生效,其他shell程序不能访问

环境变量

shell变量

3 Shell字符串

单双引字符串

str=“hello, I know you are \”$your_name\” \n” 双引号里可以有变量和转义字符

拼接字符串

greeting_1="hello, ${your_name} !”

greeting_3='hello, ${your_name} !’

获取字符串长度

str=“abcd"

echo ${#string}#输出 4

提取子字符串

string="runoob is a great site"

echo ${string:1:4}# 输出 unoo

获取子字符串

查找字符 i 或 o 的位置

string="runoob is a great site"

echo`expr index "$string" io` # 输出 4 expr--是一个手工命令行计数器

4 Shell数组

数组名=(值1值2...值n) 

比如:array_name=(value0 value1 value2 value3) 

my_array=(A B"C"D)

array_name[0]=value0

读取数组:${数组名[下标]} ${array_name[index]}

比如valuen=${array_name[n]}

echo ${array_name[@]} —-- @或者*符号可以获取数组中所有元素

获取数组长度

# 取得数组元素的个数

length=${#array_name[@]}

# 或者

length=${#array_name[*]}

# 取得数组单个元素的长度

lengthn=${#array_name[n]}

4 shell注释

#注释

:<<‘

注释内容

5 参数传递

#!/bin/bash

# url:www.baidu.com

echo"Shell 传递参数实例!";

echo"第一个参数为:$1";

echo"参数个数为:$#";

echo"传递的参数作为一个字符串显示:$*”;

$ chmod+x test.sh

$./test.sh123

Shell传递参数实例!

第一个参数为:1

参数个数为:3

传递的参数作为一个字符串显示:123

$* 与 $@ 区别:

5 运算符

基本运算符

乘号(*)前边必须加反斜杠(\)才能实现乘法运算

在 MAC 中 shell 的 expr 语法是:$((表达式))

条件表达式要放在方括号之间,并且要有空格,例如: [$a==$b] 是错误的,必须写成 [ $a == $b ]。

表达式和运算符之间要有空格,例如 2+2 是不对的,必须写成 2 + 2

关系运算符

-eq  等于则为真

-ne 不等于则为真

-gt 大于则为真

-lt 小于则为真

-ge 大于等于则为真

-le 小于等于则为真

布尔运算符

! 非 -o 或 -a 与

逻辑运算符

&& 逻辑AND

 ||逻辑OR

字符串运算符

= != 

-z 字符串长度为零则为真

-n 字符串长度不为零则为真

$ 字符串不为空为真

文件测试运算符

-b file

-d file

-f file

-r file

-s file

-e file

6 echo 命令

echo-e"OK! \n"开启转义

echo"It is a test">myfile显示结果定向至文件

echo'$name\”’ 原样输出字符串不进行转移或者取值变量

echo`date` 显示执行命令的结果(注意是反引不是单引)

7 shell printf命令

printf  format-string [arguments…]

参数说明:

format-string: 为格式控制字符串

arguments: 为参数列表。

printf"%-10s %-8s %-4s\n"姓名性别体重kg 

8 shell test命令

num1="ru1noob"

num2="runoob"

iftest $num1=$num2

then

    echo'两个字符串相等!'

else

    echo'两个字符串不相等!'

fi

9 流程控制

条件判断

ifcondition

then

    command1

    command2

   ...

    commandN

fi

或者:

if condition1

then

    command1

elif condition2

then

    command2

else

    commandN

fi

for循环

for var in item1 item2...itemN

do

    command1

    command2

   ...

    commandN

done

while循环

whil econdition

do

    command

done

多选

case值in

模式1)

    command1

    command2

   ...

    commandN

   ;;

模式2)

    command1

    command2

   ...

    commandN

   ;;

esac

10 函数

[function] funname[()]

{

    action;

   [returnint;]

}

函数返回值在调用该函数后通过 $? 来获得

11 输入输出重定向

command1>file1 输出重定向

command1<file1输入重定向

12 文件引用

test1.sh代码如下

#!/bin/bash

# author:axw

# url:www.baidu.com

url="http://www.baidu.com"

test2.sh代码如下:

#!/bin/bash

# author:axw

# url:www.baidu.com

#使用 .号来引用test1.sh文件

../test1.sh

# 或者使用以下包含文件代码

# source ./test1.sh

echo"地址:$url"



shell脚本实际应用举例:

1、比较远程提测分支最新代码、虚拟机当前代码

2、部署远程提测分支最新代码

#!/usr/bin/env bash

# Desc: git commitId compare & reload

# feature涉及git项目

declare -A projects

projects=(

  ["service_interlogistics"]="feature/hwl-stocking-up-upgrade"

  ["gateway_aqua"]="feature/hwl-stocking-up-upgrade"

  ["gateway_adam"]="feature/hwl-stocking-up-upgrade"

)

# git项目路径

code_path="/data/fulishe/"

# 遍历

for project in "${!projects[@]}"; do

  branch=${projects[$project]}

  echo -e "\n\n[$project] checkout to [$branch]:"

  cd $code_path$project/codebase

  git fetch

  # 比较当前代码、提测分支最新代码

  diff_rst=`git diff HEAD origin/$branch --stat`

  if [[ $diff_rst = "" ]]; then

    # 若当前commit=提测分支最新代码,不部署

    echo -e "\nOP: DON'T NEED RELOAD!"

  else

    # 若当前commit!=提测分支最新代码,部署

    echo -e "\nOP: $project RELOAD!"

    # 比较idl-spec.yaml

    diff_idl=`git diff HEAD origin/$branch --stat idl-spec.yaml`

# 比较requirements.txt

    diff_requirements=`git diff HEAD origin/$branch --stat requirements.txt`

    git stash

    # 切换分支

    git checkout origin/$branch

    if [[ $diff_idl = ""  ]]; then

      echo -e "\nOP: idl-spec.yaml no change, DON'T need flsthrift!"

    else

      echo -e "\nOP: idl-spec.yaml change, $project flsthrift:"

      flsthrift

    fi

    if [[ $diff_requirements = "" ]]; then

      echo -e "\nOP: requirements.txt no change, DON'T need pip install!"

    else

      echo -e "\nOP: requirements.txt change, $project pip install:"

      pip install -r requirements.txt

    fi

    # 重启服务

    echo -e "\nOP: $project reload & health_check: "

    ./../command/reload.sh

    ./../command/health_check

  fi

done

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 202,529评论 5 475
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,015评论 2 379
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 149,409评论 0 335
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,385评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,387评论 5 364
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,466评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,880评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,528评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,727评论 1 295
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,528评论 2 319
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,602评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,302评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,873评论 3 306
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,890评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,132评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,777评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,310评论 2 342

推荐阅读更多精彩内容

  • 一、Python简介和环境搭建以及pip的安装 4课时实验课主要内容 【Python简介】: Python 是一个...
    _小老虎_阅读 5,713评论 0 10
  • 官网 中文版本 好的网站 Content-type: text/htmlBASH Section: User ...
    不排版阅读 4,359评论 0 5
  • Bash内置基本变量 PWD : 显示当前的工作目录 OLDPWD : 显示上一次的工作目录 ~:用户家目录 - ...
    魏镇坪阅读 1,512评论 0 6
  • [TOC] 简介: Shell 是一个用C语言编写的程序,它是用户使用Linux的桥梁。Shell既是一种命令语言...
    黄海滨_x阅读 815评论 0 2
  • 一、shell脚本介绍 1.1 开头(环境使用shebang机制) #!/bin/bash 必须写在文件首行 符号...
    优果馥斯阅读 3,268评论 0 1