一、Shell 概述
Linux 提供的 Shell 解析器
cat /etc/shells
CentOS 默认的解析器是 bash
二、hello world!
基本语法
#! 指定解析器
echo 用于向窗口输出文本。
#!/bin/sh
echo "hello world!"
常用执行方式
三、变量
1.系统预定义变量
$HOME、$PWD、$SHELL、$USER 等
2.自定义变量
变量定义规则
(1)变量名称可以由字母、数字和下划线组成,但是不能以数字开头,环境变量名建议大写。
(2)等号两侧不能有空格
(3)在 bash 中,变量默认类型都是字符串类型,无法直接进行数值运算。
(4)变量的值如果有空格,需要使用双引号或单引号括起来。
基本语法
(3)声明静态变量:readonly 变量,注意:不能 unset
$n | n 为数字, $0表示执行的文件名,$1开始表示执行脚本的第n参数,10个以上的参数需要使用${10} |
$# | 传递到脚本的参数个数 |
$* | 以一个单字符串显示所有向脚本传递的参数。把所有的参数看成一个整体 如"$*"用「"」括起来的情况、以"$1 $2 … $n"的形式输出所有参数。 |
$$ | 脚本运行的当前进程ID号 |
$! | 后台运行的最后一个进程的ID号 |
$@ | 与$*相同,但是使用时加引号,并在引号中返回每个参数。把每个参数区分对待,可以循环遍历 如"$@"用「"」括起来的情况、以"$1" "$2" … "$n" 的形式输出所有参数。 |
$- | 显示Shell使用的当前选项,与set命令功能相同。 |
$? | 显示最后命令的退出状态。0表示没有错误,其他任何值表明有错误。 |
四、运算符
算术运算符
运算符 | 说明 |
---|---|
+ | 加法 |
- | 减法 |
* | 乘法 |
/ | 除法 |
% | 取余 |
= | 赋值 |
== | 相等。用于比较两个数字,相同则返回 true。 |
!= | 不相等。用于比较两个数字,不相同则返回 true。 |
1.expr 原生bash不支持简单的数学运算,但是可以通过其他命令来实现,expr 最常用。
2. $((运算式)) 或 $[运算式]
条件判断
1.test 表达式 0为真 1为假
2.[ 表达式 ](注意 表达式 前后要有空格)
字符串之间的比较 ,用等号“=”判断相等;用“!=”判断不等
关系运算符
关系运算符只支持数字,不支持字符串,除非字符串的值是数字
-eq |
等于 equal ,两个数是否相等,相等返回 true。
|
-ne | 不等于 not equal,两个数是否不相等,不相等返回 true。 |
-gt |
大于 greater than,
左边的数是否大于右边的,如果是,则返回 true。
|
-lt |
小于 less than,
左边的数是否小于右边的,如果是,则返回 true。
|
-ge |
大于等于 greater equal,
左边的数是否大于等于右边的,如果是,则返回 true。
|
-le |
小于等于 less equal,
左边的数是否小于等于右边的,如果是,则返回 true。
|
布尔运算符
-a | 与运算,两个表达式都为 true 才返回 true。 |
-o | 或运算,有一个表达式为 true 则返回 true。 |
! | 非运算,表达式为 true 则返回 false,否则返回 true。 |
a=10 b=20 c=10
逻辑运算符
&& | 逻辑与,前一条命令执行成功时,才执行后一条命令 |
|| | 逻辑或,前一条命令执行失败后,才执行下一条命令 |
组合使用可以达到三目运算符的效果
文件判断
-r | 检测文件是否可读,如果是,则返回 true。 |
-w | 检测文件是否可写,如果是,则返回 true。 |
-x | 检测文件是否可执行,如果是,则返回 true。 |
-s | 检测文件是否为空(文件大小是否大于0),不为空返回 true。 |
-e | 检测文件(包括目录)是否存在,如果是,则返回 true。 |
-f | 检测文件是否是普通文件(既不是目录,也不是设备文件),如果是,则返回 true。 |
-d | 检测文件是否是目录,如果是,则返回 true。 |
五、流程控制
1.if...else
(1)单分支
if [ 条件判断式 ];then
程序
fi
或者:
if [ 条件判断式 ]
then
程序
fi
写成一行(适用于终端命令提示符)
if [ $a -eq 10 ] ; then echo ok ; fi
if [ 条件判断式 ]
then
程序
elif [ 条件判断式 ]
then
程序
else
程序
fi
2.case
case $变量 in
模式1)
command1 # 变量=模式1,执行command1
;;
模式2)
command2 # 变量=模式2,执行command2
;;
*)
command3
esac
3.for循环
for (( 初始值;循环控制条件;变量变化 ))
do
程序
done
for循环求1到10的和
for var in item1 item2 ... itemN
do
command1
command2
...
commandN
done
写成一行:
for var in item1 item2 ... itemN; do command1; command2… done;
4.while 循环
while condition
do
command
done
while循环求1-100的和
5.until
until 循环执行一系列命令直至条件为 true 时停止。
until 循环与 while 循环在处理方式上刚好相反。
until condition
do
command
done
六、读取控制台输入
七、函数
basename 可以理解为取路径里的文件名称
basename [string / pathname] [suffix]
选项:
suffix为后缀,如果suffix被指定,basename会将pathname或string中的suffix去掉。
2.dirname
功能描述:从给定的包含绝对路径的文件名中去除文件名(非目录的部分)
然后返回剩下的路径(目录的部分)
dirname 文件绝对路径
dirname 可以理解为取文件路径的绝对路径名称
自定义函数
[ function ] funname [()]
{
action;
[return int;]
}