Linux命令和Shell命令的区别

Shell翻译成壳的意思,它是包裹在Linux内核外层的,一个通过一些列的Linux命令对操作系统发出相关指令的人机界面。Shell可以通过其条件语句和循环语句等,把一些列Linux命令结合在一起,形成一个相当于面向过程的程序,即 Shell Script,来实现一些较为复杂的功能。

总括,Shell是Linux命令的概称,是属于命令行的人机界面。Shell是一个用C语言编写的程序,它是用户使用Linux的桥梁。Shell既是一种命令指令语言,也是一种面向过程的程序设计语言。

0. hello word

  1. #!/bin/bash
  2. #
  3. # Author: yonglong.wyl
  4. # Data: 2021/06/02
  5. # Email: yonglong.wyl@alibaba-inc.com
  6. # 参考:https://www.runoob.com/linux/linux-shell-variable.html
  7. # first hello world, save file as "hello.sh"
  8. echo "Hello World!"
  9. # chmod +x ./hello.sh #添加权限
  10. # ./hello.sh #执行脚本

1. 变量

  1. # 1.1 定义变量,不添加$,引用变量添加$
  2. your_name="yonglong.wyl"
  3. #1.2.1 引用变量:$+变量名
  4. echo $your_name
  5. # 1.2.2 引用变量:$+{变量名}
  6. echo "my name: ${your_name}"
  7. # 1.3 变量重新赋值
  8. your_name="longmang"
  9. # 1.3.1 定义只读变量不可以重新赋值
  10. readonly my_url="https://www.runoob.com"
  11. # my_url="https://www.baidu.com" # 运行脚本出错:This variable is read only.
  12. # 1.4 删除变量:unset 变量名
  13. var_name="will delete"
  14. echo $var_name
  15. unset var_name
  16. echo $var_name #什么都打印不出来
  17. # 1.5 变量类型:局部变量、环境变量、shell变量
  18. # 1.5.1 局部变量(local variable):local 变量名
  19. function fun_a(){
  20. local a=99
  21. b=100
  22. }
  23. fun_a # 调用变量
  24. echo $a # 什么都没输出,函数外无定义,无内容输出
  25. # 1.5.1.1 不使用local 关键字限制,变量作用域也是全局的
  26. echo $b # 输出:100

1.5.2 全局变量

  • 所谓全局变量,就是指变量在当前整个shell进程中都有效。
  • shell中定义的变量,默认就是全局变量。
  • 全局变量的作用域是当前shell进程,而不是当前的shell文件。新开终端窗口就是新的进程

文件:a.sh

  1. #!/bin/bash
  2. echo $a
  3. b=200

文件:b.sh

  1. #!/bin/bash
  2. echo $b

Shell窗口运行:

  1. a=99
  2. ./a.sh # 99
  3. ./b.sh # 200

三条命令都在一个shell进程中执行,在命令行定义的a,在a文件中可以打印出来99,在a文件中定义的变量b,在运行b文件时可以打印出来,变量的作用域范围已经超出了文件范围

1.6 环境变量

全局变量只在当前shell进程中有效,如果使用 export 命令将全局变量到处,那么它就在所有的子进程中也有效了,称为“环境变量”。
由此可见,变量作用域范围:环境变量 > 全局变量 > 局部变量

  1. a=22 # 定义一个全局变量a
  2. echo $a # 在当前Shell中输出a,成功:22
  3. bash # 进入Shell子进程
  4. echo $a # 在子进程中输出a,失败:无结果
  5. exit # 退出Shell子进程,返回上一级Shell
  6. export a # 将a导出为环境变量
  7. bash # 开启并进入一个新子进程
  8. echo $a # 在子进程中再次输出a,成功:22 ## 默认的系统Shell命令配置中定义了很多环境变量,所以在进入时就具有了环境变量的值
  9. exit #退出子进程

默认的系统Shell命令配置中定义了很多环境变量,所以在进入时就具有了环境变量的值

2. 字符串

  1. # 定义字符串可以单引号,也可以双引号
  2. str1='this is a string'
  3. str2="this is an another string"
  4. # 单引号的任何字符都会原样输出,单引号字符串中的变量是无效的
  5. echo 'str1:${str1}'
  6. # 双引号里可以有变量
  7. echo "str1:${str1}"
  8. # 双引号里可以出现转义字符
  9. echo "str1:\"$str1\" \n"
  10. # 计算变量字符长度
  11. echo "your_name length: ${#your_name}"
  12. # 字符串截取/提取
  13. echo "subStr1,4: ${your_name:1:4}"
  14. #查找子字符串
  15. echo `expr index ${str1} i` # 输出2

3. 数组

Bash Shell 只支持一维数组(不支持多维数组),初始化时不需要定义数组大小。
定义数组用括号来表示,数组元素用 空格 符号来分隔

  1. # 定义数组,元素之间使用空格分隔
  2. array_name=(a "b" c) # 字符是否使用引号都可
  3. # 引用数组元素
  4. echo $array_name[0] #输出:a
  5. # 显示所有数据元素,使用: @ or *
  6. echo ${array_name[@]} #输出:a b c
  7. echo ${array_name[*]} #输出:a b c
  8. # 显示数据长度
  9. echo ${#array_name[@]} #输出:3
  10. echo ${#array_name[*]} #输出: 3
  11. # 取得单个元素的长度
  12. echo ${#array_name[0]} #输出:1

4. 注释

4.1 # 开头就是注释,会被解释器忽略

  1. #--------------------------------------------
  2. # 这是一个注释
  3. # author:菜鸟教程
  4. # site:www.runoob.com
  5. # slogan:学的不仅是技术,更是梦想!
  6. #--------------------------------------------
  7. ##### 用户配置区 开始 #####
  8. #
  9. #
  10. # 这里可以添加脚本描述信息
  11. #
  12. #
  13. ##### 用户配置区 结束 #####

4.2 多行注释

  1. :<<EOF
  2. 注释内容...
  3. 注释内容...
  4. 注释内容...
  5. EOF
  1. # :<< + 单引号
  2. :<<'
  3. 注释内容...
  4. 注释内容...
  5. 注释内容...
  6. '
  1. # :<< + 叹号
  2. :<<!
  3. 注释内容...
  4. 注释内容...
  5. 注释内容...
  6. !