shell脚本应用
Posted 2567xl
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了shell脚本应用相关的知识,希望对你有一定的参考价值。
Shell 脚本的概念
将平时使用的各种Linux命令按顺序保存(堆叠)到一个文本文件中,添加上执行权限,就是一个Shell脚本。
● 将要执行的命令按先后顺序保存到一个文本文件
● 给该文件可执行权限,便可运行
● 可结合各种Shell控制语句以完成更复杂的操作
Shell脚本应用场景
● 重复性操作
● 批量事务处理
● 自动化运维
● 服务运行状态监控
● 定时任务执行
● 减轻管理员负担
● 规避费时操作
编写Shell脚本的格式:
1、#!/bin/bash 表示脚本通过以/bin/bash程序来编写
2、# 表示注释信息,例如:对编写的脚本作用进行解释,每写一段脚本之前都应该用“#”来注释以下命令执行的结果
3、定义脚本中的变量
4、定义脚本中的函数
5、脚本执行语句(判断、循环、选择等语句)
6、利用 echo 定义输出一些让人更容易看懂得信息(可以是中文也可以是英文)
执行脚本的三种方法:
l 通过绝对路径执行:/root/first.sh或进入到脚本文件所在目录 ./first.sh (需要给脚本文件添加上执行权限)
l 进入到脚本文件所在目录执行 sh first.sh bash first.sh(文件可以没有执行权限)
l 进入到脚本文件所在目录执行 source first.sh 或 . first.sh (文件可以没有执行权限)
Shell的概念
Shell是一个特殊的应用程序,介于操作系统内核和用户之间,充当一个“命令解释器”(翻译官)的角色,负责接受用户输入的指令并进行解释,将需要执行的操作传递给内核执行,并输出执行结果返回给用户。
PS: l linux 默认使用 /bin/bash
l IBM AIX(Unix) 默认使用 /bin/ksh
l .sh 表示编写程序为bash
l .pl 表示编写程序为perl
l .py 表示编写程序为python
重定向和管道
交互式硬件设备文件: standard ( input、output、error)
l 标准输入:从该设备接收用户输入的数据
l 标准输出:通过该设备向用户输出数据
l 错误输出:通过该设备报告执行出错信息
类型 |
设备文件 |
文件描述编号 |
默认设备 |
标准输入 |
/dev/stdin |
0 |
键盘 |
标准输出 |
/dev/stdout |
1 |
显示器 |
标准错误输出 |
/dev/stderr |
2 |
显示器 |
重定向操作
类型 |
操作符 |
用途 |
重定向输入 |
< |
从指定的文件读取数据,而不是从键盘输入 |
重定向输出 |
> |
将输出结果保存到指定的文件(覆盖原有内容) |
>> |
将输出结果追加到指定的文件 |
|
标准错误输出 |
2> |
将错误信息保存到指定的文件(覆盖原有内容) |
2>> |
将错误信息追加到指定的文件中 |
|
混合输出 |
&> |
将标准输出、标准错误的内容保存到同一个文件中 |
PS:重定向输入符 < 通过文件输入内容,而不是用标准的键盘输入
标准输出,标准输入默认省略了 0 和 1
/dev/null 空文件 黑洞
处理多行输出:
[root@localhost ~]# cat << EOF > test.repo
[c7-media]
name=CentOS-Media
baseurl=file:///media/cdrom
gpgcheck=1
enabled=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7
EOF
管道符 |
格式:cmd1 | cmd2 [... | cmdn]
作用:将管道前的命令输出结果作为管道后命令的参数使用
xargs 在某些特殊情况下,管道符失去了作用,可以使用xargs命令,强制管道符后的命令使用管道符前的命令输出结果作为参数
awk命令基础体验:
awk -F"分隔符" ‘/过滤文本/print $1‘ 处理文件
awk -F: ‘ print $1 ‘ /etc/passwd
Shell变量
常量:固定的字符串,含义也是固定的。
Shell 变量用来存放系统和用户需要使用的特定参数(值),而且参数根据用户的设定或系统环境的改变而相应的改变,灵活,适应性更强。
变量类型:
1、自定义变量
自定义变量是由用户自己定义的变量,只在用户自己的Shell环境中生效,又称本地变量
定义格式:变量名=变量值等号两边没有空格
变量名必须使用英文字母或是下划线开头,变量名内不允许出现特殊字符,并且区分字母大小写。
使用echo可以查看定义的变量值,$后面是一个变量名
[root@localhost ~]# product=cloud
[root@localhost ~]# version=2.0
[root@localhost ~]# echo $product
cloud
[root@localhost ~]# echo $version
2.0
[root@localhost ~]# echo $product$version
cloud2.0
[root@localhost ~]# echo $product $version
cloud 2.0
[root@localhost ~]# echo $product3.0
.0
[root@localhost ~]# echo $product"3.0"
cloud3.0
[root@localhost ~]# echo "$product"3.0
cloud3.0
[root@localhost ~]# echo $product‘3.0‘
cloud3.0
[root@localhost ~]# echo $product3.0
cloud3.0
[root@localhost ~]# echo $product\\3.0
cloud3.0
特殊符号:
1、双引号(“”):可以引用一个变量,有空格的值。
[root@localhost ~]# echo "$product $version"
cloud 2.0
2、单引号(‘’):引号内的内容被视为一个完整的字符串,不能引用变量。
[root@localhost ~]# echo ‘$product $version‘
$product $version
3、反撇号(``):引号内的执行结果作为变量名的变量值,引用命令使用。反撇号在一行命令中不能实现嵌套命令替换操作,所以使用$()
[root@localhost ~]# which mkdir
/usr/bin/mkdir
[root@localhost ~]# rpm -qf /usr/bin/mkdir
coreutils-8.22-21.el7.x86_64
[root@localhost ~]# rpm -qf `which mkdir`
coreutils-8.22-21.el7.x86_64
[root@localhost ~]# rpm -qf $(which mkdir)
coreutils-8.22-21.el7.x86_64
read命令:
用来提示用户输入信息,从而实现简单的交互变量设置。将用户输入的信息作为变量值,用户的输入以空格作为分隔符,将读入的各个字段挨个赋值给指定的变量,多余的赋值给最后一个变量。
-p 设置提示信息
[root@localhost ~]# read -p "please input your name and age: " name age
please input your name and age: zhangsan 20
[root@localhost ~]# echo $name
zhangsan
[root@localhost ~]# echo $age
20
设置变量生效范围:
新定义的变量只能在当前Shell环境中生效。又称局部变量
export 命令:可以将局部变量发布到全局。
[root@localhost ~]# echo $product #查看当前shell中变量的值
cloud
[root@localhost ~]# bash #切换到新的子Shell环境
[root@localhost ~]# echo $product #查看变量 (可以看到查不到变量值)
[root@localhost ~]# exit #退出Shell环境
exit
[root@localhost ~]# export product #使用export命令将变量发布到全局
[root@localhost ~]# bash #进入到一个新Shell环境
[root@localhost ~]# echo $product #查看变量值
cloud
或者可以在定义变量同时声明
[root@localhost ~]# export key=vlaue
注意:export全局发布,只能向下面的子Shell发布,不能向上父Shell发布。
数值变量的运算:
使用expr命令进行简单的整数运算,不支持小数运算。
(加)+、(减)-、(乘)\\*、(除)/、(取余)%
特殊的Shell变量
1、环境变量:
env 命令查看环境变量
环境变量是指,出于运行需要而由Linux系统提前创建的一类变量,主要用于设置用户的工作环境。
l /etc/profile : 环境变量的全局配置文件,文件中定义的变量作用于所有用户。
l .bash_profile :每个用户自己的独立配置文件。
常用的环境变量:
HOSTNAME=localhost.localdomain #定义主机名
PWD=/root #定义当前所在位置
USER=root #定义登录用户
set,env和export这三个命令的区别:
env 显示用户的环境变量;
set 显示当前shell的自定义变量,包括用户的环境变量,按变量名称排序;
export 显示当前导出用户变量的shell变量,并显示变量的属性(是否只读),按变量名称排序;
declare 同set 一样,显示当前shell的定义的变量,包括用户的环境变量;
unset 取消变量
位置变量:
位置变量也称为位置参数,使用$1、$2、……、$9、$10...表示
[root@localhost ~]# vim test.sh
#!/bin/bash
echo "当前的位置变量是:$1"
echo "当前的位置变量是:$2"
echo "当前的位置变量是:$3"
echo "当前的位置变量是:$4"
[root@localhost ~]# ./test.sh a b c d
当前的位置变量是:a
当前的位置变量是:b
当前的位置变量是:c
当前的位置变量是:d
预定义变量:
预定义变量是Bash程序预先定义好的一类特殊变量,用户只能使用预定义变量,而不能创建新的预定义变量,也不能直接为预定义变量赋值。
$*、$@ 表示所有位置参数的内容($*把所有参数视为整体,$@单个参数的组合)
$0 表示当前执行的脚本或程序的名称
$? 表示前一条命令执行后的返回状态,返回值为0表示执行正确,非0值为执行错误。
$# 表示命令行中位置参数的个数
常用的预定义变量:
$# 表示命令行中位置参数的个数
[root@localhost ~]# vim test.sh
#!/bin/bash
echo "当前的位置变量是:$1"
echo "当前的位置变量是:$2"
echo "当前的位置变量是:$3"
echo "当前的位置变量是:$4"
echo $#
[root@localhost ~]# ./test.sh a b c d
当前的位置变量是:a
当前的位置变量是:b
当前的位置变量是:c
当前的位置变量是:d
4 #统计出运用了几个位置变量参数
$* 表示所有位置参数的内容
[root@localhost ~]# vim test.sh
#!/bin/bash
echo "当前的位置变量是:$1"
echo "当前的位置变量是:$2"
echo "当前的位置变量是:$3"
echo "当前的位置变量是:$4"
echo $*
[root@localhost ~]# ./test.sh a b c d
当前的位置变量是:a
当前的位置变量是:b
当前的位置变量是:c
当前的位置变量是:d
a b c d #显示出位置变量的内容(值)
$? 表示前一条命令执行后的返回状态,返回值为0表示执行正确,非0值为执行错误。
[root@localhost ~]# cat /etc/passwd
[root@localhost ~]# echo $?
0 #返回的值为0,表示前面执行的命令cat /etc/passwd是正确的
[root@localhost ~]# cat /etc/password
[root@localhost ~]# echo $?
1 #返回的值为1,即非0值,表示前面执行的命令cat /etc/password是错误的
$0 表示当前执行的脚本或程序的名称
[root@localhost ~]# vim test.sh
#!/bin/bash
echo "当前的位置变量是:$1"
echo "当前的位置变量是:$2"
echo "当前的位置变量是:$3"
echo "当前的位置变量是:$4"
echo $0
[root@localhost ~]# ./test.sh a b c d
当前的位置变量是:a
当前的位置变量是:b
当前的位置变量是:c
当前的位置变量是:d
./test.sh 显示执行的脚本或是程序
$@ 以"参数1" "参数2" ... 形式保存所有参数
$$ 本程序的(进程ID号)PID
date + ‘%F‘ : 全格式显示年、月、日
date + ‘%T‘ : 全格式显示时、分、秒
date +‘%F %T‘ :全格式显示日期和时间
date + ‘%s‘ : 1970-01-01到现在时间的秒数
date + ‘%Y-%m-%d‘ %H-%M-%S‘ : 全格式显示日期和时间
date +%F -d "-1 day"
date +%N
echo -n = printf 输出内容不换行
以上是关于shell脚本应用的主要内容,如果未能解决你的问题,请参考以下文章