Shell脚本
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Shell脚本相关的知识,希望对你有一定的参考价值。
参考技术A 因为-c的意思是command,所以bash -c后面应该跟一个command。shell运行脚本的两种方法:
1、bash xx.sh
2、bash -c "cmd string"
使用bash -c需要注意两点:
1、bash -c "cmd string"接的是shell命令字符串,用双引号括起来
2、bash -c "/path/to/file"接的是文件绝对路径,用双引号括起来,并且文件需要可执行权限
参考链接:
1.1、 linux shell -c,【bash】关于shell中 bash -c 执行命令或者可执行文件
1.2、 【bash】关于shell中 bash -c 执行命令或者可执行文件
示例:/usr/libexec/PlistBuddy -c "cmd string"
参考链接: XCode添加自定义Run Script Phase
由于PlistBuddy并不在Mac默认的Path里,所以我们得通过绝对路径来引用这个工具:
参考链接: PlistBuddy简单使用
Shell脚本--变量(后附简单shell脚本案例)!
shell脚本
一、Shell脚本概述
shell脚本是利用shell的功能所写的一个程序,这个程序是使用可执行文件,将一些shell的语法和命令写在里面,搭配正则表达式,管道命令与重定向等功能,来达到我们所要的处理的目的
1.1shell脚本应用场景
- 重复性操作
- 交互性任务
- 批量事务处理
- 服务运行状态监控
- 定时任务执行
- 简易入侵检测功能
1.2重定向操作
< :从指定的文件读取数据,而不是从键盘输入
> :将输出结果保存到指定文件,会覆盖文件原内容
>> :将输出结果追加到文件内的尾部
2> :将错误信息保存到指定文件,覆盖文件内容
2>> :将错误信息追加到指定文件中
&> :将标准输出、标准错误的内容保存到同一个文件中
1.3整数变量的运算
expr 变量名 运算符 变量名
echo $[ 变量运算符变量 ] 也可以是 :echo $(( 变量运算符变量 ))
在这里插入代码片[root@localhost ~]# expr 2 + 2
4
[root@localhost ~]# expr 3 / 2 //取整数
1
[root@localhost ~]# expr 1 / 2
0
[root@localhost ~]# expr 5 % 2 //取余数
1
[root@localhost ~]# echo $ [ 2+2 ]
$ [ 2+2 ]
[root@localhost ~]# echo $[ 2+2 ]
4
[root@localhost ~]# echo $[ 2**5 ] //2的5次方
32
[root@localhost ~]# a=3
[root@localhost ~]# b=2
[root@localhost ~]# echo $[ $a+$b ]
5
[root@localhost ~]# echo "3.14+2" | bc //计算带小数点的用bc计算器,
5.14
[root@localhost ~]# echo "2^5" | bc //bc计算器中的平方用的是^符号
32
[root@localhost ~]# ls
anaconda-ks.cfg initial-setup-ks.cfg y.sh yum.sh 公共 模板 视频 图片 文档 下载 音乐 桌面
[root@localhost ~]# touch ttt.txt
[root@localhost ~]# ls > ttt.txt
[root@localhost ~]# cat ttt.txt
anaconda-ks.cfg initial-setup-ks.cfg ttt.txt y.sh yum.sh
公共 模板 视频 图片 文档 下载 音乐 桌面
[root@localhost ~]# ls xxx
ls: 无法访问xxx: 没有那个文件或目录
[root@localhost ~]# ls xxx 2> ttt.txt
[root@localhost ~]# cat ttt.txt
ls: 无法访问xxx: 没有那个文件或目录
[root@localhost ~]# echo 222 > ttt.txt
[root@localhost ~]# cat ttt.txt
222
[root@localhost ~]# cat < ttt.txt
222
二、Shell脚本变量
2.1自定义变量
- 也叫局部变量,只是临时添加的变量
- 添加变量 :变量名=变量值,变量名由字母、数字、下划线组成,不能以数字开头,不能是特殊符号,区分大小写
变量名=变量值 :添加变量
unset 变量名 :删除变量
set :查看当前系统所有变量
declare -i 变量 :设定变量为整数类型变量
readonly 变量 :将变量赋值后可设定变量为只读,将不能删除变量和更改变量赋值
read 变量名 :会进入交互模式,在下面输入参数即可
read -p "文字描述:" 变量名 :以文字提示赋值变量
read -n 5 -p "文字描述:" 变量名 :赋值变量的字符数最多为5个
赋值时添加引号
- 双引号:允许通过$符号引用其他变量值
- 单引号:禁止引用变量值,$视为普通字符
- 反撇号:命令替换,提取命令执行后的输出结果,也可以用$()
[root@localhost ~]# a=whd
[root@localhost ~]# echo $a //这里的$表示引用变量
whd
[root@localhost ~]# let a=a+1 //给a加1赋值,如果a以赋值字母,则赋值为1
[root@localhost ~]# a="hello wold"
[root@localhost ~]# echo $a
hello wold
[root@localhost ~]# A=88
[root@localhost ~]# echo $A
88
[root@localhost ~]# unset A
[root@localhost ~]# echo $A
[root@localhost ~]#
[root@localhost ~]# a=10
[root@localhost ~]# declare -i a //设定为整数型变量后,器变量值只能为整数
[root@localhost ~]# a=whd
[root@localhost ~]# echo $a
0
[root@localhost ~]# py=66
[root@localhost ~]# pb="pp $66"
[root@localhost ~]# echo $py
66
[root@localhost ~]# echo $pb
pp 6
[root@localhost ~]# b=`date` //这里双斜点表示将命令赋值给变量
[root@localhost ~]# echo $b
2021年 06月 01日 星期二 14:35:59 CST
[root@localhost ~]# c=$(date) //$()跟双斜点相同
[root@localhost ~]# echo $c
2021年 06月 01日 星期二 14:36:32 CST
[root@localhost ~]# rpm -ql $(rpm -qf $(which rz))
/usr/bin/rb
/usr/bin/rx
/usr/bin/rz
/usr/bin/sb
/usr/bin/sx
/usr/bin/sz
/usr/share/locale/de/LC_MESSAGES/lrzsz.mo
/usr/share/man/man1/rz.1.gz
/usr/share/man/man1/sz.1.gz
[root@localhost ~]# readonly b
[root@localhost ~]# b=88
-bash: b: 只读变量
[root@localhost ~]# unset b
-bash: unset: b: 无法反设定: 只读 variable
[root@localhost ~]# read namde
whd
[root@localhost ~]# read name
whd
[root@localhost ~]# echo $name
whd
[root@localhost ~]# read -p "请输入姓名:" name
请输入姓名:zhangsan
[root@localhost ~]# echo $name
zhangsan
[root@localhost ~]# read -p "请输入密码:" pass
请输入密码:123
[root@localhost ~]# echo $pass
123
2.2环境变量
系统已定义好的全局变量,其变量名必须是大写
env :查看系统中所有的环境变量
vim /etc/profile :编辑环境变量,可以永久性添加环境变量
[root@localhost ~]# export aa=10 //临时将自定义变量加入环境变量中
[root@localhost ~]# env | grep aa
aa=10
[root@localhost ~]# export PATH=$PATH:/root //临时将/root目录加入环境变量中
[root@localhost ~]# vim /etc/profile //将/root目录永久加入环境变量中
2.3位置变量
[root@localhost ~]# vim wz.sh
#!/bin/bash
echo $0 //$0表示当前执行的脚本
echo $1 //$1表示第一个参数
echo $2 //$2表示第二个参数
echo $n //表示第n个参数
[root@localhost ~]# chmod +x wz.sh //给予文件可执行权限
[root@localhost ~]# ./wz.sh a b //脚本有位置变量,在执行脚本时需要根据位置变量添加参数
./wz.sh
a
b
[root@localhost ~]# vim user.sh
#!/bin/bash
#创建用户
useradd $1
echo "$2" | passwd --stdin $1
[root@localhost ~]# chmod +x user.sh
[root@localhost ~]# ./user.sh wangwu 123
更改用户 wangwu 的密码 。
passwd:所有的身份验证令牌已经成功更新。
2.4预定义变量
由bash程序预先定义好的特殊变量,无法创建新的预定义变量,也不能给预定义变量赋值
$# :表示命令行中位置参数的个数
$* :表示所有位置参数的内容,这些内容为一个整体
$? :表示前一条命令执行后的结果,如果是0表示执行成功,如果是非0数,表示执行失败
$$ :表示当前进程的进程号
$! :表示最后一个后台进程的进程号
$@ :表示所有位置参数内容,这些内容不为一个整体
[root@localhost ~]# ls xxx
ls: 无法访问xxx: 没有那个文件或目录
[root@localhost ~]# echo $?
2 //非0数字表示上个命令为成功
[root@localhost ~]# ls
anaconda-ks.cfg initial-setup-ks.cfg ttt.txt user.sh wz.sh y.sh yum.sh 公共 模板 视频 图片 文档 下载 音乐 桌面
[root@localhost ~]# echo $?
0 //表示上个命令成功
[root@localhost ~]# sleep 1000 & //将进程放入后台
[1] 84863
[root@localhost ~]# echo $!
84863
三、简单Shell脚本编辑
3.1shell脚本执行的基本命令
bash或者sh 脚本文件 :在当前shell环境再开一个shell环境执行
source 脚本文件 :在当前shell环境执行
在脚本文件所属目录下时也可以使用:./脚本文件 .脚本文件
bash -x 脚本文件 :测试脚本文件中每一行是否有问题
bash -n 脚本文件 :测试脚本文件中出现的语法问题
也可以给予脚本文件可执行权限,并加入环境变量中,其脚本文件名即可直接执行
[root@localhost ~]# vim whd.sh
#!/bin/bash
#:这是一个最简单的脚本文件
sleep 1000
[root@localhost ~]# bash whd.sh
[root@localhost ~]# source whd.sh
3.2shell脚本设置本地yum仓库
[root@localhost ~]#vim yum.sh
#!/bin/bash //第一行的#表示声明使用的时bash语法,后面的开头#表示注释
#这是一个安装本地yum仓库的脚本
#挂载光盘
mount /de0/sr0 /mnt
#创建目录用作备份
mkdir /etc/yum.repos.d/bak
mv /etc/yum.repos.d/* /etc/yum.repos.d/bak
echo "[centos7]
name=whd
baseurl=file:///mnt
enabled=1
gpgcheck=0" >> /etc/yum.repos.d/yum.repo
#清理yum源
yum clean all
#更新yum源
yum makecache
#查看结果
yum repolist
oot@localhost ~]# vim yum.sh
[root@localhost ~]# bash yum.sh //执行shell脚本
mount: /dev/sr0 写保护,将以只读方式挂载
mkdir: 无法创建目录"/etc/yum.repos.d/bak": 文件已存在
mv: 无法将目录"/etc/yum.repos.d/bak" 移动至自身的子目录"/etc/yum.repos.d/bak/bak" 下
已加载插件:fastestmirror, langpacks
正在清理软件源: centos7
Cleaning up list of fastest mirrors
已加载插件:fastestmirror, langpacks
Determining fastest mirrors
centos7 | 3.6 kB 00:00:00
(1/4): centos7/group_gz | 166 kB 00:00:00
(2/4): centos7/filelists_db | 3.2 MB 00:00:00
(3/4): centos7/primary_db | 3.1 MB 00:00:00
(4/4): centos7/other_db | 1.3 MB 00:00:00
元数据缓存已建立
已加载插件:fastestmirror, langpacks
Loading mirror speeds from cached hostfile
源标识 源名称 状态
centos7 whd 4,021
repolist: 4,021
3.3下载服务器的shell脚本
[root@localhost ~]# vim server.sh
#!/bin/bash
#这是一个下载各种服务的脚本
read -p "请输入服务名:" soft
yum install -y $soft
~
[root@localhost ~]# bash server.sh
请输入服务名:httpd
已加载插件:fastestmirror, langpacks
Loading mirror speeds from cached hostfile
* base: mirrors.ustc.edu.cn
* extras: mirrors.ustc.edu.cn
* updates: mirrors.ustc.edu.cn
软件包 httpd-2.4.6-97.el7.centos.x86_64 已安装并且是最新版本
3.4创建新用户并给予密码
[root@localhost ~]# vim user.sh
#!/bin/bash
#这是一个新建用户的脚本
read -p "请输入客户名:" username
read -p "请输入密码:" pass
useradd $username
echo "$pass" | passed --stdin $username
id $username
[root@localhost ~]# bash user.sh
请输入客户名:lisi
请输入密码:123
更改用户 lisi 的密码 。
passwd:所有的身份验证令牌已经成功更新。
uid=1002(lisi) gid=1002(lisi) 组=1002(lisi)
3.5shell脚本小练习
echo -n :不换行显示
echo -e :转义作用
echo -e “hello\\c” :不换行显示
echo -e “hello\\n” :换行显示并加一行回车
echo -e “\\e[33mhello\\e[0m” :变色显示
[root@localhost ~]# vim table.sh
#!/bin/bash
name=`whoami`
d=`pwd`
c=`hostname`
time=`date +%Y-%m-%d\\ %H:%M:%S`
pid=`ps -ef | wc -l`
user=`users | wc -w`
echo "-----------------------------------------------------------------"
echo "# System Info Table #"
echo "# 当前登陆用户为:$name #"
echo "# 当前登录目录为:$d #"
echo "# 当前登录主机为:$c #"
echo "# 当前系统时间为:$time #"
echo "# 当前系统运行的进程数为:$pid #"
echo "# 当前系统登录的用户数为:$user #"
echo "# 任何问题请联系:110 #"
echo "-----------------------------------------------------------------"
设置文字变色
第一种方法:
[root@localhost ~]# vim table.sh
#!/bin/bash
name=`whoami`
d=`pwd`
c=`hostname`
time=`date +%Y-%m-%d\\ %H:%M:%S`
pid=`ps -ef | wc -l`
user=`users | wc -w`
echo -e "-----------------------------------------------------------------\\e[2;70H"
echo -e "\\e[1;32m# System Info Table \\e[3;70H#\\e[0m"
echo -e "\\e[1;31m# 当前登陆用户为:$name \\e[4;70H#\\e[0m"
echo -e "\\e[1;33m# 当前登录目录为:$d \\e[5;70H#\\e[0m"
echo -e "\\e[1;34m# 当前登录主机为:$c \\e[6;70H#\\e[0m"
echo -e "\\e[1;35m# 当前系统时间为:$time \\e[7;70H#\\e[0m"
echo -e "\\e[1;36m# 当前系统运行的进程数为:$pid \\e[8;70H#\\e[0m"
echo -e "\\e[1;37m# 当前系统登录的用户数为:$user \\e[9;70H#\\e[0m"
echo -e "\\e[1;31m# 任何问题请联系:110 \\e[10;70H#\\e[0m"
echo -e "-----------------------------------------------------------------\\e[11;70H"
设置完先清屏
第二种方法:
以上是关于Shell脚本的主要内容,如果未能解决你的问题,请参考以下文章