1 shell的概念
shell是一个命令行解释器,为用户提供了一个向linux内核发命令的程序。shell是解释执行的脚本语言,在shell中可以直接调用Linux系统命令.
2 shell的使用场景
shell脚本主要目的是简化管理员操作实现自动化处理。比如批量生成文件,定时备份文件,定时检测系统等。
3 入门脚本
我们写一个hello.sh的脚本它的作用是向屏幕打印个hello。
#!/bin/bash
echo "hello"
/#!/bin/bash是指此脚本使用/bin/bash来解释执行。其中,#!是一个特殊的表示符,其后跟着解释此脚本的shell路径。bash只是shell的一种,还有很多其它shell,如:sh,csh,ksh…我们在写shell脚本的时候应该养成在第一行加#!+shell路径的习惯。
echo 是一个输出命令,后面直接跟要输出的内容。
4 脚本的执行方式
脚本有如下两种调用方式
- 赋予执行权限,直接运行
chmod 755 hello.sh
./hello.sh
- 通过Bash调用执行脚本
bash hello.sh
我们看一下它的运行结果:
5 Linux常用快捷键
- ctrl+c 强制终止当前命令;
- ctrl+l 清屏;
- ctrl+a 光标移动到命令最前的一位;
- ctrl+e 光标移动到命令最后的一位;
- ctrl+u 从光标所在位置清除;
- ctrl+z 把命令放在后台;
- ctrl+r 在历史命令中搜索
6 输出重定向
Linux中标准的输入是键盘,标准输出和标准错误输出是显示器。其中标准输入的文件描述符是0,标准输出文件描述符是1,错误输出文件描述符是2.我们标准输出是到显示器的,但有些时候我们可能希望把一些输出写到文件中。那么输出到文件中而不是显示器这个过程就是输出重定向。
- 标准输出重定向
命令 > 文件 以覆盖的方式将命令的正确执行结果写入指定文件
命令 >> 文件 以追加的方式将命令的正确执行结果写入指定文件
- 标准错误输出重定向
错误命令 2> 文件 以覆盖的方式将命令的错误执行结果写入指定文件
错误命令 2>> 文件 以追加的方式将命令的错误执行结果写入指定文件
用法示例:
但我们有时可能并不知道命令到底是否能够正确执行,我们希望的是将正确执行的命令内容保存在一个文件,将错误的命令内容保存在另一个文件或者将正确和错误输出保存在同一文件中。我们可以用如下方式:
- 命令 > 文件 2>&1 以覆盖的方式将命令的正确与错误执行结果写入同一文件
- 命令 >>文件 2>&1 以追加的方式,把正确输出和错误输出都保存到同一个文件中
- 命令 &>文件 以覆盖的方式,把正确输出和错误输出都保存到同一个文件中
- 命令 &>>文件 以追加的方式,把正确输出和错误输出都保存到同一个文件中
- 命令 >> 文件1 2>>文件2 把正确输出追加到文件1中,把错误的输出追加到文件2中
注:
示例:ls &>/dev/null #把命令结果放进这个系统默认的“黑洞”,相当于放进垃圾箱
7 管道符
多命令执行时,有三种执行符,分别是:
- ; 命令1;命令2 它相当于命令之间顺序执行没有任何逻辑关系
- && 命令1&&命令2 逻辑与,命令1正确执行命令2才会执行
- || 命令1||命令2 逻辑或,命令1执行不正确命令2才会执行
| 是管道符,命令1 | 命令2 它的含义是命令1的正确输出作为命令2的操作对象,比如我们要查找服务器当前在线人数就可以用如下命令:
netstat -an | gerp ESTABLISHED | wc -l
8 通配符
常用的通配符:
1? 匹配任意一个字符
2 * 匹配0个或任意多个字符
3 [] 匹配括号中的任意一个字符
4 [-]匹配括号中的任意一个字符,-代表一个范围。如果想匹配多个,可以多个[]并排
5 [^]逻辑非,表示匹配不是中括号内的一个字符。如:[^0-9]代表匹配一个不是数字的
Bash中其他特殊符号
1 '' 单引号,在单引号中左右的特殊符号,如$,&等都没有特殊含义
2 "" 双引号,在双引号中左右的特殊符号都没有特殊含义,但是“$”,"`","\"是例外。拥有“调用变量的值”,“引用命令”和“转义符”的特殊含义
3 `` 反引号,反引号括起来的内容是系统命令,在Bash中会先执行它。和$()作用一样。
4 $() 和反引号作用一样,用来引用系统命令,等于` `
5 # 在Shell脚本中,#开头的行代表注释
6 $ 用于调用变量的值,如需要调用变量name的值时,需要用$name的方式得到变量的值
7 \ 转义符,跟在\之后的特殊符号将失去特殊含义,变为普通字符。如\$将输出"$"符号,而不当变量引用
示例:
aa=hello
echo 'aa' #输出的字符串aa
echo "$aa" #输出的aa的值
9 变量
bash中的变量分为以下几类:
- 用户自定义变量:用户自己定义的
- 环境变量:这种变量保存的主要是和系统操作环境相关的变量。可以自定义。比如添加个java的环境变量。
- 位置参数变量:这种变量主要是向shell脚本传递参数或数据的,不能自定义。
- 预定义变量: 这种变量是bash中已经定义好的变量,不能自定义。
变量命名规则:
- 开头为字符或下划线,名字中间中能有字母、数字和下划线组成;
- 变量的长度不超过255个字符;
- 变量名在有效的范围内必须是唯一的;
在Bash中,按存储数据可分为整形,浮点型,字符串型,日期型。变量的默认类型都是字符串型.
变量的定义: 变量名=变量值 比如: x=5;z=c;
变量的调用: $变量名
变量的叠加:例 x=123;y=${x}456 y的值为123456
set用于查看当前系统的环境变量与用户自定义变量
变量删除 unset 变量名(不加$符号)
9.1 环境变量
PATH环境变量是个重要的变量,它保存着我们系统查找命令的路径。
echo $PATH :查看系统环境变量的值
PATH=${PATH}:/路径 用于添加环境变量的值
设置环境变量:export 变量名=值
env命令仅用来查看环境变量
常见的系统环境变量:
- HOSTNAME:主机名
- SHELL:当前的shell
- TERM:终端环境
- HISTSIZE:历史命令的保存条数
- USER:当前登录的用户
用户自定义变量只在当前的shell中生效
环境变量在当前shell和这个shell的所有子shell中生效
9.2 位置参数变量
- $0代表命令本身,$1-$9代表第一到第九个参数,十以上的参数需要用大括号包含,如${10}
- $* 这个变量代表命令行中所有的参数,$*把所有的参数看成一个整体
- $@ 这个变量也代表命令行中所有的参数 ,不过$@把每个参数区分对待
- $# 这个变量代表命令行中所有参数的个数
9.3 预定义变量
- $? 最后一次执行命令的返回状态,如果正确执行,则返回0;
如果返回为非零(具体数值由命令决定),则上一条命令执行不正确
执行完一条命令之后,立马敲入echo $?,可得到返回值。例如:ls 执行之后,再敲入echo $?,可以得到0.
逻辑与逻辑或所说的前一条命令的正确执行就是根据这个变量的值来判断的
- $$ 返回当前进程的PID号
- $! 返回后台的进程PID号
接收键盘输入:
read [选项] [变量名]
-p: 提示信息 在等待read输入时,输出的提示信息
-t: 等待时间(单位s) 指定等待的时间后用户还没输入就终止脚本执行(若不指定此参数则会一直等待)
-n: 字符数 read命令接收指定的字符数就会执行
-s: 隐藏数据的输入,适合密码等较为机密的数据
用法示例:我们在键盘输入用户的用户名和密码,其中密码隐藏输入。然后将用户名和密码输出
#!/bin/bash
read -p "please input username: " -t 30 name
read -p "please input password: " -t 30 -s password
echo -e "\n"
echo "username is:$name,password is:$password"
执行过程:
9.4 变量类型的声明
declare命令用于声明变量类型
declare [+/-] [选项] 变量名
-:给变量设定类型属性
+:给变量取消类型属性
-a:将变量声明为数组
-i:将变量声明为整数型
-x:将变量声明为环境变量
-r:将变量声明为只读变量
-p:显示指定变量的被声明的类型
10 运算符
shell中的运算符见下表:
shell中数值运算的方法有以下几种。比如计算a=1,b=2的和c的值 :
- declare -i declare -i c=$a+$b
- $((运算式))或$[运算式] c=$(($a+$b))或 c=$[$a+$b]
- expr或let数值运算工具 c=$(expr $a + $b) 注意+前后都有空格
let c=$a+$b