浅谈Linux中的shell脚本

shell脚本

1)语言分类

高级编程语言主要分为编译型语言和解释型语言

编译型语言

需要把源代码通过编译生成可以执行的文件,才能执行。

编译型语言:

  • C、C++、JAVA、Python、C#...

解释型语言

不需要吧源代码编译生成可执行文件的,就可以直接运行的。

解释型语言:

  • JavaScript(js) 、 typeScript(ts) 、shell...

如果都是10条语句

  • 编译型语言,只有在10条语句都没有语法错的情况下,才能进行编译和运行。
  • 解释型语言,哪怕后面9条语句都是错的,都能运行一条。因为它是一条一条语句解析的。

编译型语言:谁来编译?--->编译器

解释型语言:谁来解释?--->解析器

不管是解析器还是编译器都是一个软件。

2)shell解析器/解析程序

  • /bin/bash
  • /bin/dash
  • /bin/sh

可以在写shell脚本的时候去指定使用哪个解析器去解析脚本

3)shell的脚本文件

扩展名: .sh

一个非常简单的shell脚本

demo.sh

#!/bin/bash #指定这个shell脚本使用/bin/bash解析器进行解析
# #开头的是注释
echo "hello shell" # 输出一句话“hello shell”
  • #!/bin/bash :指定这个shell脚本使用/bin/bash解析器进行解析
  • echo "hello shell" :输出一句话“hello shell”
    • echo :一个命令可以将后面的内容输出

4)运行shell脚本

  • ./shell脚本名

shell里面的语句可以是可执行的命令

  • 命令行所有的可执行命令
  • shell自己的语句

注意:如果使用文本编辑器创建shell脚本,需要注意选择unix模式才行。建议大家用vi/vim写 shell

5)shell的变量

shell的变量是没有类型的概念的。

shell的变量不需要进行定义的,直接用。

怎么创建:

  • 变量名=值
  • 示例: name="zzz" 创建了一个变量 name 并且赋值为 zzz

注意:等号两边不能有空格,等号两边的东西贴贴(贴着等号)

怎么使用:

  • $变量名
    • 示例: $name 表示引用变量 name 的值
  • ${变量名}
    • 示例: ${name} 表示引用变量 name 的值

demo2.sh

#!/bin/bash
name="zzz"
echo $name

6)shell变量分类

  • 自定义变量
LS=`ls`
LS里面存储的就是ls这个命令执行后输出的结果

反撇号(``) :里面可以写任何可以执行的命令

  • 位置变量
    • 指的是传递给shell的参数或者是传递给函数的参数
    • 示例: ./demo.sh 123 abc
    • 在shell里面
      • $0 :表示的就是 ./demo.sh 这个参数
      • $1 :表示的就是 123 这个参数
      • $2 :表示的就是 abc 这个参数
        • ... $9
      • 注意:最多可以获取9个参数,表示为 $9
      • 上述的参数和 main 函数的参数类似
    • $# :表示的是参数的个数(不包含 $0 )
    • $@ :表示的包含所有命令行的参数 $@ 等价于 "$1" "$2" "$3" "$4" "$5" "$6" "$7" "$8" "$9"
    • $* :表示的包含所有的命令行参数 $* 等价于 "$1 $2 $3 $4 $5 $6 $7 $8 $9"
    • $? :表示前面一个命令的退出码(进程退出码,就是 main 函数的返回值、exit(值))
      • $? :一个字节,数据保存范围(0~255)
  • shell的环境变量
    • PATH :保存了可执行文件的默认搜索路径
    • HOME :保存了当前用户的家目录的绝对路径
    • 以上的变量都是已经定义好了的,可以直接用

总结:

  • 赋值:变量名=值
  • 引用:$变量名

7)shell的数组

  • 创建格式:数组名=(值 值 值 值...)
    • 示例: array=(1 2 3 4 5 6 7 8 9) 创建了一个数组并进行赋值
    • 注意:shell的数组并不是用花括号{}括起来的。而是用圆括号(),并且里面是用空格分割元 素,不是逗号。
  • 引用格式:
    • 读引用: ${数组名[下标]} :引用指定与元素
      • 示例: ${array[0]}
      • ${array} :等同于引用第一个元素
        • 示例: ${array}
    • 写引用: 数组名[下标]=值
      • 示例: array[0]=11
    • 引用整个数组: ${数组名[*]} 或者是 $数组名[@]
      • 示例: $array[*] 或者是 $array[@]

8)shell语句

shell文件中的语句可以是

  • 命令行所有的可执行命令
  • shell自己的语句       

read

read:表示从终端输入、接受数据

  • read 变量名1 变量名2

重定向语句

  • 输入重定向: <
    • 命令行的输入请求是通过我们的标准输入设备:键盘...、提交申请
    • 我们可以不从键盘获取,可以把这个输入请求重定向到一个文件,这种情况就叫做:输入重定 向
    • read name #从键盘读取一个数据到name里面
      #我们可以不从键盘输入,可以将输入重定向
      read name < 1.txt #表示从1.txt中获取数据保存到name中
  • 输出重定向: > 或者 >>
    • 命令的输出通过向我们的标准输出设备(终端)
    • 我们可以不输出终端,转而输出到一个文件中,这个就是:输出重定向
    • echo "123" #到终端去了
      #我可以不显示在终端
      echo "123" > 1.txt
      echo "123" >> 1.txt

    • > :表示情况文件内容,重新写入
    • >> :表示从文件末尾增加内容,不会情况,续写

9)expr算术运算语句                

用法:

` expr 操作数 运算符 操作数 ` # 注意要有反撇号才可以 ``

示例:

` expr 10 + 20 `
` expr 20 \* 10 ` # 乘法需要进行转义

注意:乘法运算符 * 是一个元字符,需要进行一个转义之后才能表示它自己。

注意:expr是一条命令,如果要获取计算的结果,需要用到反撇号之后,还需要用一个变量接收

10)test测试

可以测试三类对象 :字符串 整数 文件

1.字符串的测试

  • = :判断是否相等
    • 比较两个字符串是否完全一样,相同为0,不同为1
    • 示例: test "abc" = "abc" 对比结果存放在 $?
      • 结果为0
  • != :判断是否不等
    • 比较两个字符串是否不相同,不同为0,相同为1
    • 示例: test "abc" != "abc"
      • 结果为1
  • -z :判断字符串是否为空
    • 判断字符串是否为空,为空为0,不为空为1
    • 示例: test -z "abc"
      • 结果为1
  • -n : 判断字符串是否不为空
    • 判断字符串是否为空,为空为1,不为空为0
    • 示例: test -n "abc"
    • 结果为0

2.整数的测试

成立返回0,不成立返回1,结果保存在 $?

  • 判断是否相等
    • test 操作数1 -eq 操作数2
      • equal 测试 操作数1 和 操作数2是否相等
  • 判断是否不相等
    • test 操作数1 -ne 操作数2
      • no equal 测试 操作数1 和 操作数2 是否不相等
  • 判断是否大于
    • test 操作数1 -gt 操作数2
      • greater than 测试 操作数1 是否大于 操作数2
  • 判断是否小于
    • test 操作数1 -lt 操作数2
      • less than 测试 操作数1 是否小于 操作数2
  • 判断是否大于等于
    • test 操作数1 -ge 操作数2
      • greater than or equal to 测试 操作数1 是否大于或等于 操作数2
  • 判断是否小于等于
    • test 操作数1 -le 操作数2
      • less than or equal to 测试 操作数1 是否小于或等于 操作数2

11)测试文件

成立返回0,不成立返回1,结果保存在 $?

测试文件的类型

  • test -d 文件名 :表示测试这个文件是不是目录
  • test -f 文件名 :表示测试这个文件是不是普通文件
  • test -L 文件名 :表示测试这个文件是不是链接文件

测试文件的权限

  • test -r 文件名 :表示测试这个文件有没有可读权限
  • test -w 文件名 :表示测试这个文件有没有可写权限
  • test -x 文件名 :表示测试这个文件有没有可执行权限

测试文件的内容

  • test -s 文件名 :测试这个文件是否存在并长度是否不为0
  • test 文件名1 -nt 文件名2
    • -nt : new than/time
    • 测试文件1 是否要新于文件2(文件1是不是要比文件2要新)
  • test 文件名1 -ot 文件名2
    • -ot : old than/time
    • 测试文件1 是否要旧于文件2(文件1是不是要比文件2要旧)

注意: test 有一个更简单的写法,可以用 [] 来代替 test 命令

注意:用 [ ] 代替 test 命令需要注意中括号两边和其他参数中间一定一定一定要有空格,需要保持距 离。

12)结构性语句

1.分支语句

语法:

if 命令 ;then
    语句块1
elif 命令 ;then
    语句块2
else
    语句块3
fi

read filename #从终端接收一个文件的名字
#开始判断
if test -f $filename ;then
    echo "这是一个普通文件"
else
    echo "这是不是一个普通文件"
fi
-----------------------------------
if [ -f $filename ] ; then
    echo "这是一个普通文件"

2.多路分支

case 语法:

case 变量 in
    情况1)
        语句块1
        ;;
    情况2)
        语句块2
        ;;
    情况3)
        语句块3
        ;;
        ...
esac

case 语句和C++中 switch 语句类似, case 的强大之处在于可以使用模糊搜索

模糊搜索/匹配,是指可以使用通配符和正则表达式(支持有限,比如 [] )一般使用 *? ,其实就是去 匹配一个大概。

注意: case 中 ;; 等价于 switch 里面 break ,但是 break 可以省略但是 ;; 不能省略

3.循环语句

for 循环

语法:

for 变量名 in 变量遍历的值
do
    循环体语句
done

也可以写成 C/C++ 语法形式

for((表达式1;表达式2;表达式3))
{
    循环体语句;
}

while 循环

语法:

while 表达式
do
    循环体语句
done

13)shell函数

定义语法:

函数名()
{
    函数体语句;
}

注意: shell 函数是不需要参数列表,也不需要返回值,参数传递使用位置变量实现。

示例代码

sum()
{
    sum=` expr $1 + $2 `
    return $sum
}

函数的调用

函数名 参数1 参数2 参数3 参数4 参数5 ... 参数9
-------
函数名

sum 1 2

注意:函数和外部没有作用域区别的,只要声明过的变量都可以用

注:以上内容均为作者个人见解,若有不正确的地方,还请读者斧正,同时如果对你帮助的话,还请点赞,收藏加关注,你们的支持是我最大的动力!

  • 13
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值