shell 自动化运维

本文介绍了Linux Shell的基础知识和进阶内容,包括Shell脚本的编写、执行方式、变量类型、表达式、流程控制以及常用命令如sed的使用。讲解了如何进行脚本开发,强调了命名规范、变量赋值、字符串截取和默认值设定。此外,还探讨了流程控制语句、文件表达式和数值比较,以及自动化运维中的代码发布流程、代码仓库和传输代码的方法。

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. 脚本的传参和函数的传参要区别对待

       

        

       

             

                                  

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值