Shell概念

Shell脚本

shell 是一种脚本语言

1
2
3
4
5
6
7
脚本:本质是一个文件,文件里面存放的是 特定格式的指令,系统可以使用脚本解析器 翻译或解析 指令 并执行(它不需要编译)
shell 既是应用程序 又是一种脚本语言(应用程序 解析 脚本语言)
shell命令解析器:
系统提供 shell命令解析器: sh ash bash
查看自己linux系统的默认解析:echo $SHELL

# 打开终端时系统自动调用:/etc/profile 或 ~/.bashrc

定义以开头:#!/bin/bash

1
2
3
4
5
6
7
8
9
! 用来声明脚本由什么shell解释,否则使用默认shell
单个"#"号代表注释当前行
加上可执行权限
chmod +x xxxx.sh
三种执行方式 (./xxx.sh bash xxx.sh . xxx.sh)
cat -n test.sh #检查脚本语法错误
/bin/bash -x test.sh # 进入跟踪方式,显示所执行的每一条命令
sh -c 'a=1;b=2;let c=$a+$b;echo "c=$c"' #"string" 从strings中读取命令

变量

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
定义变量
变量名=变量值
如:num=10
引用变量
$变量名
unset :清除变量值
普通变量
#格式一:变量值必须是一个整体,中间没有特殊字符
变量名=变量值
#格式二:但引号,写什么内容,就输出什么内容
变量名='变量值'
#格式三:双引号(如果变量值范围内,有可以解析的变量A,那么首先解析变量A,将A的结果和其他内容组合成一个整体,重新赋值给变量B)
变量名="变量值"
命令变量
#格式一
变量名=`命令`
#格式二
变量名=$(命令)
全局变量
**定义:**在当前系统的所有环境下都能生效的变量
**查看命令:**可以通过命令查看环境变量,env :只显示全局变量
定义方式:export 变量=值
格式:${变量名:起始位置:截取长度} 示例:
${file:0:5} 从第1个字符开始,截取5个字符
${file:5:5} 从第6个字符开始,截取5个字符
${file:0-6:3} 从倒数第6个字符开始,截取之后的3个字符

内置变量

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
$0 获取脚本的名称,示例:
#!/bin/bash
# 获取脚本的名称
echo "我脚本的名称是: file.sh"
echo "我脚本的名称是:$0"
$n 获取当前脚本传入的第n个位置的参数 示例:
#!/bin/bash
# 获取指定位置的参数
echo "第一个位置的参数是: $1"
echo "第二个位置的参数是: $2"
echo "第三个位置的参数是: $3"
echo "第四个位置的参数是: $4"

$# 获取当前脚本传入参数的数量,示例:
#!/bin/bash
# 获取当前脚本传入的参数数量
echo "当前脚本传入的参数数量是: $#"
$? 获取文件执行或者命令执行的返回状态值 示例:
bash nihao
#bash: nihao: No such file or directory
echo $?
ls
#file1.sh num.sh test.sh weizhi.sh
echo $?
#0

条件表达式

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
逻辑表达式

常见的逻辑表达式有:&& 和 ||

&& :命令1 && 命令2

#命令1执行成功,命令2执行
[ 1 = 1 ] && echo "条件成立"
#命令1执行不成功,命令2也不执行
[ 1 = 2 ] && echo "条件成立"
|| :命令1 || 命令2

#命令1执行成功,命令2不执行
[ 1 = 2 ] || echo "条件不成立"
#命令1执行失败,命令2执行
[ 1 = 1 ] || echo "条件不成立"

文件表达式

-f 判断输入内容是否是一个文件,示例:

[ -f weizhi.sh ] && echo "是一个文件"
#是一个文件
[ -f weizhi.sddh ] || echo "不是一个文件"
不是一个文件
-d 判断输入内容是否是一个目录,示例:
[ -d weizhi.sddh ] || echo "不是一个目录"
#不是一个目录
mkdir nihao
[ -d nihao ] && echo "是一个目录"
#是一个目录

-x 判断输入内容是否可执行 示例:
[ -x age.sh ] || echo "文件没有执行权限"
#文件没有执行权限
[ -x test.sh ] && echo "文件有执行权限"
#文件有执行权限

数值操作符

1
2
3
4
n1 -eq n2	相等
n1 -gt n2 大于
n1 -lt n2 小于
n1 -ne n2 不等于

信息符号

1
2
3
1	表示正确输出的信息
2 表示错误输出的信息
2>&1 代表所有输出的信息