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的语法和命令写在里面,搭配正则表达式,管道命令与重定向等功能,来达到我们所要的处理的目的

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脚本的主要内容,如果未能解决你的问题,请参考以下文章

Shell脚本--变量(后附简单shell脚本案例)!

shell脚本翻译 急求

shell脚本书写方法

如何在shell脚本里调用另一个shell脚本

shell脚本获取参数&在线执行shell脚本

shell脚本中#是啥意思