Shell介绍
Shell是一种命令行解释器,是为用户和操作系统之间通信提供的一种接口,接受用户输入的命令,将其转换为一系列的系统调用送到内核执行,并将结果输出给用户。
RedHat和CentOS发行版中默认安装了多种Shell,可以使用cat /etc/shells
命令来确认系统中可用的Shell是什么版本;
查看shell的具体版本,比如bash:bash --version
shell两种执行方式:互动模式和脚本模式
在终端可以使用ctrl+c快捷键退出
Shell脚本执行
脚本注释
# 以#开头注释,头部#!开头(指明解释器)除外
# echo "单行注释"
# 多行注释如下<<!开头,中间是要被注释的代码块,!结尾;
<<!
echo "多行注释,这里是要被注释的代码块"
!
<<comment
echo "<<!这个感叹号!也可以是其他任意字符,开头和结尾一致即可,比如comment"
comment
脚本的相对路径或绝对路径
该方法需要赋予脚本+x执行权限:chomd +x HelloWorld.sh
,并在脚本头部指明shell解释器版本路径,比如bash; 脚本顶部#!开头用于指明解释器;
cat HelloWorld.sh
# 切换到脚本目录下执行
cd /tmp
# 新建shell文件,编辑保存,编辑此处省略
vim HelloWorld.sh
# 执行脚本,.代表当前目录,前面需要带点,不然是从环境变量目录下找,提示找不到
./HelloWorld.sh
# 也可以使用绝对路径
/tmp/HelloWorld.sh
# 也可以把脚本移动到环境变量目录下,直接执行,可能账号没权限,使用sudo执行
sudo mv HelloWorld.sh /bin
HelloWorld.sh
cat HelloWorld.sh
sh 脚本
使用sh 脚本执行,脚本头部无须指明解释器,bash HelloWorld.sh
可以使用-x
参数来查看脚本具体运行过程:base-x HelloWorld.sh
该方法不用赋予脚本+x执行权限,用户本身有sh执行权限,通过sh执行脚本;
# 取消执行权限
chmod -x HelloWorld.sh
# 执行脚本
bash HelloWorld.sh
source 脚本
source
命令也可读取并在当前环境中执行脚本,同时还可返回脚本中最后一个命令的返回状态;如果没有返回值则返回0,代表执行成功;如果未找到指定的脚本则返回false。source HelloWorld
子进程
可以通pstree
命令查看进程数
bash exit.sh
会开启子进程执行脚本
source exit.sh
不会开启子进程执行脚本
#!/bin/bash
# 关闭命令,使用source命令执行脚本,脚本执行完会关闭终端
exit
Shell变量
变量基本介绍
Linux Shell变量分为:系统变量和用户变量。系统变量:HOME
当前账户根目录、PWD
当前目录、SHELL
使用的shell、USER
、PATH
环境边浪、LOGNAME
登录用户名、HOSTNAME
主机等,echo $PWD
;
显示当前所有变量:set
变量定义
定义变量:变量名=值:VAR=100
,=
前后不能有空格;
撤销变量:unset 变量名:unset VAR
声明静态变量:readonly变量,静态变量不能unset
readonly VAR=100
echo $VAR
#unset B
设置环境变量
基本语法
- export 变量名=变量值
将shell变量输出为环境变量|全局变量,可以在shell脚本里调用 - source 配置文件
让修改后的配置文件立即生效,不然修改配置文件要注销后才能生效; - echo $变量名
查看环境变量的值
# 新建环境变量目录
mkdir /tmp/new_path
# 变量环境变量配置文件,增加环境变量:export NEW_PATH=/tmp/new_path,并保存(编辑省略)
vim /etc/profile
# 使用source命令使配置文件立即生效
source /etc/profile
# 查看新增的环境变量值
echo $NEW_PATH
# 可以在另一个shell脚本里使用该变量
# 删除测试环境变量目录
rmdir /tmp/new_path
# 编辑配置文件,删除环境便令
vim /etc/profile
/etc/profile在开机时会运行,可以植入一些命令,在该文件设置环境变量对全用户生效;
./etc/profile ,~/.bashrc, ~/.bash_file的区别?
~/.bashrc, ~/.bash_file是宿主目录下的,里面的环境变量也叫shell变量,是局部的,只对特定的shell有效。
/etc/profile里面的变量是全局的,对所有用户的shell有效。
一行代码多命令执行机制
一行代码中输入多条命令,在Shell中可以使用;(分号)、&&(与)、||(或)这三个符号将多个命令分隔。
- 分号:按顺序执行命令,分号前后的命令可以没有任何逻辑关系
- &&:前一条命令执行成功后,才会执行&&后面的命令
- ||:前一条命令不执行或执行失败后才执行后一条命令
运算符
算数运算
Shell支持多种算术运算,可以使用$((表达式))、$[表达式]、let表达式进行整数的算术运算,注意这些命令无法执行小数运算;使用bc命令可以进行小数运算;
TMP=$[5+6]
# 乘以10
NUM=$((TMP*10))
# 逻辑与判断,两个都为真输出1,否则返回0
echo $[5>6&&4<10]
使用let命令计算时,默认不会输出运算的结果,一般需要将运算的结果赋值给变量,通过变量查看运算结果。另外,使用let命令对变量进行计算时,不需要在变量名前添加$符号。
let NUM=1+2
echo $NUM
let I=(1+9)*10;echo $I
也可以使用expr
表达式工具计算,比如(运算符两边要有空格),等于==和不等于!=不适用;
num=`expr 10 + 20`
Bash仅支持对整数的四则运算,不支持对小数的运算,小数运算可以使用bc计算器,支持交互和非交互模式;
- 交互模式,默认显示整数部分,通过bc的内置变量scale指定保留小数位;
bc
3/9 # 保留整数部分,返回是0
scale=2
3/9 # 返回0.33
quit # 使用quit命令退出bc计算器
- 非交互模式
内置变量ibase(in)和obase(out)可以进行进制转换,ibase用来指定输入数字的进制,obase用来设置输出数字的进制,默认输入和输出的数字都是十进制的
NUM=$(echo "(2+8)*10" | bc)
echo $NUM # 输出100
echo "10*20;scale=3;3/9" | bc # 输出200 0.333
echo "obase=8;10" | bc # 十进制转8进制,输出12
echo "ibase=2;111" | bc # 111二进制转10进制,输出7
echo "length(123456)" | bc # 统计数字的长度,输出6
关系运算符
字母代表的单词:
eq -> equal
ne -> not equal
gt -> greater than
lt -> less than
ge -> greater than or equal
le -> less than or equal
运算符 | 说明 |
---|---|
-eq | 等于 |
-ne | 不等于 |
-gt | 大于 |
lt | 小于 |
-ge | 大于等于 |
-le | 小于等于 |
编辑脚本shell_0924.sh
如下
给脚本加上可执行权限chmod +x shell_0924.sh
执行脚本./shell_0924.sh
#!/bin/bash
a=10
b=20
echo "${a},${b}val"
# if 判断的方括号前后要加空格
if [ $a -ge $b ]
then
echo "a>b"
else
echo "a<b"
fi
布尔运算符
运算符 | 解释 |
---|---|
! | 非,取反 |
-o | 或or |
-a | 并且,and |
字符串运算符
运算符 | 解释 |
---|---|
= | 相等 |
!= | 不等,不等返回true |
-z | 字符串长度如果为0返回true |
-n | 字符串长度不为0返回true |
str | 检测字符串是否为空,无为空返回true |
循环
for循环
#!/bin/bash
echo "打印系统传入变量"
for each in $@
do
echo "变量each为:${each}"
done
# 求和
UNTIL=50
SUM=0
for ((i=1;i<=$UNTIL;i++))
do
SUM=$[$SUM+$i]
done
echo "总和SUM=${SUM}"
while
# 格式
while condition
do
command
done
示例:
i=1
while( ($i<10) )
do
echo $i
i=$[i+1]
done
判断
如果写在一行,需要用分号隔开;方括号前后要加空格;
if [ condition ];then command1;fi
num=100
if [ $num -eq 100]
then
echo "等于100"
elif [ $num -gt 100 ]
then
echo "大于100"
else
echo "小于100"
fi
待更新…