目录
[1.1 我们为什么要学习Shell和使用Shell?](#1.1 我们为什么要学习Shell和使用Shell?)
[1.2 Shell的分类有哪些?](#1.2 Shell的分类有哪些?)
[2.1 Shell文件命名规范](#2.1 Shell文件命名规范)
[2.2 Shell解析器](#2.2 Shell解析器)
[2.3 用Shell 编写hello World](#2.3 用Shell 编写hello World)
[3.1 系统预定义变量](#3.1 系统预定义变量)
[3.2 自定义变量](#3.2 自定义变量)
[3.3 只读变量和撤销变量](#3.3 只读变量和撤销变量)
[3.4 特殊变量](#3.4 特殊变量)
一、Shell是什么
1.1 我们为什么要学习Shell和使用Shell?
Shell 是一个用 C 语言编写的程序,它是用户使用 Linux 的桥梁。
Shell 既是一种命令语言,又是一种程序设计语言
Shell 是指一种应用程序,这个应用程序提供了一个界面,用户通过这个界面访问操作系统内核的服务
Shell属于内置的脚本,程序开发的效率非常高,依赖于功能强大的命令可以迅速地完成开发任务(批处理)语法简单,代码写起来比较轻松,简单易学(运维人员)
1.2 Shell的分类有哪些?
在linux中有很多类型的shell,不同的shell具备不同的功能,shell还决定了脚本中函数的语法,Linux中默认的shell是 /bash/shell ( 重点\默认 ),流行的还有 /bin/sh 、 /bin/bash 、 /usr/bin/sh 、 /usr/bin/bash 、 /bin/tcsh 、 /bin/csh
查看流行的shell使用以下指令:
cat /etc/shells
可以看到由以上类型的流行Shell
那么如何查看系统使用的Shell呢,使用以下指令即可:
echo $SHELL
可以看到我们系统使用的shell是/bin/bash类型的
二、Shell脚本入门知识
2.1 Shell文件命名规范
bash shell的默认后缀为 .sh
2.2 Shell解析器
#!/bin/bash
上面一行指定当前系统这个脚本要使用的shell解释器是/bin/bash
2.3 用Shell 编写hello World
首先来创建一个目录scripts来存放shell脚本
mkdir scripts
然后创建Shell文件
touch hello.sh
hello.sh文件的内容
#!/bin/bash
echo "Hello World!"
执行文件有三种方式
bash ./hello.sh #不需要加权限
sh ./hello.sh #不需要加权限
./hello.sh #需要加权限
如果是第三种方式运行需要加权限,使用以下命令即可
chmod +x hello.sh
三、Shell的四种变量类型
变量本质上其实是在内存中开辟一个空间用来临时存储数据,例如: age = 20
全局变量和局部变量的区别
- 全局变量:层层嵌套的子bash依然可以访问
- 局部变量:只在当前的bash中可以访问,子bash和父bash都不能访问呢
3.1 系统预定义变量
常用系统变量
HOME,PWD,SHELL,USER
env命令查看当前所有的全局变量
set查看当前所有变量
明显比env命令后得到的变量要多!
3.2 自定义变量
基本语法
定义变量:变量名=变量值
规则
- 等号前后不能有空格
- 在声明变量的时候是不需要添加 $ 符号,但是使用时候需要添加
- 如果定义的是一个字符串,需要将值添加双引号或者单引号
温馨提示
查看定义的变量是全局还是局部
- 全局: env | grep 变量名
- 局部: set | grep 变量名
当然,你可以进入子bash中去尝试输出变量,无法输出则是局部变量,可以输出则是全局变量
全局变量如何定义一个全局变量呢?需要先声明一个局部变量,然后再通过export 导出为一个全局变量
在子bash中修改全局变量,只会再当前环境中生效,不会影响父bash环境,哪怕是你增加 export 也依然不会影响到父bash环境
Shell脚本中使用变量我们可以在 hello.sh 的脚本中去调用全局和局部变量
export 变量名
txt=10
export txt
#!/bin/bash
echo $txt
在shell脚本中使用变量,同样遵循全局和局部变量的规则
3.3 只读变量和撤销变量
只读变量
在shell中,只读变量相当于是常量,定义之后不允许修改。
定义规则
readonly 变量名=值
撤销变量
变量定义之后是可以撤销的,使用 unset 变量名 就可以撤销了
变量是可以撤销的,但是只读变量是不可以撤销的
3.4 特殊变量
在Shell中,存在一些特殊变量,他们具有特殊的意义
$n
$n 代表接受参数, n 是数字,代表在执行脚本时候传递的参数数量,例如 $1-$9 代表第一个到第九个参数,十以上的数字,可以使用大括号包裹,例如 ${10} 。比较特殊的是 $0 ,代表当前脚本名称
如下面这个例子n_test.sh:
#!/bin/bash
echo "=====$n====="
echo "1st:" $1
echo "2st:" $2
echo "3st:" $3
echo $0
注意:$0代表是该脚本的文件名
$#
$# 获取输入参数的个数,一般用于循环中,判断参数的个数是否正确,加强脚本的健壮性
例如下面这个例子:
#!/bin/bash
echo "=====$#====="
echo 1st:$1
echo 2st:$2
echo 3st:$3
echo $#
$* 和 $@
$* 和 $@ 非常相似,都代表命令行所有的参数,但是 $* 把参数看成是一个整体,例如 123 456 。而 $@ 把每个参数区分对待,例如 [123,456]
注意:在没有循环遍历时候,两者效果一致
例如下面这个例子:
#!/bin/bash
echo '=====$n====='
echo 1st:$1
echo 2st:$2
echo 3st:$3
echo '=====$*====='
echo $*
echo '=====$@====='
echo $@
$?
$? 最后一次执行命令的状态,如果是结果是0,证明上面执行的命令都是正确的,如果结果不是0(具体是哪个数字,由命令自己决定),则证明上面命令不正确了
例如下面这个例子: