Shell脚本(一)

导读:本篇文章讲解 Shell脚本(一),希望对大家有帮助,欢迎收藏,转发!站点地址:www.bmabk.com


一、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 126 17:27 anaconda-ks.cfg
-rw-r--r--  1 root root    0 223 17:07 test1.txt
-rw-r--r--  1 root root    4 223 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 126 17:27 anaconda-ks.cfg
-rw-r--r--  1 root root    0 223 17:11 test1.txt
-rw-r--r--  1 root root    0 223 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 223 21:28 0aaa
-rw-r--r--  1 root root    0 223 21:28 999
-rw-r--r--  1 root root    0 223 21:28 a
-rw-r--r--  1 root root    0 223 21:29 aa44
-rw-r--r--  1 root root    0 223 21:28 abc
-rw-------. 1 root root 1254 126 17:27 anaconda-ks.cfg
-rw-r--r--  1 root root    0 223 21:28 b
例2
[root@localhost ~]# ll ab?		#第三个字母匹配任意字母
-rw-r--r-- 1 root root 0 223 21:28 abc
例3
[root@localhost ~]# ll a[abc]c		#第二个字母匹配abc其中一个
-rw-r--r-- 1 root root 0 223 21:28 abc
例4
[root@localhost ~]# ll [a-z]bc		#第一个字母匹配a-z其中一个
-rw-r--r-- 1 root root 0 223 21:28 abc
[root@localhost ~]# ll [a-z]		#匹配一个任意字母
-rw-r--r-- 1 root root 0 223 21:28 a
-rw-r--r-- 1 root root 0 223 21:28 b
例5
[root@localhost ~]# ll ab[^0-9]		#第三个字母不匹配0-9
-rw-r--r-- 1 root root 0 223 21:28 abc
[root@localhost ~]# ll [^0-9]		#单个字母不匹配0-9
-rw-r--r-- 1 root root 0 223 21:28 a
-rw-r--r-- 1 root root 0 223 21:28 b
[root@localhost ~]# ll [^0-9]bc		#第一个字母不匹配0-9
-rw-r--r-- 1 root root 0 223 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、位置参数变量

  • $n:n为数字,$0代表本身,10以上加大括号如${10}
  • $*:代表把全部参数看作一个整体
  • $@:代表逐个区分对待
  • $#:统计参数个数
    在这里插入图片描述

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

(0)
小半的头像小半

相关推荐

极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!