Shell脚本

shell和指令的区别

Shell是一种命令行解释器,负责解析用户输入的命令,并将其转换为计算机可识别的指令执行。Shell通常提供了命令行环境、变量、函数、条件语句、循环语句等功能,可以帮助用户编写脚本来自动化执行一些任务。

指令是一种操作系统提供的基本命令,用于执行某些特定的操作。指令可以从命令行输入,也可以从脚本中调用。常见的指令有ls(列出目录中的文件)、cd(切换当前工作目录)、rm(删除文件)、mkdir(创建目录)等。

因此,区别在于Shell是命令行解释器,可以通过编写脚本来自动化执行任务,并提供了更多的功能;而指令是操作系统提供的基本命令,用于执行特定的操作。

shell对明文密码的加密

shell脚本使用base64编码加密方法对各种明码进行加密使用起来比较方便,不需要安装依赖包也不需要开发额外代码。
(注意:明文密码中应注意反引号`、感叹号 !、双引号"以及$符号后面跟数字或者字母或者$,需要在字符前面加上\进行转义)
加密方法
加密:echo “密码”|base64 -i
解密:echo “加过密的密码”|base64 -d

#例:对abcqwe进行加密,加密玩需要进行解密验证
[root@localhost /]# echo "abcqwe"|base64 -i    
YWJjcXdlCg==
[root@localhost /]# echo "YWJjcXdlCg=="|base64 -d
abcqwe 

shell脚本加密

  1. 系统自带gzexe
#加密命令
gzexe shellname.sh
# 此时在目录下就会产生一个shellname.sh~文件,该文件是源文件,shellname.sh是加密后的文件(注意:执行加密的文件跟执行源文件没有区别)
#解秘命令
gzexe -d shellname.sh
# 此时在目录下就会产生一个shellname.sh~文件,该文件是加密文件,shellname.sh是解密后的文件

shell定义数组

方法1:
数组名=(value0 value1 value2 …)
方法2:
数组名=([0]=value1 [1]=value2 [2]=value3 …)

添加数组值

添加方式语法可添加多个值下标必须连续添加后下标改变可能覆盖原有元素
下标添加array[index]=value
数组长度添加arry[ ${#array[@]}]=value
arry[ ${#array[*]}]=value
重新创建数组array=(“${array[@]” value1…valueN)
赋值运算符(+=)arry+=(value1…valueN)

解释: ${#array[*]}或 ${#array[@]} 是获取数组长度
解释: ${array[*]}或 ${array[@]} 是获取整个数组

删除数组值

# 删除'b'
array=(a b c d a b c d)
array=( ${array[*]/b} ) 
#将*换成 @, 结果一致
echo ${array[*]}
#----------------------
a c d a c d
#一个数组排除另一个数组的值
#原数组
arry=(a b c d a b c d)
#需要排除的数组
arrys=(b c)

for element in ${arrys[@]}
do
arry=( ${arry[*]/${element}} )
done
echo ${arry[@]}
#----------------------
a d a d

遍历数组的方法

array=( 1 2 3 4 5)
#标准的for循环
for(( i=0;i<${#array[@]};i++)) do
#${#array[@]}获取数组长度用于循环
echo ${array[i]};
done;
#for...in循环
#遍历(不带数组下标):
for element in ${array[@]}
#也可以写成for element in ${array[*]}
do
echo $element
done

#遍历(带数组下标):
for i in "${!array[@]}";
doecho ${array[$i]}
done
#While循环法
i=0
while [ $i -lt ${#array[@]} ]
#当变量(下标)小于数组长度时进入循环体
doecho ${ array[$i] }#按下标打印数组元素let i++
done

Here Document

语法格式:
<<标记 (此处标记前面的空格可以被忽略)
内容
标记 (输入追加定向,结尾标记必须顶格写,它前面和后面不能有任何字符,包括空格)
四点注意事项:
1. 标记可以使用任意的合法字符;
2. 结尾的标记一定要顶格写,前面不能有任何字符;
3. 结尾的标记后面也不能有任何字符(包括空格);
4. 开头的标记前后的空格会被省略。

Here Document写入文件的三种方式

#>直接覆盖文件内的内容,>>向文件内追加内容
cat >demo.txt <<eof
cat <<eof >demo.txt
tee  demo.txt <<eof

Here Document简单应用

#直接输出内容
[root@localhost /]# cat <<eof
> 1. 开始
> 2. 结束
> eof
1. 开始
2. 结束
#将输入保存到文件,它会新建文件并保存
[root@localhost /]# cat > demo.txt <<eof
1. 开始
2. 结束
eof
[root@localhost /]# cat demo.txt 
1. 开始
2. 结束
#将输入内容追加并保存到文件
[root@localhost /]# cat >> demo.txt <<eof
3. demo 
eof    
[root@localhost /]# cat demo.txt         
1. 开始
2. 结束
3. demo
# read命令赋值免交互
[root@localhost /]# read demo <<eof
> 123456
> eof
[root@localhost /]# echo $demo 
123456
#更改用户密码免交互
[root@localhost /]# passwd root <<eof
> 123456
> 123456
> eof
更改用户 root 的密码 。
新的 密码:无效的密码: 密码少于 8 个字符
重新输入新的 密码:passwd:所有的身份验证令牌已经成功更新。
#通过变量转换向文件中输入变量的值免交互
[root@localhost /]# demo=10
[root@localhost /]# cat > demo.txt <<eof
$demo
eof
[root@localhost /]# cat demo.txt        
10
#关闭变量转换向文件中输入变量名称免交互(注:通过给开始标记(eof)加''实现关闭变量转换('eof'))
[root@localhost /]# cat > demo.txt <<'eof'
$demo
eof
[root@localhost /]# cat demo.txt          
$demo

免交互修改密码

#创建用户
useradd user
#第一种
#格式:
#passwd  用户名 <<EOF
#密码
#密码
#EOF
passwd  user <<EOF
123456
123456
EOF
#第二种
#格式:echo '密码'| passwd --stdin 用户名
echo '123456'| passwd --stdin user
#第三种
格式:# echo 用户名:密码 | chpasswd
echo root:123456 | chpasswd

shell yum查找软件包

#安装ifconfig,直接yum -y install ifconfig 会提示:没有可用软件包 ifconfig。用 yum search ifconfig 搜索软件包然后安装
[root@localhost ~]# yum search ifconfig
已加载插件:fastestmirror
Determining fastest mirrors
 * base: mirrors.bupt.edu.cn
 * extras: mirrors.huaweicloud.com
 * updates: mirrors.bfsu.edu.cn
base                                                     | 3.6 kB     00:00
extras                                                   | 2.9 kB     00:00
updates                                                  | 2.9 kB     00:00
(1/4): base/7/x86_64/group_gz                              | 153 kB   00:00
(2/4): extras/7/x86_64/primary_db                          | 250 kB   00:00
(3/4): base/7/x86_64/primary_db                            | 6.1 MB   00:00
(4/4): updates/7/x86_64/primary_db                         |  23 MB   00:01
================================ 匹配:ifconfig ================================
net-tools.x86_64 : Basic networking tools
[root@localhost ~]# yum -y install net-tools.x86_64

shell获取当前目录名称

[root@localhost ~]# directory_name=`pwd | awk -F "/" '{print $NF}'`
[root@localhost ~]# echo $directory_name                           
root

shell 获取本机的网卡名称

#ls获取本机的网卡名称
ls /sys/class/net
#ifconfig获取本机的网卡名称
ifconfig | grep -o '^[^ ]*'
#netstat -i获取本机的网卡名称
netstat -i | awk '{print $1}' | sed '1,2d'
#nmcli device show获取本机的网卡名称
nmcli device show | grep DEVICE | awk '{print $2}'

cat命令

#打印filename所有内容
cat filename
#打印filename前100的内容  
cat filename head -n 100
#打印filename最后100行的数据
cat filename tail -n 100
#查看filename最后100行的数据
cat filename | tail -n 100
#查看filename的100到300行的数据
cat filename | head -n 300 | tail -n +100

简易菜单

#!/bin/bash
{
cat<<EOF
    欢迎使用****
    
        1.登录
        2.设置
        3.退出    
EOF
}
read -ep "请选择你要执行的操作[1-3]:" num
if [ "$num" == "1" ];then
        echo 正在登录
elif [ "$num" ==  "2" ];then
        echo 设置

elif [ "$num" ==  "3" ];then
        exit
fi

shell df -h如何只显示特定目录文件系统的设备名称或者路径

示例:
[root@localhost update]# df -h
文件系统                 容量  已用  可用 已用% 挂载点
devtmpfs                 1.9G     0  1.9G    0% /dev
tmpfs                    1.9G     0  1.9G    0% /dev/shm
tmpfs                    1.9G  8.6M  1.9G    1% /run
tmpfs                    1.9G     0  1.9G    0% /sys/fs/cgroup
/dev/mapper/centos-root   50G  4.8G   46G   10% /
/dev/mapper/centos-home  146G   33M  146G    1% /home
/dev/vda1               1014M  153M  862M   16% /boot
/dev/vdb                 197G   61M  187G    1% /demo
tmpfs                    379M     0  379M    0% /run/user/0
[root@localhost update]# df -h | grep "/demo" | awk '{print $1}'
/dev/vdb
[root@localhost update]# df -h --output=source /demo           
文件系统
/dev/vdb
#解释
df -h | grep "/demo" | awk '{print $1}'
# grep "/demo" df -h只显示/demo的信息,awk '{print $1}'之输出结果的第一列。awk '{print $1,$6}'之输出结果的第一列和第六列。

shell关于mariadb操作

shell备份数据库中的表

#user更改为用户名
#passwd更改为密码
#database更改为包含要备份的数据库表的数据库名
#table更改为包含要备份的表名
#/bak表示备份路径
mysqldump -uuser -ppasswd database table > /bak/table.sql

shell还原表数据到数据库中的表内

#user更改为用户名
#passwd更改为密码
#database更改为包含要备份的数据库表的数据库名
#table更改为包含要备份的表名
#/bak读取sql文件的路径
mysql -uuser -ppasswd -e "use database;source /bak/dbup.sql;";

配置mariiadb root密码为123456:

# /usr/bin/mysqladmin -u root password '123456'

if判断

if 使用方法

  1. 单分支
    语法:
    if [ 判断条件 ];then
    条件执行的语句
    fi
  2. 双分支
    语法:
    if [ 判断条件 ];then
    条件执行的语句
    else
    条件执行的语句2
    fi
  3. 多分支
    语法:
    if [ 判断条件 ];then
    条件执行的语句
    elif [ 判断条件 ];then
    条件执行的语句2
    else
    条件执行的语句3
    fi

文件比较与检查

文件比较运算符含义示例
-e如果文件或目录存在,则为真[ -e /file ]
-d如果文件存在且为目录,则为真[ -d /file ]
-f如果文件存在且为文件,则为真[ -f /usr/bin/grep.sh ]
-L如果文件存在文件为符号链接,则为真[ -L /usr/bin/grep.sh ]
-r如果文件存在文件且可读,则为真[ -r /usr/bin/grep.sh ]
-w如果文件存在文件且可写,则为真[ -w /var//usr/bin/grep.sh ]
-x如果文件存在且为可执行文件,则为真[ -x /usr/bin/grep.sh ]
-s如果文件长度不为0,则为真[ -s /usr/bin/grep.sh ]
-h如果文件是软链接,则为真[ -h /usr/bin/grep.sh ]
-nt如果文件1比文件2新,则为真[ /usr/bin/demo.sh -nt /bin/demo.sh ]
-ot如果文件1比文件2旧,则为真[ /usr/bin/demo.sh -ot /bin/demo.sh ]

整数变量表达式

比较运算符含义示例
-eq等于则条件为真[ 120 -eq 20 ]
-lt小于则条件为真[ 120 -lt 20 ]
-le小于等于则条件为真[ 120 -le 20 ]
-ne不等于则条件为真[ 120 -ne 20 ]
-gt大于则条件为真[ 120 -gt 20 ]
-ge大于等于则条件为真[ 120 -ge 20 ]

字符串比较运算符

比较运算符含义示例
==如果demo1等于demo2,则为真。字符串允许使用赋值号做等号。[ $demo1 == $demo2 ]
!=如果demo1不等于demo2,则为真。[ $demo1 != $demo2 ]
-n如果demo 非空,则为真。[ -n $demo ]
-z如果demo 为空,则为真。[ -z $demo ]

逻辑运算

逻辑与 –a
if [ 表达式1 –a 表达式2 ]:条件表达式的与

逻辑或 -o
if [ 表达式1 –o 表达式2 ]:条件表达式的或

配置定时任务

#安装工具
yum -y install ntp ntpdate
#同步网络时间
ntpdate cn.pool.ntp.org
#ntpdate cn.pool.ntp.org写入sh脚本
# 配置定时任务
crontab -e 
#配置定时任务,半分钟同步一次,命令如下:
30 * * * * 执行脚本路径 >> /root/ntpdate.log 2>&1
*    *    *    *    *
|    |    |    |    |
|    |    |    |    +----- 星期中星期几 (0 - 6) (星期天 为0)
|    |    |    +---------- 月份 (1 - 12) 
|    |    +--------------- 一个月中的第几天 (1 - 31)
|    +-------------------- 小时 (0 - 23)
+------------------------- 一小时中的某分钟 (0 - 59)
* :取值范围内的所有数字
/ :每过多少个数字
- :从X到Z
,:多个数字
例子:
* * * * * 任务指令每分钟分钟执行一次任务指令
1,15 * * * * 任务指令每小时的第1和第15分钟执行
1,15 2-4 * * * 任务指令在上午2点到4点的第1和第15分钟执行
1,15 2-4 */3 * * 任务指令每隔3天的上午2点到4点的第1和第15分钟执行
1,15 2-4 * * * 1 任务指令每周一上午2点到4点的第1和第15分钟执行

删除符合条件的目录或文件

find命令格式:
find path -option 【 -print 】 【 -exec -ok |xargs |grep 】 【 command {} ; 】
find命令的参数:
1)path:要查找的目录路 径。
    ~ 表示$HOME目录
   . 表示当前目录
   / 表示根目录
2)print:表示将结果输出到标准输出。

3)exec:对匹配的文件执行该参数所给出的shell命令。
形式为command {} \;,注意{}与\;之间有空格

4)ok:与exec作用相同,
区别在于,在执行命令之前,都会给出提示,让用户确认是否执行

5)|xargs 与exec作用相同 ,起承接作用

区别在于 |xargs 主要用于承接删除操作 ,而 -exec 都可用 如复制、移动、重命名等

6)options :表示查找方式

options常用选项效果
-name filename查找名为filename的文件
-perm按执行权限来查找
-user username按文件属主来查找
-group groupname按组来查找
-mtime(min) -n +n按文件更改时间来查找文件,-n指n天(分钟)以内,+n指n天(分钟)以前
-atime(min) -n +n按文件访问时间来查找文件,-n指n天(分钟)以内,+n指n天(分钟)以前
-ctime(min) -n +n按文件创建时间来查找文件,-n指n天(分钟)以内,+n指n天(分钟)以前
-nogroup查无有效属组的文件,即文件的属组在/etc/groups中不存在
-nouser查无有效属主的文件,即文件的属主在/etc/passwd中不存
-type b/d/c/p/l/f查是块设备(b)、目录(d)、字符设备(c)、管道(p)、符号链接(l)、普通文件(f)
-size n[c]查长度为n块[或n字节]的文件
-mount查文件时不跨越文件系统mount点
-follow如果遇到符号链接文件,就跟踪链接所指的文件
-prune忽略某个目录
  1. 使用find命令删除当前目录下符合条件的目录
    find . -type d -name 001 -exec rm -rf {} +
    • . 表示在当前目录执行
    • -type d 只搜索目录
    • -name 指定目录名称
    • -exec rm -rf 执行rm命令删除所有目录即内容
    • {} + 追加在rm命令末尾
  2. 使用find命令删除当前目录下所有空目录
    find . -type d -empty -delete
    • -empty 只对空目录进行限制
    • -delete 删除包括子目录在内的所有空目录
  3. 删除指定目录下所有符合条件的文件
    find /bak -mmin +10 -type f -name “-.bak” -exec rm -Rf {} \;
    • -mmin -n +n #按文件更改时间来查找文件,-n指n分钟以内,+n指n分钟以前
    • -type f #查是普通文件
    • {}:是一个占位符,表示 find 命令在匹配到的每个文件上执行命令时将其替换为相应的文件路径
    • \; :是用于标记 -exec 选项的结束符号,表示命令执行的结束。
  4. 在当前目录及子目录中,查找大写字母开头的txt文件
    find . -name ‘[A-Z]*.txt’ -print
  5. 在当前目录及子目录中,查找大写小写字母开头的txt文件
    find . -name ‘[A-Z,a-z]*.txt’ -print
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

烤鱼骑不快

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值