Shell 脚本入门
目录
一、Shell是什么
1.1 我们为什么要学习Shell和使用Shell?
1.2 Shell的分类有哪些?
二、Shell脚本入门知识
2.1 Shell文件命名规范
2.2 Shell解析器
2.3 用Shell 编写hello World
三、Shell的四种变量类型
3.1 系统预定义变量
3.2 自定义变量
3.3 只读变量和撤销变量
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(具体是哪个数字,由命令自己决定),则证明上面命令不正确了
例如下面这个例子: