Shell 是一个用 C 语言编写的程序,它是用户使用 Linux 的桥梁。Shell 既是一种命令语言,又是一种程序设计语言。

一、shell脚本

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

(1)shell的环境

Shell 编程跟 JavaScript、php 编程一样,只要有一个能编写代码的文本编辑器和一个能解释执行的脚本解释器就可以了。
Linux 的 Shell 种类众多,常见的有:

  • Bourne Shell(/usr/bin/sh或/bin/sh)
  • Bourne Again Shell(/bin/bash)
  • C Shell(/usr/bin/csh)
  • K Shell(/usr/bin/ksh)
  • Shell for Root(/sbin/sh)
  • ……

    (2)编写规范

    打开文本编辑器(可以使用 vi/vim 命令来创建文件),新建一个文件 test.sh,扩展名为 sh(sh代表shell),扩展名并不影响脚本执行,见名知意就好,如果你用 php 写 shell 脚本,扩展名就用 php 好了。

  • 在一般情况下,人们并不区分 Bourne Shell 和 Bourne Again Shell,所以,像 #!/bin/sh,它同样也可以改为 #!/bin/bash。

  • #! 是一个约定的标记,它告诉系统这个脚本需要什么解释器来执行,即使用哪一种 Shell。

    (3)运行方法

    1、作为可执行程序
    2、作为解释器参数
    **

    二、编写用到的东西

    1、变量

    (1)定义格式

    1. your_name="zmr"

    (2)要求

  • 变量名和等号之间不能有空格,否则会报“your_name: 未找到命令”

  • 命名只能是英文字母,数字和下划线,首个字符不能是数字
  • 不能使用标点符号
  • 不能使用bash里面的关键字(所有语言都是不能使用保留的关键字,否则会引起冲突)

也可以用语句给变量赋值

  1. for file in `ls /etc`
  2. for file in $(ls /etc) //这两句都一样,将/etc目录下的文件名给循环出来

(3)变量的使用
使用一个定义过的变量,只要在变量名前面加美元$符号即可

  1. your_name="zmr"
  2. echo $your_name //第一种,在变量名称前加$符号即可
  3. echo ${your_name} //第二种,用大括号标明变量的名称 ☆推荐☆

(4)只读变量

  1. #!/bin/bash
  2. myUrl="https://www.google.com"
  3. readonly myUrl // readonly 只读
  4. myUrl="https://www.runoob.com" //尝试重新赋值,报错: myUrl: 只读变量

(5)删除变量

  1. #!/bin/sh
  2. myUrl="https://www.google.com"
  3. unset myUrl //unset 删除
  4. echo $myUrl
  • 变量被删除后不能再次使用;
  • unset不能删除只读变量。

(6)变量类型

  • 1) 局部变量 局部变量在脚本或命令中定义,仅在当前shell实例中有效,其他shell启动的程序不能访问局部变量。
  • 2) 环境变量 所有的程序,包括shell启动的程序,都能访问环境变量,有些程序需要环境变量来保证其正常运行。必要的时候shell脚本也可以定义环境变量。
  • 3) shell变量 shell变量是由shell程序设置的特殊变量。shell变量中有一部分是环境变量,有一部分是局部变量,这些变量保证了shell的正常运行

    2、字符串

    字符串是shell编程中最常用最有用的数据类型(除了数字和字符串,也没啥其它类型好用了),字符串可以用单引号,也可以用双引号,也可以不用引号
    (1)单引号
    单引号的限制:

  • 单引号里的任何字符都会原样输出,单引号字符串中的变量是无效的;

  • 单引号字串中不能出现单独一个的单引号(对单引号使用转义符后也不行),但可成对出现,作为字符串拼接使用。

    1. str='这是'+'单引号'

    (2)双引号
    双引号的优点:

  • 双引号里可以有变量

  • 双引号里可以出现转义字符

    1. your_name="zmr"

    (3)拼接字符串

    1. your_name=superman
    2. #双引号拼接
    3. str1="这是双引号hello"${superman}",欸嘿" //这是双引号hello,欸嘿
    4. echo $str1
    5. #单引号拼接
    6. str2='这是单引号hello'${superman}',哈哈' //这是单引号hello,哈哈
    7. echo $str2
    8. str3='${superman}' // ${superman}
    9. echo $str3

    (4)获取字符串的长度

    1. string="abcd"
    2. echo ${#string} //输出 4

    (5)提取子字符串

    1. string="runoob is a great site"
    2. echo ${string:1:4} // 输出 unoo
  • 第一个字符的索引值为 0

(6)查找子字符串

  1. #查找字符 i 或 o 的位置(哪个字母先出现就计算哪个)
  2. string="runoob is a great site"
  3. echo `expr index "$string" io` # 输出 4

image.png

3、shell数组

  • bash支持一维数组,不支持多维数组,不限定数组的大小
  • 数组的下标由0开始,获取数组的元素要利用下标。

(2)数组的定义
数组的定义有三种方式:

  1. 数组名=(值1 2 3 ... n)
  2. 例如:
  3. array=(value0 value1 value2 value3)
  4. 又如:
  5. array=(
  6. value0
  7. value1
  8. value2
  9. value3
  10. )
  11. 还可以:
  12. array[0]=value0
  13. array[1]=value1
  14. ...
  15. array[n]=valuen

可以不使用连续的下标,而且下标的范围没有限制。
(3)数组的读取

  • 获取单个元素

    1. ${数组名[下标]}
    2. 例如:
    3. valuen=${array[n]}
  • 用@获取数组内所有元素

    1. echo ${array[@]}

    (4)获取数组的长度

    1. # 取得数组元素的个数
    2. length=${#array_name[@]}
    3. # 或者
    4. length=${#array_name[*]}
    5. # 取得数组单个元素的长度
    6. lengthn=${#array_name[n]}

    4、注释

    1)单行注释

  • 以 # 开头的行就是注释,会被解释器忽略。

  • 通过每一行加一个 # 号设置多行注释
  • 定义函数:

每一行加个#符号太费力了,可以把这一段要注释的代码用一对花括号括起来,定义成一个函数,没有地方调用这个函数,这块代码就不会执行,达到了和注释一样的效果。
2)多行注释

:<<EOF
注释内容
EOF

EOF 也可以使用其他符号

:<<'
注释内容...
'

:<<!
注释内容...
!



删除

  • 从头开始删除

    ${变量#表达式}        //匹配第一个删除
    ${变量##表达式}        //匹配最后一个删除
    
  • 从尾删除

    ${变量%表达式}        //匹配第一个删除
    ${变量%%表达式}        //匹配最后一个删除
    
  • 从未开始删除,表达式还是从左向右去写。

  • 删除不会再原字符上进行修改,想要修改原字符串只能从新赋值