10分钟的shell脚本介绍

电脑杂谈  发布时间:2020-03-24 11:26:12  来源:网络整理

shell 编程 for_shell 编程 if_shell 编程 for

撰写本文是对我自己的学习和使用的总结. 写作不是很好. 如有任何疑问,请沟通.

Github地址:

Shell指的是应用程序. 该应用程序提供了一个接口,用户可以通过该接口访问操作系统内核的服务. Shell脚本是为Shell编写的脚本程序. 我们经常说的shell通常是一个shell脚本.

Shell与Java,php,Python编程相同,只要您具有可以编写代码的文本编辑器和可以解释和执行的脚本解释器即可.

Mac OS,Linux带有外壳解释器,Windows则比较麻烦,因为Win7 Professional和Ultimate版本默认情况下安装了PowerShell,而Standard和Home版本中没有安装. 为了方便起见,建议安装cygwin

PHP和Python是高级编程语言,但是您也可以执行Shell编程,只要您拥有解释器shell 编程 for,您就可以将其用作脚本编程

以下是Python Shell脚本的示例(假设文件名为op_python_base.py):

#!/usr/bin/env python3 //告诉Python从系统环境中找python
# -*- coding: utf-8 -*- //设置为UTF-8编码
for index in range(10):
    print(index);

来源: op_python_base

以下是一个PHP Shell脚本示例(假设文件名为op_php_base.php):

#!/usr/bin/php
<?php
for($i=0 ;$i<10; $i++){
    echo $i;
}
?>

来源: op_php_base

由于PHP和Python均可用于脚本编写,因此为什么要学习奇怪而晦涩的Shell?原因有很多.

sh: Bourne shell,POSIX(操作系统接口)标准的shell解释器,其二进制文件路径通常为/ bin / sh

bash: Bash是Bourne shell的替代产品,属于GNU工程. 二进制文件路径通常是/ bin / bash

我相信已经编写了代码的童鞋应该熟悉以下代码,而不是陌生的(假设文件名为op_base.sh):

#!/usr/bin/env bash
mkdir code
cd  code
for ((i=0; i<3; i++)); do
    touch test_${i}.txt
    echo "shell很简单" >> test_${i}.txt
done

第一行: 从系统路径中找到指定脚本的解释器

第二行: 创建一个名为code的文件夹

第三行: 输入创建的文件夹

shell 编程 for_shell 编程 if_shell 编程 for

第四行: 循环3次

第四行: 创建一个文件

第五行: 将信息写入创建的文件

第6行: 结束循环

mkdir,touch,cd,touch,echo都是系统命令,可以直接从命令行执行.

for,do,done是shell脚本语言中for循环的语法

来源: op_base.sh

创建一个扩展名为sh的新文件(sh代表shell). 该扩展名不会影响脚本的执行. 很高兴知道这个名字. 如果使用php,则扩展名为php. 如果您使用Python,则扩展名为python

第一行如下:

#!/usr/bin/php
#!/usr/bin/env python3
#!/usr/bin/env bash

#! ”是一个约定标记,它告诉系统该脚本需要执行什么解释器.

/ env是系统的PATH目录查找

chmod +x op_base.sh
./op_base.sh

第一行设置op_base.sh的可执行权限

第二行执行op_base.sh

/bin/sh op_base.sh

定义变量时,无需在变量名称前添加符号. 与Python相同,但是您需要在PHP中添加一个变量.

my_name="jack"
my_name='jack';

ps: 变量名和等号之间不能有空格,并且变量后不能有空格;

Shell引用类似于PHP. 字符串可以单引号或双引号.

shell 编程 if_shell 编程 for_shell 编程 for

单引号字符串的限制:

单引号中的任何字符都将按原样输出shell 编程 for,单引号字符串中的变量无效

单引号不能出现在单引号中(即使在对单引号使用转义字符之后也是如此

双引号:

双引号中可以包含变量

转义字符可以用双引号引起来

但是Python中单引号和双引号之间没有区别,但是Python也有三个引号,并且三个引号内的字符也不会转义

对于已定义的变量,适合在它们前面添加它们,例如: ¨G6Gps: 变量名和等号之间不能有空格,并且变量后不能有空格. 引号或双引号单引号字符串限制:

  • 单引号字符的任何引号将按原样输出,单引号字符串中的变量无效
  • 单引号字符不能出现单引号在字符串中(即使在对单引号使用转义符 后也使用双引号:
    • 双引号可以包含变量
    • 双引号可以出现转义符 但是在Python中单引号和双引号之间没有区别,但是在Python中又有三个引号,并且三个引号内的字符也不会转义. K44K用于已定义的Used变量,适合在前面添加

      echo $my_name
      echo ${my_name}

      变量名外的花括号是可选的. 可以添加或不添加. 建议使用第二种形式.

      以“#”开头的行是注释,解释器将忽略它们.

      sh中没有多行注释,您只能在每行中添加#号. 就是这样:

      #--------------------------------------------
      # Author:  jack 
      #
      # Notes: 10分钟入门Shell脚本编程
      #
      # Project home page:
      #       https://github.com/hi-dhl/fast_guides
      #--------------------------------------------

      字符串可以是单引号还是双引号. 单引号和双引号之间的区别类似于PHP

      与其他语言不同,Shell具有php和python. 有许多数据类型. Shell中常用的数据类型是字符串数字和字符串. (ps: 除了数字和字符串之外,没有其他易于使用的了,哈哈)

      单引号字符串的限制:

      单引号中的任何字符都将按原样输出,单引号字符串中的变量无效

      单引号不能出现在单引号中(即使在对单引号使用转义字符之后也是如此

      双引号:

      双引号中可以包含变量

      shell 编程 for_shell 编程 if_shell 编程 for

      转义字符可以用双引号引起来

      my_name="jack";
      my_age="20岁"
      echo $my_name $my_age
      echo $my_name$my_age
      echo ${#my_name}
      echo ${my_name:0:2}

      来源: op_str.sh

      在外壳中,括号用于表示数组,并且数组元素由“空格”符号分隔. 定义数组的一般形式是:

      name=(name1 name2 name3)

      您还可以分别定义数组的每个组件:

      ary[0]=name1
      ary[1]=name2
      ary[3]=name3

      ps: 可以省略连续的下标,并且下标的范围不受限制.

      读取数组元素值的一般格式为:

      ${数组名[下标]}

      示例:

      echo ${name[0]}

      使用@符号获取数组中的所有元素,例如:

      echo ${name[@]}

      获取数组长度的方法与获取字符串长度的方法相同,例如:

      # 取得数组元素的个数
      length=${#name[@]}
      echo $length
      # 或者
      length=${#name[*]}
      echo $length
      # 取得数组单个元素的长度
      lengthn=${#name[n]}
      echo $length

      来源: op_arry.sh

      与Java,PHP和Python等语言不同,sh的流控制不能为空,例如(以下是PHP流控制编写方法):

      <?php
      if (isset($_GET["q"])) {
          search(q);
      }
      else {
          // 不做任何事情
      }

      这在sh / bash中是不可能的. 如果else分支没有要执行的语句,请不要编写else

      shell 编程 for_shell 编程 if_shell 编程 for

      if condition1
      then
          command1
      elif condition2 
      then 
          command2
      else
          commandN
      fi

      示例:

      #!/usr/bin/env bash
      a=1
      b=2
      if [ $a == $b ]
          then
              echo "a 等于 b"
       elif [ $a -gt $b ]
          then
              echo "a 大于 b"
       elif [ $a -lt $b ]
          then
              echo "a 小于 b"
       else
          echo "没有符合的条件"
       fi

      来源: op_if.sh

      Shell的for循环类似于Python

      for index in 1,2,3,4,5:
          print(index);
      for index in 1 2 3 4 5; do
          echo "index="$index
      done
      for ((i=0; i<5; i++)); do
          echo "i="$i
      done

      来源: op_for.sh

      The

      while循环用于连续执行一系列命令,并从输入文件中读取数据;这些命令通常是测试条件.

      int=1
      while(( $int<=5 ))
      do
          echo $int
          let "int++"
      done

      来源: op_while.sh

      The

      sh脚本与系统命令结合使用具有强大的功能. 在字符处理领域,有三位剑客: grep,awk和sed. grep负责查找特定行. Awk可以将行分成多个字段. Sed是可以执行写入操作,例如更新,插入和删除.

      path=/var/log
      log=${path}/httpd-mysql.log
      name=(apache mysql)
      exs_init[0]="service httpd start"
      exs_init[1]="/etc/init.d/mysqld restart"
      for ((i=0; i<2; i++)); do
          echo "检查${name[i]}进程是否存在"
          ps -ef|grep ${name[i]} |grep -v grep
          if [ $? -eq 0 ]; then
              pid=$(pgrep -f ${name[i]})
              echo "`date +"%Y-%m-%d %H:%M:%S"` ${name[$i]} is running with pid $pid" >> ${log}
           else
              $(${exs_init[i]})
              echo "`date +"%Y-%m-%d %H:%M:%S"` ${name[$i]} start success" >> ${log}
          fi
      done

      说明: 检查nginx和mysql进程是否存在,如果不存在,它们将自动重启.

      该脚本将在您每次运行时写入日志. 如果可以,您可以检查日志文件. 如果该过程不经常存在,恐怕要调查根本原因.

      来源: check_nginx.sh

      crontab -e

      在文件末尾添加一行:

      */5 * * * * /xxx/check_nginx.sh > /dev/null 2>&1

      上面的意思是每5分钟执行一次脚本/xxx/check_nginx.sh,其中xxx代表路径

      / dev / null 2>&1表示此shell命令不会将任何信息输出到控制台,也不会将任何信息输出到文件.

      # For details see man 4 crontabs
      # Example of job definition:
      # .---------------- minute (0 - 59)
      # |  .------------- hour (0 - 23)
      # |  |  .---------- day of month (1 - 31)
      # |  |  |  .------- month (1 - 12) OR jan,feb,mar,apr ...
      # |  |  |  |  .---- day of week (0 - 6) (Sunday=0 or 7) OR sun,mon,tue,wed,thu,fri,sat
      # |  |  |  |  |
      # *  *  *  *  * command to be executed


      本文来自电脑杂谈,转载请注明本文网址:
      https://www.pc-fly.com/a/jisuanjixue/article-150557-1.html

    相关阅读
      发表评论  请自觉遵守互联网相关的政策法规,严禁发布、暴力、反动的言论

      热点图片
      拼命载入中...