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脚本加密
- 系统自带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[@]}";
do
echo ${array[$i]}
done
#While循环法
i=0
while [ $i -lt ${#array[@]} ]
#当变量(下标)小于数组长度时进入循环体
do
echo ${ 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 使用方法
- 单分支
语法:
if [ 判断条件 ];then
条件执行的语句
fi - 双分支
语法:
if [ 判断条件 ];then
条件执行的语句
else
条件执行的语句2
fi - 多分支
语法:
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 | 忽略某个目录 |
- 使用find命令删除当前目录下符合条件的目录
find . -type d -name 001 -exec rm -rf {} +- . 表示在当前目录执行
- -type d 只搜索目录
- -name 指定目录名称
- -exec rm -rf 执行rm命令删除所有目录即内容
- {} + 追加在rm命令末尾
- 使用find命令删除当前目录下所有空目录
find . -type d -empty -delete- -empty 只对空目录进行限制
- -delete 删除包括子目录在内的所有空目录
- 删除指定目录下所有符合条件的文件
find /bak -mmin +10 -type f -name “-.bak” -exec rm -Rf {} \;- -mmin -n +n #按文件更改时间来查找文件,-n指n分钟以内,+n指n分钟以前
- -type f #查是普通文件
- {}:是一个占位符,表示 find 命令在匹配到的每个文件上执行命令时将其替换为相应的文件路径
- \; :是用于标记 -exec 选项的结束符号,表示命令执行的结束。
- 在当前目录及子目录中,查找大写字母开头的txt文件
find . -name ‘[A-Z]*.txt’ -print - 在当前目录及子目录中,查找大写小写字母开头的txt文件
find . -name ‘[A-Z,a-z]*.txt’ -print