Shell概述
Shell是命令行解释器,可以接收应用程序或用户的命令,然后调用操作系统内核。同时Shell也是一门强大的编程语言,易编写、易调试、灵活性强。
查看系统支持的解析器
shell的解析器存放在/etc/shells
目录
cat /etc/shells
下图为centos的shell解析器
下图为macos的shell解析器
Redha 通常使用bash
Debian系linux发行版通常使用dash
查看当前系统使用的默认shell实现
echo $SHELL
centos的默认shell为bash
macos的默认shell为zsh
使用环境变量的软连接查看默认shell
ls -l /bin/ | grep bash
shell的后缀名
一般为.sh
,实际上shell解析脚本是与后缀名无关的,只要文本内容符合脚本格式就可以被解析。
开始编写脚本
创建一个存放脚本的目录(我创建在了root目录下),并进入到该目录
mkdir shell-demo
cd shell-demo
使用vim创建并编辑脚本文件
vim hello.sh
按i
键盘进入编辑模式,输入如下内容
#!/bin/bash
echo "hello word"
保存
按Esc
->Shift
+;
(实际上是:
)->wq
->Enter
运行脚本
脚本的运行方式一(bash或sh执行脚本文件)
使用bash或sh + 脚本的相对路径或绝对路径(该方式无需给脚本授权+x)
sh+脚本的相对路径
sh ./hello.sh
sh+脚本的绝对路径
sh /root/shell-demo/hello.sh
bash + 脚本的相对路径
bash ./hello.sh
bash + 脚本的绝对路径
bash /root/shell-demo/hello.sh
脚本的运行方式二(直接运行脚本文件)
直接运行脚本文件需要给脚本文件赋予+x权限
授权
chmod +x hello.sh
脚本的相对路径执行脚本
./hello.sh
脚本的绝对路径执行脚本
/root/shell-demo/hello.sh
在脚本目录是否可以使用
hello.sh
执行脚本呢!
不可以,因为这样会将hello.sh解析成命令,但是如果将该脚本放入/bin
或者/sbin
(系统环境变量中)目录就可以被执行。
脚本的运行方式三(脚本路径前加 .
或者 source
)
source
source hello.sh
source /root/shell-demo/hello.sh
.
. hello.sh
. /root/shell-demo/hello.sh
几中方式使用的命令区别
使用type
命令可以查询命令来源
关于父子shell
bash和sh都是在当前shell中打开一个子shell来执行脚本内容,当执行完毕后会关闭子shell。
source和.可以使脚本内容在当前shell里执行,当需要修改/etc/profile文件时,要使用source来执行才会生效。
打开子shell与不打开子shell的区别在于,环境变量的继承关系不同,如在子shell中设置的当前变量,父shell是不可见的。
变量
系统预定义变量
PWD、USER等
使用echo
命令输出
查看当前Shell中所有变量
set
查看系统中全局环境变量
env
自定义变量
基本语法
- 定义变量
变量名=变量值
,注意:=
的前后不能有空格 - 撤销变量
unset 变量名
- 声明静态变量
readonly 变量
,注意:静态变量不能unset
变量定义规则
- 变量名称可以由
字母
、数字
、和下划线
组成,但不可以以数字
开头,同城环境变量名使用大写 - 等号两侧不能有
空格
- 在bash中,变量默认类型都是字符串类型,无法直接进行数值运算
- 变量的值如果有空格,需要使用
双引号
或单引号包
裹
export将局部变量转为系统全局变量
子shell可以取到变量值
特殊变量
$n
$n
变量描述:n是数字占位符,用具体的数字替换n。
$0
代笔该脚本的名称
$1-$9
代表第一到带九个参数
${10}
代表十以上的参数
$#
变量描述:获取所有输入参数个数,常用于循环,判断参数的个数是否正确
$*
变量描述:代表命令行中所有参数,$*
会将参数作为一个整体
$@
变量描述:代表命令行中所有参数,$@
会把每一个参数都分开,相当于是所有参数的集合
$?
变量描述:最后一次执行命令的返回状态。如果这个变量的值为0,证明上一个命令执行正确;如果这个变量的值为非0(具体的值由上一个命令决定),说明上一个命令执行异常
练习
vim params.sh
单引号字符串不会将$解析为变量
#!/bin/bash
echo '$n练习'
echo 脚本名称: $0
echo 第一个参数 $1
echo 第二个参数 $2
echo '$#练习'
echo 参数的总数 $#
echo '$*练习'
echo $*
echo '$@练习'
echo $@
+x
授权
chmod +x params.sh
运行脚本,不传参
./params.sh
运行脚本,传参
./params.sh p1 p2 p3
运算符
写法
$((运算表达式))
或 $[运算表达式]
练习
计算(1 + 2) * 2
编写一个求两个数和的脚本
vim sun.sh
#!/bin/bash
echo $[$1 + $2 ]
chmod +x sum.sh
bash sum.sh 1 1
条件判断
语法一
test condition
使用 $?
查询结果,如果结果为0
则返回值为true
语法二
[ condition ]
注意:condition
的前后需要各有一个空格
常用的判断条件
两个数之间的比较
-eq
等于(equal)
-ne
不等于(not equal)
-lt
小于(less than)
-le
小于等于(less than)
-gt
大于(greater than)
-ge
大于等于(greater equal)
注意:如果是字符串之间的比较,用等号=
判断是否相等;用!=
判断是否不等。
判断文件是否有指定的权限
-r
有读的权限(read)
-w
有写的权限(write)
-x
有执行的权限(execute)
判断指定路径的资源类型
-e
资源是否存在(existence)
-f
资源存在并且是一个文件(file)
-d
资源存在并且是一个文件夹(directory)
评论区