shell脚本(一)
一、shell概述
1、shell是什么
shell是一种脚本语言也是一个命令行解释器,通常使用shell脚本处理大量重复性问题于各语言的交互问题。
2、shell分类
[root@bes ~]# cat /etc/shells #查询Linux支持的shell
/bin/sh
/bin/bash # /bin/bash 是大多数 Linux 系统的默认 Shell
/sbin/nologin
/usr/bin/sh
/usr/bin/bash
/usr/sbin/nologin
二 、shell脚本的执行方式
1、输出命令echo
[root@bes ~]# echo [选项] [输出内容]
选项
-n 不尾随换行符
-e 启用解释反斜杠的转义功能
-E 禁用解释反斜杠的转义功能(默认)
若-e 可用,则以下序列即可识别:
\\ 反斜杠
\a 响铃声
\b 退格
\c 不再产生新的输出
\e 转义符
\f 换页
\n 新行
\r 回车
\t 水平制表符
\v 竖直制表符
\0NNN 字节数以八进制数 NNN (1至3位)表示
\xHH 字节数以十六进制数 HH (1至2位)表示
例
[root@bes ~]# echo "aaaa" #默认换行
aaaa
[root@bes ~]# echo -n "aaaa" #输出不换行
aaaa[root@bes ~]#
[root@bes ~]# echo -e "a \a" #输出a并响铃
a
[root@bes ~]# echo -e "a\tb\tc\ne\tf\tg" #\t等同于tab #\n等同于换行
a b c
e f g
[root@bes ~]# echo -e "a\tb\tc\ne\bf\tg" #\b前的e会去除
a b c
f g
2、执行脚本
source、bash、sh可不加执行权限
[root@bes ~]# source test.sh
xy
[root@bes ~]# sh test.sh
xy
[root@bes ~]# bash test.sh
xy
./方式必须加执行权限
[root@bes ~]# cat <<EOF > test.sh
> #!/bin/bash
> name=xy
> echo $name
> EOF
[root@bes ~]# chmod +x test.sh
[root@bes ~]# ./test.sh
xy
三、输入输出重定向
1、输入重定向
命令格式 | 作用 |
---|---|
命令 < 文件名 | 将指定文件作为命令的输入设备 |
命令 << 分界符 | 表示从标准输入设备(键盘)中读入,直到遇到分界符才停止(读入的数据不包括分界符),这里的分界符其实就是自定义的字符串 |
命令 < 文件 1 > 文件 2 | 将文件 1 作为命令的输入设备,该命令的执行结果输出到文件 2 中 |
例1
[root@localhost ~]# cat test.txt
abcde
[root@localhost ~]# cat < test.txt #输出结果同上面命令相同
abcde
注意,虽然执行结果相同,但第一行代表是以键盘作为输入设备,而第二行代码是以 test.txt 文件作为输入设备
例2
[root@localhost ~]# cat << xy
> Linux
> Centos
> xy
Linux
Centos
可以看到,当指定了 xy 作为分界符之后,只要不输入 xy ,就可以一直输入数据
例3
[root@localhost ~]# cat test.txt
abcde
[root@localhost ~]# cat < test.txt > a.txt
[root@localhost ~]# cat a.txt
abcde
可以看到,通过重定向 test.txt 作为输入设备,并输出重定向到 a.txt,最终实现了将 test.txt 文件中内容复制到 a.txt 中
2、输出重定向
类型 | 符号 | 作用 |
---|---|---|
标准输出 | 命令 > 文件 | 以覆盖方式把正确输出输出到指定文件或设备当中 |
标准输出 | 命令 >> 文件 | 以追加方式把正确输出输出到指定文件或设备当中 |
标准错误输出(用不到) | 错误命令 2> 文件 | 以覆盖方式把错误输出输出到指定文件或设备当中 |
标准错误输出(用不到) | 错误命令 2>> 文件 | 以追加方式把错误输出输出到指定文件或设备当中 |
正确跟错误同时保存 | 命令 > 文件 2>&1 | 以覆盖 方式把错误跟正确输出 都输出到指定文件 |
正确跟错误同时保存 | 命令 >> 文件 2>&1 | 以追加 方式把错误跟正确输出 都输出到指定文件 |
正确跟错误同时保存 | 命令 &> 文件 | 以覆盖 方式把错误跟正确输出 都输出到指定文件 |
正确跟错误同时保存 | 命令 &>> 文件 | 以追加 方式把错误跟正确输出 都输出到指定文件 |
正确跟错误同时保存 | 命令 >>文件1 2>>文件2 | 把正确输出追加到文件1``错误输出追加到文件2 |
例4
[root@localhost ~]# cat test >> test1.txt 2>&1 #正确或错误信息追加到test1.txt
[root@localhost ~]# cat test1.txt
cat: test: 没有那个文件或目录
[root@localhost ~]# ll &> test1.txt #正确或错误信息覆盖test1.txt
[root@localhost ~]# cat test1.txt
总用量 8
-rw-------. 1 root root 1254 1月 26 17:27 anaconda-ks.cfg
-rw-r--r-- 1 root root 0 2月 23 17:07 test1.txt
-rw-r--r-- 1 root root 4 2月 23 17:02 test.txt
[root@localhost ~]# ll >> test.txt 2>> test1.txt
[root@localhost ~]# lp >> test.txt 2>> test1.txt
[root@localhost ~]# cat test.txt && cat test1.txt #正确信息追加到test.txt错误信息追加到test1.txt
总用量 4
-rw-------. 1 root root 1254 1月 26 17:27 anaconda-ks.cfg
-rw-r--r-- 1 root root 0 2月 23 17:11 test1.txt
-rw-r--r-- 1 root root 0 2月 23 17:11 test.txt
-bash: lp: 未找到命令
四、常用符
1、运算符
符号 | 格式 | 作用 |
---|---|---|
; | 命令1 ; 命令2 | 多个命令顺序执行 |
& | 命令1 & 命令2 | 不管对错同时执行 |
&&(逻辑与) | 命令1 && 命令2 | 1正确2执行,1错误2不执行 |
| | 命令1 | 命令2 | 第一个执行的结果作为命令2的输入传给命令2 |
||(逻辑或) | 命令1 || 命令2 | 1错误2执行,1正确2不执行 |
2、通配符
通配符 | 作用 |
---|---|
? | 匹配任意一个字符 |
- |匹配任何内容
[]| 匹配括号任意一个字符,[abc],代表匹配任意一个
[-]| 匹配括号任意一个字符,[a-z],匹配任意一个小写字母
[^]| 逻辑非,[^0-9]匹配不是一个数字的字符
例1
[root@localhost ~]# ll * #匹配全部
-rw-r--r-- 1 root root 0 2月 23 21:28 0aaa
-rw-r--r-- 1 root root 0 2月 23 21:28 999
-rw-r--r-- 1 root root 0 2月 23 21:28 a
-rw-r--r-- 1 root root 0 2月 23 21:29 aa44
-rw-r--r-- 1 root root 0 2月 23 21:28 abc
-rw-------. 1 root root 1254 1月 26 17:27 anaconda-ks.cfg
-rw-r--r-- 1 root root 0 2月 23 21:28 b
例2
[root@localhost ~]# ll ab? #第三个字母匹配任意字母
-rw-r--r-- 1 root root 0 2月 23 21:28 abc
例3
[root@localhost ~]# ll a[abc]c #第二个字母匹配abc其中一个
-rw-r--r-- 1 root root 0 2月 23 21:28 abc
例4
[root@localhost ~]# ll [a-z]bc #第一个字母匹配a-z其中一个
-rw-r--r-- 1 root root 0 2月 23 21:28 abc
[root@localhost ~]# ll [a-z] #匹配一个任意字母
-rw-r--r-- 1 root root 0 2月 23 21:28 a
-rw-r--r-- 1 root root 0 2月 23 21:28 b
例5
[root@localhost ~]# ll ab[^0-9] #第三个字母不匹配0-9
-rw-r--r-- 1 root root 0 2月 23 21:28 abc
[root@localhost ~]# ll [^0-9] #单个字母不匹配0-9
-rw-r--r-- 1 root root 0 2月 23 21:28 a
-rw-r--r-- 1 root root 0 2月 23 21:28 b
[root@localhost ~]# ll [^0-9]bc #第一个字母不匹配0-9
-rw-r--r-- 1 root root 0 2月 23 21:28 abc
3、其他符号
符号 | 作用 |
---|---|
$() | 跟反引号作用一样,引用系统命令 |
# | shell中代表注释 |
$ | 用于调用变量的值 |
| 转义符 |
3.1、单引号、双引号、反引号
单引号:所有里面的内容没有特殊含义
[root@localhost ~]# echo '$shijian' #单引号里内容原封不懂
$shijian
[root@localhost ~]# echo '`date`' #单引号里内容原封不懂
`date`
双引号:拥有"调用变量的值","引用命令","转意"等含义
[root@localhost ~]# shijian=date
[root@localhost ~]# echo "$shijian" #输出变量
date
[root@localhost ~]# echo "`$shijian`" #双引号引用反引号内容,
2022年 02月 23日 星期三 21:57:26 CST
反引号:反引号括起来的内容是系统命令,和$()意思一样,容易与''混淆
[root@localhost ~]# echo `$shijian`
2022年 02月 23日 星期三 21:48:48 CST
[root@localhost ~]# echo $($shijian)
2022年 02月 23日 星期三 21:54:08 CST
[root@localhost ~]# echo `date`
2022年 02月 23日 星期三 22:07:09 CST
3.2、小括号、中括号、大括号
我们要知道,使用大括号或者小括号,会有一个概念是父shell跟子shell
小括号:
[root@localhost ~]# name=xy #在父shell中定义为xy
[root@localhost ~]# echo $name #输出为xy
xy
[root@localhost ~]# (name=pengyuyan;echo $name) #在子shell中定义,输出为pengyuyan
pengyuyan
大括号:
[root@localhost ~]# echo $name
xy
[root@localhost ~]# { name=zhangsan;echo $name; } #在当前shell,把xy代替
zhangsan
中括号:常常用来算术比较,文件测试
[root@localhost ~]# var=3
[root@localhost ~]# [ $var -eq 0 ] #当$var等于0时,返回0
[root@localhost ~]# echo $?
1
[root@localhost ~]# [ $var -ne 0 ] #当$var不等于0时,返回0
[root@localhost ~]# echo $?
0
五、变量
概述
- 变量名称由数字、字母跟下划线组成,不能以数字开头
- 变量用等号连接,等号两侧不能有空格
- 变量值有空格需要用单引号或者双引号包括
- 变量值中可以用转义符
- 变量默认都是字符串,运算时必须指定为数值型
如果增加变量值,可以进行叠加,不过需要加` “$变量名” 或 ${变量名}`
例1
[root@localhost ~]# test=123
[root@localhost ~]# test="$test"456
[root@localhost ~]# echo $test
123456
[root@localhost ~]# test=${test}789
[root@localhost ~]# echo $test
123456789
如果是把命令结果赋予给变量,则需要用 `` 或 $()
例2
[root@localhost ~]# test=`date`
[root@localhost ~]# echo $test
2022年 02月 24日 星期四 14:32:21 CST
1、自定义变量
由用户自己定义变量的名称内容
[root@localhost ~]# name=xy #自定义变量
[root@localhost ~]# echo $name #输出变量调用变量
xy
[root@localhost ~]# name="le le" #重新赋值变量
[root@localhost ~]# echo $name #输出变量调用变量
le le
[root@localhost ~]# set #用于设置shell,查看删除变量
BASH=/bin/bash
...中间省略...
name='le le' #查看到自定义变量
test=$'2022\345\271\264 02\346\234\210 24\346\227\245 \346\230\237\346\234\237\345\233\233 14:32:21 CST'
var=3
set查看变量
[root@localhost ~]# set [选项]
-u:设定此项,调用未赋值变量报错
-x:执行前吧命令先输出一次
[root@localhost ~]# echo $na
[root@localhost ~]# set -u #-u提示没有绑定的变量
[root@localhost ~]# echo $na
-bash: na: 为绑定变量
[root@localhost ~]# unset name #unset [变量] 删除变量
read命令:用来提示用户从键盘读入数据,赋值给变量。从而实现简单的交互过程。
选项:
-p "提示信息" :有信息提示
-n 字符数 :限制字符数
-s :隐藏输入信息
[root@localhost ~]# read aaa #普通赋值
eaea
[root@localhost ~]# echo $aaa
eaea
[root@localhost ~]# read -p "什么意思" aaa #设置提示信息
什么意思aaa
[root@localhost ~]# echo $aaa
aaa
2、环境变量
主要用于保存系统操作环境相关的数据,比如当前登录用户,用户家目录等
用来设置用户的工作环境变量
set跟env的区别在于env查看当前环境变量,set可以看所有变量
[root@localhost ~]# env #查看当前用户环境变量
[root@localhost ~]# export age="11" #设置环境变量
3、位置参数变量
4、预定义变量
- $?:输出上一条执行命令的状态,0正确,非0错误
- $$:输出当前经常PID
- $!:输出最后一个进程的PID
5、声明变量类型
declare跟export的作用是一样的,export相当于declare简写
[root@localhost test]# declare [+或-] [选项] 变量名
选项:
-:设定变量类型属性
+:取消变量类型属性
-a:声明变量为数组类型
-i:声明变量为整数类型(integer)
-r:声明为只读变量。注意:一旦声明,只能通过关机重启取消。
-x:声明变量为环境变量
-p:显示指定变量的被声明类型
除了declare,还有expr跟let。
数组跟变量的区别,在于都是变量,但是数组能保存多个数据
数组定义为:变量名[下标]
[root@localhost test]# name[1]=1
[root@localhost test]# name[2]=2
[root@localhost test]# name[3]=3
[root@localhost test]# echo ${name[*]}
1 2 3
[root@localhost test]# echo ${name[2]}
2
变量运算方式
[root@localhost test]# value1=11
[root@localhost test]# value2=22
[root@localhost test]# value3=$(expr $value1 + $value2 )
[root@localhost test]# echo $value3
33
[root@localhost test]# let value4=$value1+$value2
[root@localhost test]# echo $value4
33
[root@localhost test]# value5=$(( $value1+$value2 )) #推荐使用
[root@localhost test]# echo $value5
33
6、常用运算符
优先级 | 运算符 | 解释 |
---|---|---|
13 | -,+ | 单目符,单目正 |
12 | !,~ | 逻辑非,取反或补码 |
11 | *,/ ,% | 乘,除,取余 |
10 | +,- | 加,减 |
9 | <<,>> | 换位左移,换位右移 |
8 | >=,<=,>,< | 大于或等于,小于或者等于,大于,小于 |
7 | ==,!= | 等于,不等于 |
6 | & | 按位与 |
5 | ^ | 按位异或 |
4 | | | 按位或 |
3 | && | 逻辑与 |
2 | || | 逻辑或 |
1 | =,+=,-=,*=,/=,%=,&=,^=,|=,<<=,>>= | 赋值,运算且赋值 |
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/11965.html