自学内容网 自学内容网

LInux shell编程之基础语法

目录

1、shell概述

1.1、查看Linux 提供的 Shell 解析器

1.2、bash 和 sh 的关系

1.3、查看系统(centos)默认使用的解释器

2、脚本的基础使用

2.1、脚本的格式

2.2、脚本的执行方式

方式一:采用 bash / sh + 脚本的相对路径或绝对路径(脚本无需可执行( +x )权限)

2.2.1、bash + 脚本的相对路径

2.2.2、bash + 脚本的绝对路径

方式二:直接输入脚本的绝对路径或相对路径执行脚本(要求脚本必须具有可执行权限+x)

2.2.3、给目标文件 tesh.sh 添加可执行权限

2.2.4、使用相对路径执行脚本

2.2.5、使用绝对路径执行脚本

方式三:在脚本的路径前加上“.”或者 source 执行脚本

2.3、Linux 中的单引号、双引号、反引号

2.3.1、单引号

2.3.2、双引号

2.3.3、反引号

3、变量

3.1、系统预定义变量

3.2、自定义变量

3.2.1、基本语法

3.2.2、变量定义规则

3.3、特殊变量

3.3.1、$n

3.3.2、$#

3.3.3、$* 与 $@

3.3.4、$?

1、shell概述

  • shell 是一个命令解释器,它接收应用程序/控制台命令。然后调用操作系统内核
  • shell 是一个功能强大的编程(脚本)语言,易编写、易调试、灵活性强

1.1、查看Linux 提供的 Shell 解析器

  • 命令:cat /etc/shells

1.2、bash 和 sh 的关系

  • 命令:ls -l /bin/sh

1.3、查看系统(centos)默认使用的解释器

  • 命令:echo $SHELL

2、脚本的基础使用

2.1、脚本的格式

  • shell 脚本一般已 .sh 后缀命名以示区别
  • shell 脚本内容以 #!/bin/bash 或 #!/bin/sh 开头 (指定解释器)

2.2、脚本的执行方式

方式一:采用 bash / sh + 脚本的相对路径或绝对路径(脚本无需可执行( +x )权限)

  • 说明:本质是 bash 解析器帮你执行脚本,所以脚本本身不需要执行 权限
2.2.1、bash + 脚本的相对路径
  • 命令:bash test.sh 或 bash ./test.sh 等价于 sh test.sh 或 sh ./test.sh

2.2.2、bash + 脚本的绝对路径
  • 命令:bash /home/testhadoop/test/scripts/test.sh 或 sh /home/testhadoop/test/scripts/test.sh

方式二:直接输入脚本的绝对路径或相对路径执行脚本(要求脚本必须具有可执行权限+x)

  • 说明:本质是脚本需要自己执行,所以需要执行权限。
2.2.3、给目标文件 tesh.sh 添加可执行权限
  • 命令:chmod +x test.sh 或者 chmod 755 test.sh

2.2.4、使用相对路径执行脚本
  • 命令:./test.sh
  • 注意:使用相对路径执行只能使用 ./test.sh 的方式执行,直接使用 test.sh 不能执行 ,因为test.sh 并没有添加到环境变量PATH里面,所以不能执行。

2.2.5、使用绝对路径执行脚本
  • 命令:/home/testhadoop/test/scripts/test.sh

方式三:在脚本的路径前加上“.”或者 source 执行脚本

  • 命令: . test2.sh 或 source test2.sh

现象:

  • 可以看出使用方式一和方式二执行,执行完成后在当前shell下使用命令:echo $test_var 得到变量test_var的值为空,而使用方式三执行脚本,执行完成后,可在当前的shell下获取到变量test_var的值。

原因:

  • 方式一和方式二,在当前的shell中打开了一个子shell来执行脚本内容,脚本执行结束,子shell关闭,回到父shell中(即当前的shell中)
  • 方式三,执行脚本是直接在当前的shell中执行的,没有开启子shell进程,这也是为什么我们每次在修改完/etc/profile 文件以后,需要使用 source 执行一下文件的原因。

区别:

  • 开子 shell进程 与不开子 shell 进程的区别就在于,环境变量的继承关系,子shell进程可以继承父shell进程的变量,而父shell进程不可见子shell进程的变量。
  • 注意:修改变量值只对当前shell以及其子shell生效,对父shell之上的层级不生效,包括修改全局变量。

2.3、Linux 中的单引号、双引号、反引号

2.3.1、单引号

说明:单引号属于强引用,它会忽略所有被引起来的字符的特殊处理,被引用起来的字符会被原封不动的使用,需要注意的是它不允许引用自身,即单引号内部不允许嵌套单引号。

单引号把其中的内容全部当做字符串处理,忽略内部所有的命令和特殊字符。

示例:

2.3.2、双引号

说明:双引号属于弱引用,它会对一些被引起来的字符进行特殊处理。

区别:双引号与单引号的区别在于其可以包含特殊字符(单引号直接输出内部字符串,不解析特殊字符;双引号内则会解析特殊字符);如果要忽略特殊字符,就可以利用\来转义,忽略特殊字符,作为普通字符输出。

示例:

2.3.3、反引号

说明:用来包含一个命令字符串,其中的命令会先执行,得到的结果会返回到当前层其他命令再执行;其作用与$(command)类似。

示例:遍历当前文件夹及其一级子文件夹的详细信息

3、变量

变量分类:

根据变量使用范围分为:

  • 全局变量
  • 局部变量

根据定义类型分为:

  • 系统变量
  • 自定义变量

3.1、系统预定义变量

1、常用系统变量

  • PATH、HOME、SHELL、USER
  • 注意:系统变量都是大写,自定义变量大小写不做要求,一般是小写。

2、常用操作

(1)查看系统变量的值

  • 方式:$系统变量名

如:查看系统变量HOME的值

  • echo $HOME

(2) 查看系统环境变量

  • 命令:env

(3) 查看当前shell中所有的变量,包括临时变量、自定义变量

  • 命令:set

3.2、自定义变量

3.2.1、基本语法

  • 定义变量:变量名=变量值;注意:=号前后不能有空格
  • 撤销/删除变量:unset 变量名
  • 声明静态变量:readonly 变量名; 注意:不能使用unset删除
  • 把局部变量变成全局变量:export 变量名

3.2.2、变量定义规则

  • 命名只能使用英文字母,数字和下划线,首个字符不能以数字开头;环境变量建议全部大写
  • 中间不能有空格,可以使用下划线_
  • 不能使用标点符号
  • 不能使用bash里的关键字(可以用help命令查看保留关键字)
  • 等号两侧不能有空格
  • 在 bash 中,变量默认类型都是字符串类型,无法直接进行数值运算
  • 变量的值如果有空格,需要使用双引号或单引号括起来

3.3、特殊变量

3.3.1、$n

功能描述:n 为数字,$0 代表该脚本名称,$1-$9 代表第一到第九个参数,超过十个以 上的参数,需要用大括号包含,如${10}。

示例:

3.3.2、$#

功能描述:获取所有输入参数个数,常用于循环,判断参数的个数是否正确以及 加强脚本的健壮性

示例:

3.3.3、$* 与 $@

$* 功能描述:代表命令行中所有的参数,$* 不被双引号“”包含时,把每个参数单独区分,可对每个参数进行遍历;被双引号“”包含时,把所有的参数看成一个整体

$@ 功能描述:代表命令行中所有的参数,$@ 把每个参数单独区分,可对每个参数进行遍历

示例:

3.3.4、$?

功能描述:查看最后一次执行的命令的返回状态。

  • 如果这个变量的值为 0,证明上一 个命令正确执行;
  • 如果这个变量的值为非 0(具体值,由命令自己来决定),则证明 上一个命令执行有误。

示例:


原文地址:https://blog.csdn.net/lIujunXHU/article/details/137877442

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!