shell 自动化运维

2023-05-16

1、shell 基础知识

1). shell是一个程序,文件路径:/bin/bash,是一个命令解释器,所有的linux命令都由它来执行

      打开终端,就进入了shell交互式命令

       2). shell脚本

              后缀为.sh的就是我们所谓的shell脚本文件

      tab键没有意义,仅仅是为了美观
              单行注释键:       #    (首行的#不是注释)

       多行注释:     :<<! ... !  

#!/bin/bash

echo 'hello world'

echo 'pen'

:<<!
echo 'book'
!

echo 'phone'

        3). 脚本执行方式

    1、bash hello.sh   或    /bin/bash hello.sh(推荐)

    2、当前路径下执行脚本    ./hello.sh

    3、source hello.sh      或  .   hello.sh

    说明:

        方式1.脚本文件本身没有可执行权限或者脚本首行没有命令解释器时使用的方法,我们推荐用bash执行。

        方式2.脚本文件具有可执行权限时使用;  添加执行权限: chmod + x  脚本名

        方式3. source命令和.命令 通常用于重新执行刚修改的初始化文件,使之立即生效,而不必注销并重新登录

         区别:source不会开启新的进程执行脚本,可以跟当前窗口共享进程,共享变量; 其他两种都会开新的进程

《脚本开发规范:》

       1.  脚本命名要有意义,文件后缀是.sh

       2.  脚本文件首行是而且必须是脚本解释器    #!/bin/bash

       3.  脚本文件常见执行方式:bash 脚本名

       4.  脚本内容执行:从上到下,依次执行

       5.  代码书写

             1)   成对内容的一次性写出来,防止遗漏。  如:()、{}、[]、''、``、""

             2)   []中括号两端要有空格,书写时即可留出空格[    ],然后再退格书写内容。

             3)   流程控制语句一次性书写完,再添加内容

         4). 变量

      1.本地变量 (在当前系统的某个环境下才能生效的变量,作用范围小。)

           3种方式赋值

            1、name=laowang      (等号两边不需要加空格,否则会报错n)
                   2、name='name is $name'  不会解析引号中的变量
                   3、name="name is $name"  会解析引号中的变量

                 习惯: 数字不加引号,其他默认加双引号

                  echo $name         ($变量名 , 输出时,变量前面需要加上 ‘$’ 符号 )

       2. 命令变量

                    执行命令,把命令返回的结果交给变量

                    1、name=`pwd`                (``  这两个为反引号,shift +`  )

                    2、name=$(pwd)

               3. 全局变量( 在当前系统的所有环境下都能生效的变量 )

                     查看全局变量命令:

                             env               只显示全局变量

                             env | grep SHELL    (grep 过滤)

                     1、name="wang"

                           export name

                           env | grep name

                     2、export age=123  (最常用)

                     export 这种方式,变量的作用范围是当前窗口及子进程


                    #如果想让全局变量永久生效,并且任何一个窗口都有效,需要修改文件/etc/profile
                    export age=123,重新启动系统

          

                4. 使用变量

                   1、 $变量名                 echo $name
                   2、echo "$name"
                   3、echo ${name}
                   4、"${变量名}"         echo "${name}"         -- 这个是最规范的

                         ##   $变量名 与  "$变量名"是一致的,说明 双引号对变量的引用没有影响。

               5.删除变量

                          unset 变量名                   unset name

               6.   shell 内置变量

              $0  获取当前执行的脚本文件名称, 包括脚本路径
                      $n  $1...$9 获取第几个参数,如果n>9,需要${10}
                      $#  获取当前shell命令行中参数的总个数

               echo  $?  返回上一条命令的结果,0代表上一条命令执行成功,非0是失败

               说明: 如果上一条命令时运行一个脚本,$?返回的上脚本中的最后一行命令的结果

# 示例:      
      1 #!/bin/bash
      2 
      3 #$0 表示脚本的名称
      4 echo "脚本的名称为:$0"
      5 
      6 #$n 表示接受脚本传入的参数
      7 echo "脚本参数1:$1"
      8 echo "脚本参数2:$2"
      9 echo "脚本参数3:$3"
     10 
     11 # $# 表示传入参数的个数
     12 echo "脚本参数个数: $#"



# 执行:

    [root@VM-0-12-centos shell_operation]# bash test01.sh one two three
    脚本的名称为:test01.sh
    脚本参数1:one
    脚本参数2:two
    脚本参数3:three
    脚本参数个数: 3
    [root@VM-0-12-centos shell_operation]# echo $?
    0
    [root@VM-0-12-centos shell_operation]# 

                 7. 字符串精确截取
                     格式:${变量名:起始位置:截取长度}

[root@VM-0-12-centos shell_operation]# name="abcdef"
[root@VM-0-12-centos shell_operation]# echo ${name:0:2}
ab

                    示例:
                       ${file:0:5}        从第1个字符开始,截取5个字符
                       ${file::5}        从第1个字符开始,截取5个字符
                       ${file:5:5}        从第6个字符开始,截取5个字符
                       ${file:5}            从第6个字符开始,截取后面所有的字符
                      ${file:0-5}        从倒数第5个字符开始,截取后面所有的字符
                      ${file:0-6:3}        从倒数第6个字符开始,截取之后的3个

                 8. 默认值

                     方式一: ${变量名:-默认值}

                             echo ${name:-123}  如果name有值,就不采用默认值,如果name没有值,就采用默认值

                      方式二:  ${变量名+默认值}                 无论变量a是否有内容,都输出默认值

                             echo ${name+123}   无论name是否有值,都采用默认值。 

                             (测试发现,变量需要先赋值,默认值才生效,否则为空)

2、shell 进阶   

         1)表达式

                      1. 测试语句  —— 用 $? 来判断是否执行成功,0:表示成功;   1: 表示失败

                          1). 等号左右必须有空格

                                    test 1 = 1

                          2). [ ] 括号左右都需要空格,两个比较的值之间必须要有空格 --  这个比较常用
                                    [ 1 = 2 ]


                       2. 表达式分类 -- 逻辑表达式

                            常见的逻辑符号:  &&    和  ||

                           命令1 && 命令2   命令1执行成功,命令2才执行,命令1执行失败,命令2不执行

                           命令1 || 命令2   命令1执行成功,命令2不执行,命令1执行失败,命令2才执行

                        3.  表达式分类 -- 文件表达式

                              -f    (file)      判断输入内容是否是一个文件

                              -d    (directory)   判断输入内容是否是一个目录

                              -x    (execute) 判断输入内容是否可执行
                                [ -f hello.sh ] 判断是否是文件

                                [ -d abc ]  判断是否是文件夹

                                [ -x abc ]  判断是否可执行,文件夹也是可执行的

                          4.  表达式分类 -- 数值比较操作符:        [ 表达式 ]

                                 n1 -eq n2            相等

                                 n1 -gt n2            大于

                                 n1 -lt n2            小于

                                 n1 -ne n2            不等于

                                 n1 –ge n2                大于等于

                                 n1 –le n2             小于等于

                            5.  表达式分类 -- 字符串比较操作符:        [ 表达式 ]                           

                                     str1 == str2                str1和str2字符串内容一致

                                     str1 != str2                 str1和str2字符串内容不一致,!表示相反的意思

                                     [ "hello" == "hello" ]

                             6. 计算表达式 

                                  方式一: $(( ))                     $(( 计算表达式 ))         

                                   a=$((变量名a+1))      如: a=$((100/5))

                                  注意:1) $(())中只能用+-*/和()运算符,并且只能做整数运算

                                             2) 表达式范围内,空格不限制

                                             3) 没有 a+=1 这种操作

                                   方式二: let   变量名a=变量名a+1

                                                  如:  let a=a+1

                                    注意: 表达式必须是一个整体,中间不能出现空格等特殊字符

3. linux 常用符号

        3.1 重定向符号 

              在shell脚本中有两种常见的重定向符号 >  和 >>

              >  符号:表示将符号左侧的内容,以覆盖的方式输入到右侧文件中

              >> 符号: 表示将符号左侧的内容,以追加的方式输入到右侧文件的末尾行中

 > 演示:

查看文件内容
admin-1@ubuntu:~$ cat file.txt 
nihao
使用重定向符号给文件中增加内容
admin-1@ubuntu:~$ echo "file1.txt" > file.txt 
再次查看文件内容
admin-1@ubuntu:~$ cat file.txt 
file1.txt

---------------------------------------------
 >> 演示:

查看文件内容
admin-1@ubuntu:~$ cat file.txt 
file1.txt
使用重定向符号给文件中增加内容
admin-1@ubuntu:~$ echo "file2.txt" >> file.txt 
再次查看文件内容
admin-1@ubuntu:~$ cat file.txt 
file1.txt
file2.txt

        3.2  管道符     |

              命令1 | 命令2      管道符左侧命令1 执行后的结果,传递给管道符右侧的命令2使用

               env |grep SHELL

         3.2  grep命令详解 ( grep命令是我们常用的一个强大的文本搜索命令。)

                命令格式: grep [参数] [关键字] <文件名>

               注意: 1)我们在查看某个文件的内容的时候,是需要有<文件名>

                           2)grep命令在结合|(管道符)使用的情况下,后面的<文件名>是没有的

               参数详解:     -c:只输出匹配行的计数。

                                      -n:显示匹配行内容及行号。

                                      -v:显示不包含匹配文本的所有行。  (invert)

[root@VM-0-12-centos shell_operation]# grep -n file test02.txt 
1:file test
2:file test2
[root@VM-0-12-centos shell_operation]# grep -c file test02.txt
2
[root@VM-0-12-centos shell_operation]# grep -v file test02.txt
[root@VM-0-12-centos shell_operation]# 

                 小技巧: 精确定位错误代码

                                grep -nr file shell_operation(文件夹名)    

                                grep -nr [错误关键字] *                   -r 递归查找子目录

# 查找文件夹下含有 ‘hello’的文件

    grep -nr hello shell_test

[-----@VM-83-114-centos ~]$ grep -nr hello shell_test
shell_test/test_001:2:echo "hello"
shell_test/test_001:3:echo "hello"
shell_test/test_001:4:echo "hello"
shell_test/test_001:5:echo "hello"
shell_test/test_001:6:echo "hello"
shell_test/test_001:7:echo "hello"
shell_test/test_001:8:echo "hello"
shell_test/test_001:9:echo "hello"
shell_test/test_001:10:echo "hello"

               

         3.3    sed 命令详解   ( sed 文件编辑命令。因为它编辑文件是以为单位的。)

                  命令格式:  sed [参数] '[动作]<匹配条件>' [文件名]

                  参数详解

                          参数为空     表示sed的操作效果(会在窗口展示),实际上不对文件进行编辑

                               -i                  表示对文件进行编辑,

                              注意:mac系统中使用 -i参数,必须在后面单独加个东西: -i ''

                   动作详解:

                           a\           在匹配到的内容下一行增加内容

                           i\            在匹配到的内容上一行增加内容

                           d            删除匹配到的内容

                           s            替换匹配到的内容

                       注意: 上面的动作只有在加上参数-i的时候才会生效,不然的话不会有效果

                    匹配条件:

                           匹配条件分为两种:数字行号或者关键字匹配

                           关键字匹配格式:

                               's/key1/key2/' 

                            注意:   隔离符号 / 可以更换成 #、@、!等符号

  替换命令演示:   命令格式: sed -i [ 替换格式 ] [ 文件名 ]

# 模板文件内容
[root@VM-0-12-centos shell_operation]# cat test03.txt
nihao sed sed sed

nihao sed sed sed

nihao sed sed sed

# 1. 替换每行首个匹配内容:    sed -i 's#原内容#替换后内容#' 文件名

       示例:替换首每行的第1个sed为SED

[root@VM-0-12-centos shell_operation]# sed -i 's#sed#SED#' test03.txt
[root@VM-0-12-centos shell_operation]# cat test03.txt
nihao SED sed sed

nihao SED sed sed

nihao SED sed sed

# 2. 替换全部匹配内容:    sed -i 's#原内容#替换后内容#g' 文件名

       示例:替换全部sed为 SED

[root@VM-0-12-centos shell_operation]# sed -i 's#sed#SED#g' test03.txt
[root@VM-0-12-centos shell_operation]# cat test03.txt
nihao SED SED SED

nihao SED SED SED

nihao SED SED SED

 # 3. 指定行号替换首个匹配内容:    sed -i '行号s#原内容#替换后的内容#' 文件名

        示例:替换第3行的首个SED为sed

[root@VM-0-12-centos shell_operation]# cat -n test03.txt
     1	nihao SED SED SED
     2	
     3	nihao SED SED SED
     4	
     5	nihao SED SED SED
     6	
[root@VM-0-12-centos shell_operation]# sed -i '3s#SED#sed#' test03.txt
[root@VM-0-12-centos shell_operation]# cat -n test03.txt
     1	nihao SED SED SED
     2	
     3	nihao sed SED SED
     4	
     5	nihao SED SED SED
     6	

 # 4. 首行指定列号替换匹配内容:     sed -i 's#原内容#替换后内容#列号' 文件名

          示例:替换每行的第2个SED为sed

[root@VM-0-12-centos shell_operation]# sed -i 's#SED#sed#2' test03.txt
[root@VM-0-12-centos shell_operation]# cat -n test03.txt
     1	nihao SED sed SED
     2	
     3	nihao sed SED sed
     4	
     5	nihao SED sed SED
     6	
[root@VM-0-12-centos shell_operation]# 

 # 5. 指定行号列号匹配内容:    sed -i '行号s#原内容#替换后内容#列号' 文件名

         示例:替换第5行的第2个SED为sed

[root@VM-0-12-centos shell_operation]# sed -i '5s#SED#sed#2' test03.txt
[root@VM-0-12-centos shell_operation]# cat -n test03.txt
     1	nihao SED sed SED
     2	
     3	nihao sed SED sed
     4	
     5	nihao SED sed sed
     6	
[root@VM-0-12-centos shell_operation]# 

增加操作: 

                 a 作用: 在指定行号的下一行增加内容

                 格式: sed -i '行号a\增加的内容'  文件名  

                 注意:如果增加多行,可以在行号位置写个范围,彼此间用逗号隔开,如:sed -i '1,3a\增加内容' 文件名

 演示效果

        1. 指定行号增加内容、 2.  指定1~3 每行都增加内容

[root@VM-0-12-centos shell_operation]# sed -i '3a\add value' test03.txt
[root@VM-0-12-centos shell_operation]# cat -n test03.txt
     1	nihao SED sed SED
     2	
     3	nihao sed SED sed
     4	add value
     5	
     6	nihao SED sed sed
     7	
[root@VM-0-12-centos shell_operation]# sed -i '1,3a\add value' test03.txt
[root@VM-0-12-centos shell_operation]# cat -n test03.txt
     1	nihao SED sed SED
     2	add value
     3	
     4	add value
     5	nihao sed SED sed
     6	add value
     7	add value
     8	
     9	nihao SED sed sed
    10	
[root@VM-0-12-centos shell_operation]# 

               i 作用: 在指定行号的上一行增加内容

                 格式: sed -i '行号 i\增加的内容' 文件名

                 注意:多行格式:sed -i '1,3 i\增加的内容' 文件名

[root@VM-0-12-centos shell_operation]# sed -i '2i\insert value' test03.txt
[root@VM-0-12-centos shell_operation]# cat -n test03.txt
     1	nihao SED sed SED
     2	insert value
     3	add value
     4	
     5	add value
     6	nihao sed SED sed
     7	add value
     8	add value
     9	
    10	nihao SED sed sed
    11	

删除操作

               d 作用 : 指定行号删除

                 格式:      sed -i '行号 d'  文件名

                 注意:   如果删除多行,  sed -i '1,3d' 文件名

[root@VM-0-12-centos shell_operation]# cat -n test03.txt
     1	nihao SED sed SED
     2	insert value
     3	add value
     4	
     5	add value
     6	nihao sed SED sed
     7	add value
     8	add value
     9	
    10	nihao SED sed sed
    11	
[root@VM-0-12-centos shell_operation]# sed -i '6d' test03.txt
[root@VM-0-12-centos shell_operation]# cat -n test03.txt
     1	nihao SED sed SED
     2	insert value
     3	add value
     4	
     5	add value
     6	add value
     7	add value
     8	
     9	nihao SED sed sed
    10	
[root@VM-0-12-centos shell_operation]# sed -i '4,8d' test03.txt
[root@VM-0-12-centos shell_operation]# cat -n test03.txt
     1	nihao SED sed SED
     2	insert value
     3	add value
     4	nihao SED sed sed
     5	
[root@VM-0-12-centos shell_operation]# 

4. 流程控制

       在shell语句中,流程控制主要分为两种: 简单流程控制语句(选择和循环)与 复杂流程控制语句 (函数)

      4.1 简单流程控制语句

              4.1.1  双分支 if 语句

# 语法格式:
            if [ 条件 ]
            then 
                    指令1
            else
                    指令2
            fi

示例;

#!/bin/bash
if [ 1 = 1 ]
then
	echo '逻辑成立'
else
	echo '逻辑不成立'
fi

              

              4.1.2  多分支 if 语句

语法格式:
            if [ 条件 ]
            then
                    指令1
            elif [ 条件2 ]
            then
                    指令2
            else
                    指令3
            fi

# 多if语句生产场景: 服务的启动
(当脚本执行时需要传入参数,通过传入参数的不同,选择不同的功能。)

#!/bin/bash
if [ "$1" == "start" ]
then
	echo "程序开始运行。。"
elif [ "$1" == "stop" ]
then 
	echo "程序关闭中"
elif [ "$1" == "restart" ]
then
	echo "程序重启中"
else
	echo "$0 脚本的使用方式: $0 [ start | stop | restart ]"
fi

              4.1.3  case 选择语句

# 语句格式:
        case 变量名 in
            value1)
                    指令1
                    ;;
            value2)
                    指令2
                    ;;
            value3)
                    指令3
                    ;;
            esac

                       注意: 首行关键字是 case,  末行关键字 esac

                                    选择项后面都有 )

                                     每个选择的执行语句结尾都有两个分号

                                     如果无一匹配模式,使用星号 * 捕获该值,再执行后面的命令

#!/bin/bash
case "$1" in
	"start")
		echo "程序启动中。。。"
		;;
	"stop")
		echo "程序停止"
		;;
	"restart")
		echo “程序重启中。。”
		;;
	*)
		echo "$0 脚本的使用方式: $0 [ start | stop | restart ]"
	esac

              4.1.4  for 循环语句

                        循环指定的所有元素,循环完毕之后就推出

# 语法格式:
    for 值 in 列表
    do
        执行语句
    done

# 示例: 遍历文件:

#!/bin/bash
# for语句的使用示例
for i in $(ls /root)
do
  echo "${i}"
done


-------------- 往一个变量中定义值列表 -----------------
#!/bin/bash
a="1 2 3 4"
for i in $a
do
        echo $i
done

               4.1.5  while 循环语句

                         -- 只要条件满足,就一直循环下去

# 语法格式:
    while 条件
    do
        执行语句
    done

# 条件的类型:  命令, [[字符串表达式]],(( 数字表达式 ))

示例:
#!/bin/bash
a=1
while [ "$a" -lt 5 ]
do
    echo "${a}"
    a=$((a+1))
done

               4.1.6  until 循环语句  

                          -- 只要条件不满足,就一直循环下去

# 语法格式:
    until 条件
    do
        执行语句
    done

# 条件的类型: 命令, [[ 字符串表达式 ]], (( 数字表达式 ))

# 示例:
#!/bin/bash
echo "$0"
a=1
until [ "$a" -gt 5 ]
do
        echo "输出的数字为:$a"
        a=$((a+2))
done


5. 复杂流程控制语句

            5.1 函数的基础知识

                  1. 定义:函数就是将某些命令组合起来实现某一特殊功能的方式,是脚本编写中非常重要的一部分

                  2. 格式:

# 定义函数:
                函数名(){
                            函数体
                        }

# 调用函数:     函数名

--------------------------------
#!/bin/bash
input(){
        echo "wo de mingzi shi "
}

input





# 传参函数格式:
    传参数 :    函数名  参数
    
    函数体调用参数:
                    函数名(){
                                函数体 $n
                            }    
    # 注意: 类似于shell 内置变量中的位置参数

---------------------------------------------
#!/bin/bash
input(){
        echo "wo de mingzi shi $1"
}

input "zhangsan"

           5.2 函数的示例

                 1)简单函数定义和调用示例:

## 简单函数定义和调用示例
#!/bin/bash
fun(){
        echo "这是一个函数"
}

fun

## 函数传参,脚本传参
#!/bin/bash
fun(){
        echo "输入的数字为:$1"
}

fun "$1"

## 执行脚本:
bash 脚本文件 6

## 函数多个参数分别调用示例:
#!/bin/bash
print_func(){
  echo "wo de mingzi shi $1"
  echo "wo de mingzi shi $2"
  echo "wo de mingzi shi $3"
}
print_func Curry James Allen

             ## 综合案例:

需求

1、zonghe.sh 脚本执行时候需要传入参数,然后对参数进行判断

参数和功能详情如下:

参数                   执行效果

              start              服务启动中...

              stop              服务关闭中...

              restart           服务重启中...

              *                          脚本帮助信息...

2、参数的数量有限制,只能是1个,否则就提示脚本的帮助信息

3、帮助信息使用函数来实现

信息内容:脚本 zonghe.sh 使用方式 zonghe.sh [ start|stop|restart ]

 1 #!/bin/bash
  2 
  3 fun1(){
  4         echo "zhonghe.sh use [ start|stop|restart ]"
  5 }
  6 
  7 if [ $# -eq 1 ]
  8 then
  9         case $1 in
 10                 start)
 11                         echo "---start---"
 12                         ;;
 13                 stop)
 14                         echo "---stop---"
 15                         ;;
 16                 restart)
 17                         echo "---restart---"
 18                         ;;
 19                 *)
 20                         fun1
 21                         ;;
 22                 esac
 23 else
 24         fun1
 25 fi         


----------------------------------------


      1 #!/bin/bash
      2 
      3 
      4 fun(){
      5             echo "脚本 $0 使用方式 $0 [ start|stop|restart ]"
      6 }
      7 
      8         
      9 if [ "$#" == 1 ]
     10 then            
     11         if [ "$1"  == "start" ]
     12         then    
     13                 echo "服务启动中。。"
     14         elif [ "$1" == "stop" ]
     15         then    
     16                 echo "服务关闭中"
     17         elif [ "$1" == "restart" ]
     18         then    
     19                 echo "服务重启中"
     20         else
     21                 fun $0
     22         fi
     23 else
     24         fun $0
     25 fi
~            

6.  代码发布

        6.1 代码发布流程

                获取代码--》打包代码--》传输代码--》停止应用--》解压代码--

                --》放置代码--》开启应用--》检查效果--》对外访问

        6.2 代码仓库

                  集中式代码仓库: svn                    分布式代码仓库: git

               区别:

                        svn 几乎所有操作命令,都集中在我和代码仓库服务器处理网络连接状态

                       git 几乎所有操作命令,可以在本地完成 ,和代码服务器是否无关

         6.3 传输代码

                传输方式: 有网: scp, ftp, rsync

                                    没有网:u盘

        6.4 关闭应用

                关闭的顺序: 先关闭离客户近的,后关闭离客户远的

        6.5 解压代码

          # 归档+压缩 和 解压+解档
                - 归档+压缩
                  > tar -zcvf temp.tar.gz 1.txt 2.txt ... 

                - 解压+解档
                  > tar -zxvf temp.tar.gz

         6.6 放置代码

                为了避免我们在放置代码过程中,对老文件造成影响,所以我们放置代码一般分为两步:备份老文件,和放置新文件。

        6.7 开启应用

               刚才关闭了什么应用就开启什么应用

               开启的顺序: 先开启离客户远的,后开启离客户近的

        6.8 检查

                查看浏览器效果或者 netstart -tnulp 查看系统开放的端口

         

        外部用户开启

## 文件的压缩和解压
    文件的压缩
        压缩格式:
            tar zcvf 压缩后的文件名  将要压缩的文件

             > tar -zcvf temp.tar.gz 1.txt 2.txt ..
    
    文件的解压
        解压格式:
            tar xf 压缩后的文件名
    
            tar -zxvf temp.tar.gz 

命令参数详解
    z	指定压缩文件的格式为 tar.gz
    c	表示压缩
    v	显示详细过程
    f	指定压缩文件
    x	解压

查看压缩文件内容(不解压缩文件的情况下,显示压缩包中文件的内容)
    zcat 压缩文件 
    zcat file.gz

mac系统使用: zcat < 压缩文件


查看多个压缩文件:
    zcat file1.gz file2.gz

查看普通文件的内容:
    zcat -f file

--------------------------------------------------
文件的传输
    命令格式:
			scp  要传输的文件  要放置的位置(路径)

    1.将本地文件 推送到 远程服务器
			格式:scp  要传输的文件  远程用户名@远程主机ip:远程主机的路径
            eg :  scp  temp.tar.gz   python@192.168.0.102:/home/python

    2.远程服务器获取代码仓库的文件 到 本地
			格式:scp  仓库用户名@仓库主机ip:仓库文件路径(远程服务器目录)  本地文件路径 
			eg : scp python@192.168.0.102:/home/python/temp.tar   ./


----------------------------------------------------
文件备份
    -- 文件的备份要有一定的标志符号,我们就使用当前时间的形式来表示

    演示效果:
        显示当前日期
        # date +%Y%m%d
            20170928
        
        显示当前时间
        # date +%H%M%S
            030643

    指定时间戳格式:
		年月日时分秒:date +%Y%m%d%H%M%S
		
    时间戳演示效果:
    指定的时间戳格式
    # date +%Y%m%d%H%M%S
    20170928030742

备份命令效果格式:
    方式一:复制备份
    cp nihao nihao-$(date +%Y%m%d%H%M%S)
    
    方式二:移动备份
    mv nihao nihao-$(date +%Y%m%d%H%M%S)
    我们为了避免在放置新文件时候,出现验证操作,我们确定采用方式二:


-----------------------------------------------------------

    练习案例:
1、在代码仓库机器上创建一个目录/data/ceshi/,在目录里面创建两个文件,内容分别如下:
      文件名			内容
    file1.txt		content1
    file2.txt		content2
2、对目录ceshi进行压缩
3、对目录ceshi进行移动备份(年月日时分秒)
4、将压缩包文件传输到远端服务器
5、在远端服务器上解压 压缩包文件
6、在远端服务器上修改压缩包文件内容。然后再次压缩
7、在代码仓库机器上拉取远端服务器上的压缩包文件
8、使用命令查看压缩包文件的内容

命令执行效果:

仓库机器操作命令:
1、
mkdir /data/ceshi -p
cd /data
echo 'content1' > ceshi/file1.txt
echo 'content2' > ceshi/file2.txt
2、tar zcvf ceshi.tar.gz ceshi
3、mv ceshi ceshi-$(date +%Y%m%d%H%M%S)
4、scp ./ceshi.tar.gz  python@192.168.1.109:~/day02

服务器机器操作命令:
5、
cd ~/day02
tar xf ceshi.tar.gz
6、
echo 'content3' >> ceshi/file1.txt
tar zcvf ceshi-1.tar.gz ceshi
仓库机器操作命令
7、scp python@192.168.1.109:~/ceshi-1.tar.gz  ./
8、zcat ceshi-1.tar.gz


    
    
    



    

7.  脚本-- 功能调试

        -n           检查脚本中的语法错误

        -v           显示脚本所有内容,然后执行脚本,结果输出,如果执行遇到错误,将错误输出。

        -x           将执行的每一条脚本命令执行结果都打印出来

          示例:  bash  -n test.sh

8.  脚本编写总结:

        1. 手工执行的命令一定要先测试通过

        2. 根据发布流程编写脚本的框架

        3. 将手工执行的命令填充到对应的框架函数内部

        4. 文件备份,date, 方便跟踪脚本历史执行记录

        5. 主函增加日志功数中逻辑流程控制好

        6. 设计安全的方面:

            增加锁文件,保证代码发布的过程中不受干扰,

              输入参数数量

              输入参数匹配

              脚本帮助信息

         7. 调试脚本

    ## 注意事项:

         1. 命令一定要保证能正常执行

         2. 成对的符号,要成对写,避免丢失

         3. 函数调用, 写好函数后,一定要在主函数中进行调用

         4. 避免符号出现中文

         5. 命令变量的写法一定要规范

         6. 固定的内容一定要变量实现,方便以后更改

         7. 日志的输出

         8. 脚本的传参和函数的传参要区别对待

       

        

       

             

                                  

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

shell 自动化运维 的相关文章

  • 如何从 C 文件更改终端中的目录

    如何从 C 程序更改将在终端上生效的目录 实际上不要告诉 system 函数或 chdir 函数 这些仅适用于 C 中的进程或子 shell 假设我正在从 bash shell 执行一个 C 程序 其进程 ID 为 10223 那么 我可以
  • 如何“grep”连续流?

    可以用吗grep在连续的流中 我的意思是有点tail f
  • 子 shell 何时继承其父 shell 环境?

    什么情况下将shell的环境传递给子shell 子 shell 始终从父 shell 获取所有变量 man bash将描述所有使用子shell的情况 主要是 command command command and command 所谓环境只
  • 在 Ubuntu 上纯粹通过 bash 脚本安装 mysql 5.7

    我想要一个无需任何手动输入即可安装 MySQL 5 7 实例的 bash 脚本 我正在关注数字海洋教程 https www digitalocean com community tutorials how to install mysql
  • 让 Emacs ansiterm 和 Zsh 更好地发挥作用

    我一直在尝试在 emacs 会话中使用 Zsh 而无需 emacs 重新映射所有 Zsh 键 我发现 ansi term 对此非常有效 但是我仍然遇到一些问题 我输出了很多垃圾字符 我可以用以下方法修复它 Setup proper term
  • ANSI 转义码在行尾有奇怪的行为

    重现步骤 考虑以下 shell 命令 echo e e 41mTest nTest2 e 0mTest3 它打印Test并在下一行中Test2具有红色背景 使用 ANSI 转义码 Test2后面直接是Test3这是无色的 行为 第一次执行此
  • 在 shell 脚本中查找和替换

    是否可以使用 shell 在文件中搜索然后替换值 当我安装服务时 我希望能够在配置文件中搜索变量 然后在该值中替换 插入我自己的设置 当然 您可以使用 sed 或 awk 来完成此操作 sed 示例 sed i s Andrew James
  • 列出破折号中当前定义的函数?

    我想列出当前定义的函数dash 有什么办法可以做到这一点吗 我能想到的最接近的是type它可以用来测试一个函数是否存在 但除此之外我很困惑 附 我说的是dash在这里 不是bash or zsh 看看 exec c 似乎没有 没有 表是静态
  • 在 shell 脚本中连接命令字符串

    我正在维护一个现有的 shell 脚本 它将命令分配给 shell 脚本中的变量 例如 MY COMMAND bin command dosomething 然后接下来 它通过执行以下操作将 参数 传递给 MY COMMAND MY ARG
  • Linux shell 脚本:十六进制数字到二进制字符串

    我正在 shell 脚本中寻找一些简单的方法来将十六进制数字转换为 0 和 1 字符的序列 Example 5F gt 01011111 是否有任何命令或简单的方法来完成它 或者我应该为其编写一些开关 echo ibase 16 obase
  • 将“npm run start”的输出写入文件

    我想捕获的输出npm run start在一个文件中 我遇到了大量错误 我想更好地控制如何筛选输出 当我尝试时 npm run start gt log txt 我得到一个非常简短的文件 8 行 其结尾为 34m 39m 90m wdm 3
  • 如何将 bash 脚本的整个输出保存到文件

    我正在尝试将 bash 脚本的整个输出保存到文件中 我目前在代码开头有一个参数 ip 地址 如下所示 bin bash USAGE Usage 0
  • 如何使用 bash 显示具有两个子文件夹的文件夹?

    我通过 Cygwin 使用 bash 我有一个大文件夹 a 有很多子文件夹 b 这些子文件夹各有一个或两个子文件夹 c 我想找到所有有两个子文件夹 c 的子文件夹 b 并输出它们 结构如下 a b1 c1 b2 c1 c2 b3 c1 c2
  • bash 变量中的 Linux 鞭尾/对话框参数错误

    有人可以解释为什么下面的代码不起作用吗 我要疯狂地想找出答案 bin bash TEST M1 1 wire Interface ON echo TEST RESULT dialog title Config Modules State c
  • 给出 5 个参数,但在终端中只得到 3 个参数

    我想将一个文件传递给一个c 程序 如果我在 IDE 中执行此操作 test string string lt test txt return argc 5 但在终端上我刚刚得到argc 3 看来 这是因为 什么是 lt 意思是 我正在使用
  • 在bash中,是否有相当于“错误消息”的东西

    在 perl 中 您可以使用错误消息退出die some msg bash 中是否有等效的单个命令 现在 我正在使用命令来实现这一点 echo some msg exit 1 你可以很容易地自己推出 die echo 1 gt 2 exit
  • 如何在bash中使用jq从变量中包含的json中提取值

    我正在编写一个 bash 脚本 其中存储了一个 json 值 现在我想使用 Jq 提取该 json 中的值 使用的代码是 json val code lyz1To6ZTWClDHSiaeXyxg redirect to http examp
  • 通过powershell运行ADB命令

    所以我尝试通过 powershell 脚本运行一些 ADB 命令 这是我正在尝试做的一个简单示例 adb shell echo in adb shell su root echo you are now root ls cd data da
  • 添加要在给定命令中运行的 .env 变量

    我有一个 env 文件 其中包含如下变量 HELLO world SOMETHING nothing 前几天我发现了这个很棒的脚本 它将这些变量放入当前会话中 所以当我运行这样的东西时 cat env grep v xargs node t
  • 如何使用shell脚本从json字符串中grep特定字段值[重复]

    这个问题在这里已经有答案了 下面是文件中可用的 JSON 字符串 我需要从中提取值status在 shell 脚本中 预期输出 status success 响应 json eventDate null dateProccessed nul

随机推荐

  • linux+live555搭建rtsp服务器

    linux 43 live555搭建rtsp服务器 下载并解压接下来生成Make文件 xff0c 生成需要的文件在live文件夹下make之后会在当前目录下生成mediaServer 文件夹 xff0c 其中有一个live555MediaS
  • Navicat for SQLite 15中文版

    教程 xff1a 1 下载软件压缩包并且解压文件获得安装文件以及文件 2 双击exe文件开始安装并且选择同意用户协议 3 选择软件安装位置 4 软件安装读条中请耐心等待 5 软件安装完成 xff0c 资源地址 xff1a Navicat f
  • ascs 简明开发教程(十八):定时器

    QQ交流群 xff1a 198941541 前面讲过 xff0c ascs支持定时器 xff08 由asio实现 xff09 xff0c socket和object pool都继承自timer对象 xff0c 所以你几乎可以在任意地方使用定
  • 向MySQL数据库中存入json类型数据

    源文章地址 xff1a https www linuxidc com Linux 2017 03 141865 htm 0 说明 因为出于个人项目的需要 xff0c 获取到的数据都是json类型的 xff0c 并且都要存入MySQL数据库中
  • win10安装ElasticSearch,启动闪退问题

    JDK环境原因 xff0c 重新安装一下 xff0c 问题解决
  • JWT生成私钥和公钥

    JWT令牌生成采用非对称加密算法 1 生成密钥证书 下边命令生成密钥证书 xff0c 采用RSA 算法每个证书包含公钥和私钥 keytool genkeypair alias xckey keyalg RSA keypass xuechen
  • 浏览器中Local Storage和Session Storage的区别

    Local Storage xff1a 数量空间没有限制 xff0c 只要硬盘空间较大 xff0c 可以一直存 Session Storage xff1a 是一个会话存储对象 xff0c 在Session Storage中保存的数据只能在同
  • win10 MongoDB启动失败 Error: couldn't connect to server 127.0.0.1:27017, connection attempt faile

    1 我的MongoDB安装路径 2 创建配置文件mongo conf xff0c 文件内容如下 xff1a 数据库路径 dbpath 61 d MongoDB Server 3 4 data 日志输出文件路径 logpath 61 d Mo
  • "docker build"requires exactly 1 argument

    例如运行 xff1a docker build t xc govern center 1 0 SNAPSHOT 后面的这个 前面是有个空格的
  • PyCharm 快捷键

    ctrl 43 alt 43 s xff1a 打开软件设置 ctrl 43 d xff1a 复制当前行代码 shift 43 alt 43 上 下 xff1a 将当前行代码上移或下移 ctrl 43 shift 43 f10 xff1a 运
  • Python进阶

    1 Ubuntu操作系统 Linux主要目录 xff1a xff1a 根目录 bin xff1a 可执行二进制文件的目录 ect xff1a 系统配置文件存放的目录 home xff1a 用户家目录 2 linux命令 查看目录命令 命令说
  • Python+tkinter应用程序设置背景图片

    功能描述 xff1a 设计tkinter应用程序 xff0c 为窗口和组件设置背景图片 参考代码 xff1a 运行效果 xff1a 董付国老师Python系列图书 友情提示 xff1a 不建议购买太多 xff0c 最好先通过京东 当当 天猫
  • git学习

    1 git和svn的区别 svn是集中式版本控制系统 xff0c 版本库是集中放在中央服务器的 xff0c 而工作的时候 xff0c 用的都是自己的电脑 xff0c 所以首先要从中央服务器得到最新的版本 xff0c 然后工作 xff0c 完
  • git常用命令

    1 git下载完后 xff0c 必须要设置签名 xff0c 否则无法提交代码 2 C Users 12131 gitconfig 文件里可以查看到设置的信息 3 签名的作用 xff1a 区分不同操作者身份 xff0c 用户的签名信息在每一个
  • GitHub上 README 增加图片标签

    hey Guys 你可能遇到的GitHub上好的项目都有一个非常棒的README xff0c 其中不乏用到一些非常好看的标签 比如下面这样 xff1a walle fastjson 那我们怎样自己添加一个高大上图片标签呢 xff1f 比如我
  • 树莓派上使用 Gstreamer做视频推流

    树莓派使用Gstreamer进行视频推流 最近在研究如何使用树莓派进行视频推流推送到云端 进行了各种比较尝试后 xff0c 认为使用Gstreamer比较好 xff0c 主要的一点就是想利用Gstreamer的硬件加速 在使用ffmpeg的
  • geoserver jms集群部署

    1 集群节点运行架构图 官网集群介绍 xff1a https docs geoserver org latest en user community jms cluster index html 节点之间通过jms消息通信 xff0c A节
  • linux smb配置 不修改git权限

    root 64 localhost cat etc samba smb conf map archive 61 no map hidden 61 no map read only 61 no map system 61 no store d
  • luogu P1185 绘制二叉树

    题目大意 绘制一棵给定的二叉树 解题思路 模拟即可 代码比较乱 include lt cstdio gt include lt cstdlib gt include lt cstring gt const int MAXN 61 12 第i
  • shell 自动化运维

    1 shell 基础知识 1 shell是一个程序 xff0c 文件路径 xff1a bin bash xff0c 是一个命令解释器 xff0c 所有的linux命令都由它来执行 打开终端 xff0c 就进入了shell交互式命令 2 sh