Shell编辑器

shell

概述

shell:命令行解释器,相当于翻译官

shell种类 

#/bin/sh与/bin/bash是同一个shell
[root@discuz ~]# ll /bin/sh
lrwxrwxrwx. 1 root root 4 1月  11 07:06 /bin/sh -> bash
[root@discuz ~]# ll /bin/bash
-rwxr-xr-x. 1 root root 964536 11月 25 2021 /bin/bash
[root@discuz ~]# chsh -l   ##查看系统可用的shell
/bin/sh
/bin/bash
/usr/bin/sh
/usr/bin/bash
[root@discuz ~]# cat /etc/shells
/bin/sh
/bin/bash
/usr/bin/sh
/usr/bin/bash
[root@discuz ~]# echo $shell
bash
[root@discuz ~]# chsh -s /bin/bash user3    ##修改用户shell从/sbin/nulogin改为/bin/bash;使其可以登录系统
[root@discuz ~]# bash -c date  ##调用shell执行命令
2025年 01月 28日 星期二 10:12:01 CST
[root@discuz ~]# sh -c date
2025年 01月 28日 星期二 10:12:07 CST

shell调用 

基本写法 

[root@discuz ~]# vi 1.sh
[root@discuz ~]# cat 1.sh 
#!/bin/bash
#name:     #注释行,可添加注释信息
rm -rf /tmp/*
touch /tmp/{1..5}.txt
echo "hello" > /tmp/1.txt
cat /tmp/1.txt
ls /tmp/

变量

本地变量

 注意:"变量名"和"变量值"之间的"="不能有空格

[root@discuz ~]# a=1
[root@discuz ~]# echo $a
1
[root@discuz ~]# b="$a"2    #将变量值应用到新的变量
[root@discuz ~]# echo $b
12
[root@discuz ~]# c="${a}3"
[root@discuz ~]# echo $c
13
[root@discuz ~]# c=`date`   ##为变量赋值
[root@discuz ~]# echo $c   
2025年 01月 28日 星期二 10:36:17 CST
[root@discuz ~]# d=$(date)
[root@discuz ~]# echo $c
2025年 01月 28日 星期二 10:36:17 CST
关闭终端,变量将消亡
[root@discuz ~]# set   ##查看系统所有的本地变量
...
HISTCONTROL=ignoredups
HISTFILE=/root/.bash_history
HISTFILESIZE=1000
HISTSIZE=1000
[root@discuz ~]# echo $HISTSIZE   ##尝试验证本地变量
1000
[root@discuz ~]# echo $HOME
/root
[root@discuz ~]# echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin
[root@discuz ~]# echo $a $b $c    ##查看多个变量
1 12 2025年 01月 28日 星期二 10:36:17 CST
[root@discuz ~]# unset a     ##删除本地变量
[root@discuz ~]# echo $a
[root@discuz ~]# unset b
[root@discuz ~]# unset c
[root@discuz ~]# echo $a $b $c
数组变量 

#定义变量:变量名=值
[root@discuz ~]# a=1
[root@discuz ~]# echo $a
1
[root@discuz ~]# b="$a"2    #将变量值应用到新的变量
[root@discuz ~]# echo $b
12
[root@discuz ~]# c="${a}3"
[root@discuz ~]# echo $c
13
[root@discuz ~]# c=`date`   ##为变量赋值
[root@discuz ~]# echo $c   
2025年 01月 28日 星期二 10:36:17 CST
[root@discuz ~]# d=$(date)
[root@discuz ~]# echo $c
2025年 01月 28日 星期二 10:36:17 CST
关闭终端,变量将消亡
[root@discuz ~]# set   ##查看系统所有的本地变量
...
HISTCONTROL=ignoredups
HISTFILE=/root/.bash_history
HISTFILESIZE=1000
HISTSIZE=1000
[root@discuz ~]# echo $HISTSIZE   ##尝试验证本地变量
1000
[root@discuz ~]# echo $HOME
/root
[root@discuz ~]# echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin
[root@discuz ~]# echo $a $b $c    ##查看多个变量
1 12 2025年 01月 28日 星期二 10:36:17 CST
[root@discuz ~]# unset a     ##删除本地变量
[root@discuz ~]# echo $a
[root@discuz ~]# unset b
[root@discuz ~]# unset c
[root@discuz ~]# echo $a $b $c
#--
[root@discuz day02]# vim 1.sh
[root@discuz day02]# 
[root@discuz day02]# cat 1.sh 
数组定义 数组名=(元素1 元素2 元素3 元素4...)
#                  0     1     2     3
#下标从0开始
#获取元素值:echo ${数组名[下标]}
[root@discuz ~]# name=(jin jack lily lucy)
[root@discuz ~]# echo ${name[0]}
jin
[root@discuz ~]# echo ${name[1]}
jack
[root@discuz ~]# echo ${name[2]}
lily
[root@discuz ~]# echo ${name[3]}
lucy
#--列出数组中所有的元素值,也称为数组的遍历
#获取所有元素值:echo ${数组名[*]}
[root@discuz ~]# echo ${name[*]}
jin jack lily lucy
[root@discuz ~]# echo ${name[@]}
jin jack lily lucy
#获取所有元素下标:echo ${!数组名[*]}
[root@discuz ~]# echo ${!name[*]}
0 1 2 3
#获取元素总个数:echo ${#name[*]}
[root@discuz ~]# echo ${#name[*]}
4
#添加一个元素:数组名[下标]
[root@discuz ~]# name[4]=tom
[root@discuz ~]# echo ${name[*]}
jin jack lily lucy tom
#删除一个元素:unset 数组名[下标]
[root@discuz ~]# unset name[0]
[root@discuz ~]# echo ${name[*]}
jack lily lucy tom
#删除整个数组:unset 数组名
[root@discuz ~]# unset name
[root@discuz ~]# echo ${name[*]}   ##验证

 变量的类型

环境变量 

[root@discuz ~]# export a=1    ##定义环境变量,不受终端影响
[root@discuz ~]# echo $a
1
[root@discuz ~]# bash     ##切换终端
[root@discuz ~]# echo $a
1
[root@discuz ~]# b=2        ##定义本地变量,将随终端消亡
[root@discuz ~]# echo $b
2
[root@discuz ~]# bash
[root@discuz ~]# echo $b

[root@discuz ~]#
 内置变量

$?:查看上一条命令的执行结果
[root@discuz day02]# echo $?  ##上一条命令运行正常,非0表示不正常
0
$$:查看当前终端的进程号
[root@discuz ~]# echo $$    ##查看当前终端的进程号
3950
[root@discuz ~]# ps -ef | grep 3854
root       3975   3950  0 15:17 pts/0    00:00:00 grep --color=auto 3854
[root@discuz ~]# kill -9 `echo $$`   ##杀掉当前进程,相当于exit

Connection closed.

Disconnected from remote host(192.168.81.130:22) at 15:18:02.

Type 'help' to learn how to use Xshell prompt.
[C:\~]$ 
[root@discuz ~]# ll /etc/passwd    ##命令参数为/etc/passwd
-rw-r--r--. 1 root root 1052 1月  27 22:27 /etc/passwd
!$:调用上一条命令的参数
[root@discuz ~]# cat !$     ##调用上一条命令的参数
cat /etc/passwd
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
sync:x:5:0:sync:/sbin:/bin/sync
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
halt:x:7:0:halt:/sbin:/sbin/halt
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
operator:x:11:0:operator:/root:/sbin/nologin
games:x:12:100:games:/usr/games:/sbin/nologin
ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
nobody:x:99:99:Nobody:/:/sbin/nologin

!!:调用最后一条历史命令
[root@discuz ~]# !!
cat /etc/passwd
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
sync:x:5:0:sync:/sbin:/bin/sync
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
halt:x:7:0:halt:/sbin:/sbin/halt
#--脚本参数相关
[root@discuz ~]# vim par.sh
[root@discuz ~]# ll par.sh 
-rw-r--r-- 1 root root 225 1月  28 15:27 par.sh
[root@discuz ~]# chmod +x ./par.sh 
[root@discuz ~]# ll par.sh 
-rwxr-xr-x 1 root root 225 1月  28 15:27 par.sh
[root@discuz ~]# ./par.sh 
脚本后面参数个数有0
脚本后面的所有参数
脚本后面的所有参数
脚本执行的进程名./par.sh
第一个参数为第二个参数为第三个参数为
[root@discuz ~]# ./par.sh a b c d
脚本后面参数个数有4
脚本后面的所有参数a b c d
脚本后面的所有参数a b c d
脚本执行的进程名./par.sh
第一个参数为a第二个参数为b第三个参数为c
[root@discuz ~]# cat par.sh 
#!/bin/bash
echo "脚本后面参数个数有$#"
echo "脚本后面的所有参数$*"
echo "脚本后面的所有参数$@"
echo "脚本执行的进程名$0"
echo "第一个参数为$1第二个参数为$2第三个参数为$3"

 脚本运行方式

#--执行脚本的方式
[root@discuz ~]# source par.sh a b c
脚本后面参数个数有3
脚本后面的所有参数a b c
脚本后面的所有参数a b c
脚本执行的进程名-bash
第一个参数为a第二个参数为b第三个参数为c
[root@discuz ~]# ./par.sh a b c
脚本后面参数个数有3
脚本后面的所有参数a b c
脚本后面的所有参数a b c
脚本执行的进程名./par.sh
第一个参数为a第二个参数为b第三个参数为c
[root@discuz ~]# bash par.sh a b c
脚本后面参数个数有3
脚本后面的所有参数a b c
脚本后面的所有参数a b c
脚本执行的进程名par.sh
第一个参数为a第二个参数为b第三个参数为c
[root@discuz ~]# sh par.sh a b c
脚本后面参数个数有3
脚本后面的所有参数a b c
脚本后面的所有参数a b c
脚本执行的进程名par.sh
第一个参数为a第二个参数为b第三个参数为c
用户环境变量,配置文件 

#自定义环境变量,如:nginx的环境变量
[root@discuz ~]# ls /etc/profile.d
256term.csh    colorls.csh  lang.sh      modules.sh  which2.csh
256term.sh     colorls.sh   less.csh     sh.local    which2.sh
colorgrep.csh  csh.local    less.sh      vim.csh
colorgrep.sh   lang.csh     modules.csh  vim.sh
[root@discuz ~]# touvh /etc/profile.d/nginx.sh
引号

"":弱引
'':强引
[root@discuz ~]# echo $`date`
$2025年 01月 28日 星期二 15:39:17 CST
[root@discuz ~]# echo "$`date`"
$2025年 01月 28日 星期二 15:39:23 CST
[root@discuz ~]# echo '$`date`'
$`date`

标准输入输出及重定向 

标准输出

#echo:标准输出,默认换行
#-n:不换行
#-e:启用转义字符(需要输出特殊符号使用)
#\n:换行
#\t:水平制表符,相当于一个"tab键"的长度,四个空格
[root@discuz ~]# echo hello
hello
[root@discuz ~]# echo -n hello
hello[root@discuz ~]# echo -e "helloworld"
helloworld
[root@discuz ~]# echo -e "hello\nworld"
hello
world
[root@discuz ~]# echo -e "hello\tworld"
hello	world
[root@discuz ~]# type echo
echo 是 shell 内嵌
[root@discuz ~]# help echo
echo: echo [-neE] [参数 ...]
    将参数写到标准输出。
    
    在标准输出上显示 ARG 参数后跟一个换行。
    
    选项:
      -n	不要追加换行
      -e	启用下列反斜杠转义的解释
      -E	显式地抑制对于反斜杠转义的解释
    
    'echo' 对下列反斜杠字符进行转义:
      \a	警告(响铃)
      \b	退格
      \c	抑制更多的输出
      \e	转义字符
      \f	格式提供
      \n	换行
      \r	回车
      \t	横向制表符
      \v	纵向制表符
      \\	反斜杠
      \0nnn	以 NNN (八进制)为 ASCII 码的字符。 NNN 可以是
    	0到3个八进制数字
      \xHH	以 HH (十六进制)为值的八比特字符。HH可以是
    	一个或两个十六进制数字
    
    退出状态:
    返回成功除非有写错误发生。


[root@discuz ~]# echo -e "\033[31mhello\033[0m"
hello
[root@discuz ~]# echo -e "\033[32mhello\033[0m"
hello
[root@discuz ~]# echo -e "\033[33mhello\033[0m"
hello
[root@discuz ~]# echo -e "\033[34mhello\033[0m"
hello
[root@discuz ~]# echo -e "\033[35mhello\033[0m"
hello
[root@discuz ~]# echo -e "\033[36mhello\033[0m"
hello
输出颜色 

 

输入输出重定向 

#"1>" & ">":正确输出覆盖重定向[1表示正确,可加可不加]
[root@discuz ~]# echo "hello" > a1.txt
[root@discuz ~]# cat a1.txt
hello
[root@discuz ~]# echo "world" 1> a1.txt
[root@discuz ~]# cat a1.txt
world
# "1>>" & ">>":正确输出追加重定向[1表示正确,可加可不加]
[root@discuz ~]# echo "test" >> a1.txt
[root@discuz ~]# cat a1.txt
world
test
[root@discuz ~]# echo "test" 1>> a1.txt
[root@discuz ~]# cat a1.txt
world
test
test
#"2>":错误输出覆盖重定向,将错误的内容输出到指定文件
[root@discuz ~]# echo "good" > a.txt
[root@discuz ~]# cat a.txt 
good
[root@discuz ~]# ECHO "hello" > a.txt  ##错误输出到显示器,但原内容被清空
-bash: ECHO: 未找到命令
[root@discuz ~]# cat a.txt
[root@discuz ~]# ECHO "hello" 2> a.txt   ##将错误的内容输出到指定文件
[root@discuz ~]# cat a.txt
-bash: ECHO: 未找到命令
#"2>>":错误输出追加重定向
[root@discuz ~]# cat a.txt
[root@discuz ~]# echo "hello" 2>> a.txt
hello
[root@discuz ~]# cat a.txt
[root@discuz ~]# ECHO "hello" 2>> a.txt
[root@discuz ~]# cat a.txt
-bash: ECHO: 未找到命令
#"&>":错误和正确都输出,覆盖重定向
#"&>>":错误和正确都输出,追加重定向
[root@discuz ~]# echo "hello" > b.txt
[root@discuz ~]# cat b.txt
hello
[root@discuz ~]# echo "hello" &> b.txt
[root@discuz ~]# cat b.txt
hello
[root@discuz ~]# ECHO "hello" &>> b.txt
[root@discuz ~]# cat b.txt
hello
-bash: ECHO: 未找到命令
[root@discuz ~]#
标准输入重定向

#echo:标准输出,默认换行
#-n:不换行
#-e:启用转义字符(需要输出特殊符号使用)
#\n:换行
#\t:水平制表符,相当于一个"tab键"的长度,四个空格
[root@discuz ~]# echo hello
hello
[root@discuz ~]# echo -n hello
hello[root@discuz ~]# echo -e "helloworld"
helloworld
[root@discuz ~]# echo -e "hello\nworld"
hello
world
[root@discuz ~]# echo -e "hello\tworld"
hello	world
[root@discuz ~]# type echo
echo 是 shell 内嵌
[root@discuz ~]# help echo
echo: echo [-neE] [参数 ...]
    将参数写到标准输出。
    
    在标准输出上显示 ARG 参数后跟一个换行。
    
    选项:
      -n	不要追加换行
      -e	启用下列反斜杠转义的解释
      -E	显式地抑制对于反斜杠转义的解释
    
    'echo' 对下列反斜杠字符进行转义:
      \a	警告(响铃)
      \b	退格
      \c	抑制更多的输出
      \e	转义字符
      \f	格式提供
      \n	换行
      \r	回车
      \t	横向制表符
      \v	纵向制表符
      \\	反斜杠
      \0nnn	以 NNN (八进制)为 ASCII 码的字符。 NNN 可以是
    	0到3个八进制数字
      \xHH	以 HH (十六进制)为值的八比特字符。HH可以是
    	一个或两个十六进制数字
    
    退出状态:
    返回成功除非有写错误发生。
[root@discuz ~]# echo -e "\033[31mhello\033[0m"
hello
[root@discuz ~]# echo -e "\033[32mhello\033[0m"
hello
[root@discuz ~]# echo -e "\033[33mhello\033[0m"
hello
[root@discuz ~]# echo -e "\033[34mhello\033[0m"
hello
[root@discuz ~]# echo -e "\033[35mhello\033[0m"
hello
[root@discuz ~]# echo -e "\033[36mhello\033[0m"
hello

[root@discuz day02]# ls
1  1.sh  2.sh  3.sh  4.sh  5.sh
[root@discuz day02]# vi 6.sh
[root@discuz day02]# cat 6.sh

[root@discuz ~]# cat > a.txt < /etc/passwd   ##读文件内容并写入到另一个文件
[root@discuz ~]# cat a.txt 
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
sync:x:5:0:sync:/sbin:/bin/sync
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
halt:x:7:0:halt:/sbin:/sbin/halt
[root@discuz ~]# cat > d.txt << EOF  ##以输入的方式覆盖文件内容,定义结束符
> aaa
> EOF
[root@discuz ~]# cat d.txt 
aaa
[root@discuz ~]# cat >> d.txt << EOF   ##以输入的方式追加文件内容,定义结束符
> acccc
> EOF
[root@discuz ~]# cat d.txt
aaa
acccc

[root@discuz ~]# head -5 /etc/passwd | tail -2 | wc -l
2
[root@discuz tmp]# ls |xargs rm -rf    ##不直接支持管道的命令需要使用xargs,并且要在目录下执行
test
vmware-root_784-2966103535
vmware-root_788-2957517930
vmware-root_790-2965972456
vmware-root_792-2999526369
vmware-root_793-4248746047
vmware-root_794-2991071843
vmware-root_796-2991202916
vmware-root_798-2999657446
vmware-root_803-4257069467
vmware-root_808-2965972425
[root@discuz tmp]# ls

[root@discuz day02]# grep -i "selinux" /etc/selinux/config  ##查看文件中的”selinux“关键字,忽略大小写
# This file controls the state of SELinux on the system.
# SELINUX= can take one of these three values:
#     enforcing - SELinux security policy is enforced.
#     permissive - SELinux prints warnings instead of enforcing.
#     disabled - No SELinux policy is loaded.
SELINUX=disabled
# SELINUXTYPE= can take one of three values:
SELINUXTYPE=targeted
[root@discuz tmp]# grep -v "^$" /etc/selinux/config  ##查看空格开头,取反的行[非空行]
# This file controls the state of SELinux on the system.
# SELINUX= can take one of these three values:
#     enforcing - SELinux security policy is enforced.
#     permissive - SELinux prints warnings instead of enforcing.
#     disabled - No SELinux policy is loaded.
SELINUX=disabled
# SELINUXTYPE= can take one of three values:
#     targeted - Targeted processes are protected,
#     minimum - Modification of targeted policy. Only selected processes are protected. 
#     mls - Multi Level Security protection.
SELINUXTYPE=targeted
[root@discuz tmp]# grep -oi "selinux" /etc/selinux/config  ##查找含有"selinux"关键字的行,"-o"仅输出匹配的内容,"-i"忽略大小写
SELinux
SELINUX
SELinux
SELinux
SELinux
SELINUX
SELINUX
SELINUX
[root@discuz tmp]# grep -o "SELINUX" /etc/selinux/config    ##查找含有"SELINUX"关键字的行,"-o"仅输出匹配的内容
SELINUX
SELINUX
SELINUX
SELINUX
[root@discuz tmp]# grep -oc "SELINUX" /etc/selinux/config   ##查找含有"SELINUX"关键字的行,"-o"仅输出匹配的内容,"-c"仅输出行数
4
[root@discuz tmp]# grep -c "SELINUX" /etc/selinux/config ##查找含有"SELINUX"关键字的行,"-c"仅输出行数
4
[root@discuz tmp]# grep -A 2 ":$" /etc/selinux/config   ##打印以":"结尾结尾的2行
# SELINUX= can take one of these three values:
#     enforcing - SELinux security policy is enforced.
#     permissive - SELinux prints warnings instead of enforcing.
--
# SELINUXTYPE= can take one of three values:
#     targeted - Targeted processes are protected,
#     minimum - Modification of targeted policy. Only selected processes are protected. 
[root@discuz tmp]# grep -B 2 ":$" /etc/selinux/config  ##打印以":"结尾
起始的2行

# This file controls the state of SELinux on the system.
# SELINUX= can take one of these three values:
--
#     disabled - No SELinux policy is loaded.
SELINUX=disabled
# SELINUXTYPE= can take one of three values:
[root@discuz tmp]# grep -E "^#\s{2,}|^$" /etc/selinux/config  ##打印文件中至少#后面两个空格或空行的内容

#     enforcing - SELinux security policy is enforced.
#     permissive - SELinux prints warnings instead of enforcing.
#     disabled - No SELinux policy is loaded.
#     targeted - Targeted processes are protected,
#     minimum - Modification of targeted policy. Only selected processes are protected. 
#     mls - Multi Level Security protection.

正则表达式 

扩展正则

 

#--使用正则过滤IP地址
[root@discuz day02]# ip a | grep ens33 | grep inet
    inet 192.168.81.130/24 brd 192.168.81.255 scope global noprefixroute dynamic ens33
[root@discuz day02]# ip a | grep ens33 | grep inet | grep -oE "[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}/[0-9]{2}"
192.168.81.130/24
[root@discuz tmp]# ip a | grep ens33 | grep inet | grep -oE "([0-9]{1,3}\.){3}[0-9]{1,3}/[0-9]{2}"
192.168.81.130/24
[root@discuz tmp]# ip -br a | grep "ens33" | grep -oE "([0-9]{1,3})\.{3}[0-9]{1,3}"
[root@discuz tmp]# ip -br a | grep "ens33" | grep -oE "[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}"
192.168.81.130
[root@discuz tmp]# grep -E "^\<[a-Z]+\>" /etc/passwd  ##匹配单词开头的行
...
sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin
postfix:x:89:89::/var/spool/postfix:/sbin/nologin
chrony:x:998:996::/var/lib/chrony:/sbin/nologin
apache:x:48:48:Apache:/usr/share/httpd:/sbin/nologin
mysql:x:27:27:MySQL Server:/var/lib/mysql:/bin/false
[root@discuz tmp]# grep -E "\<[a-Z]+\>$" /etc/passwd  ##匹配单词结尾的行
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
sync:x:5:0:sync:/sbin:/bin/sync
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
...
[root@discuz tmp]# grep -E "???" /etc/passwd
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
sync:x:5:0:sync:/sbin:/bin/sync
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
halt:x:7:0:halt:/sbin:/sbin/halt
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
operator:x:11:0:operator:/root:/sbin/nologin
games:x:12:100:games:/usr/games:/sbin/nologin

[root@discuz tmp]# df -h
文件系统                 容量  已用  可用 已用% 挂载点
devtmpfs                 1.9G     0  1.9G    0% /dev
tmpfs                    1.9G     0  1.9G    0% /dev/shm
tmpfs                    1.9G  9.8M  1.9G    1% /run
tmpfs                    1.9G     0  1.9G    0% /sys/fs/cgroup
/dev/mapper/centos-root   17G  3.6G   14G   21% /
/dev/sda1               1014M  153M  862M   16% /boot
tmpfs                    378M     0  378M    0% /run/user/0
[root@discuz tmp]# df -h |grep -E "/$"
/dev/mapper/centos-root   17G  3.6G   14G   21% /

sort

[root@discuz tmp]# cat /etc/passwd | sort   ##默认以第一个字母或数字排序
adm:x:3:4:adm:/var/adm:/sbin/nologin
apache:x:48:48:Apache:/usr/share/httpd:/sbin/nologin
bin:x:1:1:bin:/bin:/sbin/nologin
chrony:x:998:996::/var/lib/chrony:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
dbus:x:81:81:System message bus:/:/sbin/nologin
ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
games:x:12:100:games:/usr/games:/sbin/nologin
halt:x:7:0:halt:/sbin:/sbin/halt
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
mysql:x:27:27:MySQL Server:/var/lib/mysql:/bin/false
nobody:x:99:99:Nobody:/:/sbin/nologin
operator:x:11:0:operator:/root:/sbin/nologin
polkitd:x:999:998:User for polkitd:/:/sbin/nologin
postfix:x:89:89::/var/spool/postfix:/sbin/nologin
[root@discuz tmp]# cat /etc/passwd | sort -r  ##第一个字母或数子逆序
tss:x:59:59:Account used by the trousers package to sandbox the tcsd daemon:/dev/null:/sbin/nologin
systemd-network:x:192:192:systemd Network Management:/:/sbin/nologin
sync:x:5:0:sync:/sbin:/bin/sync
sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
root:x:0:0:root:/root:/bin/bash
postfix:x:89:89::/var/spool/postfix:/sbin/nologin
polkitd:x:999:998:User for polkitd:/:/sbin/nologin
operator:x:11:0:operator:/root:/sbin/nologin
nobody:x:99:99:Nobody:/:/sbin/nologin
[root@discuz tmp]# cat /etc/passwd | sort -t ":"  -k 3 -g -r  ##“:”:为分隔符,"-k":第三列,“-r”:逆序,"-g"以数字排序
polkitd:x:999:998:User for polkitd:/:/sbin/nologin
chrony:x:998:996::/var/lib/chrony:/sbin/nologin
systemd-network:x:192:192:systemd Network Management:/:/sbin/nologin
nobody:x:99:99:Nobody:/:/sbin/nologin
postfix:x:89:89::/var/spool/postfix:/sbin/nologin
dbus:x:81:81:System message bus:/:/sbin/nologin
sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin
tss:x:59:59:Account used by the trousers package to sandbox the tcsd daemon:/dev/null:/sbin/nologin
apache:x:48:48:Apache:/usr/share/httpd:/sbin/nologin

uniq 

[root@discuz tmp]# cat passwd |uniq -c   ##显示重复的行数
      3 root:x:0:0:root:/root:/bin/bash
      1 bin:x:1:1:bin:/bin:/sbin/nologin
      1 daemon:x:2:2:daemon:/sbin:/sbin/nologin
      1 adm:x:3:4:adm:/var/adm:/sbin/nologin
      1 lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
      1 sync:x:5:0:sync:/sbin:/bin/sync
      1 shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
      1 halt:x:7:0:halt:/sbin:/sbin/halt
      1 mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
      1 operator:x:11:0:operator:/root:/sbin/nologin
      1 games:x:12:100:games:/usr/games:/sbin/nologin
      1 ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
      1 nobody:x:99:99:Nobody:/:/sbin/nologin
      1 systemd-network:x:192:192:systemd Network Management:/:/sbin/nologin
[root@discuz tmp]# cat passwd |uniq -c -d   ##仅显示重复的行
      3 root:x:0:0:root:/root:/bin/bash
[root@discuz tmp]# cat passwd |uniq -c -u    ##仅显示不重复的行
      1 bin:x:1:1:bin:/bin:/sbin/nologin
      1 daemon:x:2:2:daemon:/sbin:/sbin/nologin
      1 adm:x:3:4:adm:/var/adm:/sbin/nologin
      1 lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
      1 sync:x:5:0:sync:/sbin:/bin/sync
      1 shutdown:x:6:0:shutdown:/sbin:/

wc 

[root@discuz tmp]# wc passwd
  24   43 1116 passwd
[root@discuz tmp]# wc -l passwd 
24 passwd
[root@discuz tmp]# wc -c passwd 
1116 passwd

cut 

#--cut命令
[root@discuz tmp]# head -3 /etc/passwd
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
[root@discuz tmp]# head -3 /etc/passwd | cut -d ":" -f 7
/bin/bash
/sbin/nologin
/sbin/nologin
[root@discuz tmp]# head -3 /etc/passwd | cut -d ":" -f 6,7
/root:/bin/bash
/bin:/sbin/nologin
/sbin:/sbin/nologin
[root@discuz tmp]# head -3 /etc/passwd | cut -d ":" -f 6-7
/root:/bin/bash
/bin:/sbin/nologin
/sbin:/sbin/nologin
#--查看cpu空闲率
[root@discuz tmp]# top -b -n 1 | grep -E "^%" | cut -d "" -f 9
%Cpu(s):  0.0 us,  1.6 sy,  0.0 ni, 98.4 id,  0.0 wa,  0.0 hi,  0.0 si,  
[root@discuz tmp]# top -b -n 1 | grep -E "^%" | cut -d " " -f 9
0.0

tr

#--查看空闲内存
[root@discuz tmp]# free -h
              total        used        free      shared  buff/cache   available
Mem:           3.7G        385M        3.0G         14M        303M        3.1G
Swap:          2.0G          0B        2.0G
[root@discuz tmp]# free -h | grep "Mem" | tr -s " " " " | cut -d " " -f 4
3.0G
#--删除字符"l"
[root@discuz tmp]# echo "hello" | tr -d l
heo
#--替换多个字符
[root@discuz tmp]# head -1 passwd
root:x:0:0:root:/root:/bin/bash
[root@discuz tmp]# head -1 passwd | tr "root" "ROOT"
ROOT:x:0:0:ROOT:/ROOT:/bin/bash
[root@discuz tmp]# head -1 passwd | tr "ab" "AB"
root:x:0:0:root:/root:/Bin/BAsh

tee 

#--将获取到的内容写入文件[默认覆盖源文件内容]
[root@discuz tmp]# head -2 passwd
root:x:0:0:root:/root:/bin/bash
root:x:0:0:root:/root:/bin/bash
[root@discuz tmp]# head -2 passwd | tee /tmp/pass
root:x:0:0:root:/root:/bin/bash
root:x:0:0:root:/root:/bin/bash
[root@discuz tmp]# cat /tmp/pass
root:x:0:0:root:/root:/bin/bash
root:x:0:0:root:/root:/bin/bash
[root@discuz tmp]# tail -2 passwd | tee /tmp/pass
apache:x:48:48:Apache:/usr/share/httpd:/sbin/nologin
mysql:x:27:27:MySQL Server:/var/lib/mysql:/bin/false
[root@discuz tmp]# cat /tmp/pass
apache:x:48:48:Apache:/usr/share/httpd:/sbin/nologin
mysql:x:27:27:MySQL Server:/var/lib/mysql:/bin/false
#--将获取的内容追加式写入文件
[root@discuz tmp]# cat /tmp/pass
apache:x:48:48:Apache:/usr/share/httpd:/sbin/nologin
mysql:x:27:27:MySQL Server:/var/lib/mysql:/bin/false
[root@discuz tmp]# head -2 passwd | tee -a /tmp/pass
root:x:0:0:root:/root:/bin/bash
root:x:0:0:root:/root:/bin/bash
[root@discuz tmp]# cat /tmp/pass
apache:x:48:48:Apache:/usr/share/httpd:/sbin/nologin
mysql:x:27:27:MySQL Server:/var/lib/mysql:/bin/false
root:x:0:0:root:/root:/bin/bash
root:x:0:0:root:/root:/bin/bash

watch

sleep&&wait

[root@discuz tmp]# sh -x 1.sh   ##等待10s,后输出"hello"
+ wait
+ sleep 10
+ echo hello
hello
[root@discuz tmp]# cat 1.sh 
#!/bin/bash
sleep 10&
wait
echo "hello"
#--指定等待的进程
[root@discuz tmp]# sh -x 1.sh
+ pid1=4992
+ sleep 10
+ wait 4992
+ sleep 5
+ echo 4992
4992
[root@discuz tmp]# cat 1.sh
#!/bin/bash
sleep 10&
pid1=$!
sleep 5&
wait $pid1
echo "$pid1"
#--控制某一个进程执行完后,再继续执行下一个命令
[root@discuz tmp]# sleep 50&
[1] 4995
[root@discuz tmp]# jobs -l
[1]+  4995 运行中               sleep 50 &
[root@discuz tmp]# wait 4995;ls
[1]+  完成                  sleep 50
1.sh  all.txt  cmd.txt  pass  passwd
[root@discuz tmp]# sleep 50&
[1] 4998
[root@discuz tmp]# jobs -l
[1]+  4998 运行中               sleep 50 &
[root@discuz tmp]# wait %1;ls
[1]+  完成                  sleep 50
1.sh  all.txt  cmd.txt  pass  passwd

read

[root@discuz tmp]# read num   ##从标准输入读取一个值,赋值给变量num
1
[root@discuz tmp]# echo $num
1
[root@discuz tmp]# read -p "请输入一个数字:" num    ##从标准输入读取一个值,赋值到变量num,插入提示信息
请输入一个数字:11
[root@discuz tmp]# echo $num
11
[root@discuz tmp]# read -e -p "请输入一个数字:" num    ##...提示赋值,支持回退
请输入一个数字:11
[root@discuz tmp]# echo $num
11
#--不显示输入内容
[root@discuz tmp]# read -e -s -p "请输入一个数字:" num
请输入一个数字:[root@discuz tmp]# echo $num
678
[root@discuz tmp]# read -t 5 -e -s -p "请输入一个数字:" num  ##设置超时时间为5秒
请输入一个数字:[root@discuz tmp]#

timeout 

[root@discuz tmp]# timeout 5 sleep 10   ##限制5s结束程序
[root@discuz tmp]# timeout 2 ping 127.0.0.1   ##限制ping的时间
PING 127.0.0.1 (127.0.0.1) 56(84) bytes of data.
64 bytes from 127.0.0.1: icmp_seq=1 ttl=64 time=0.031 ms
64 bytes from 127.0.0.1: icmp_seq=2 ttl=64 time=0.030 ms
[root@discuz tmp]# 
[root@discuz tmp]# timeout -s 15 10 ping 127.0.0.1   ##传递15信号,十秒结束程序
PING 127.0.0.1 (127.0.0.1) 56(84) bytes of data.
64 bytes from 127.0.0.1: icmp_seq=1 ttl=64 time=0.030 ms
64 bytes from 127.0.0.1: icmp_seq=2 ttl=64 time=0.039 ms
64 bytes from 127.0.0.1: icmp_seq=3 ttl=64 time=0.040 ms
64 bytes from 127.0.0.1: icmp_seq=4 ttl=64 time=0.037 ms
64 bytes from 127.0.0.1: icmp_seq=5 ttl=64 time=0.048 ms
64 bytes from 127.0.0.1: icmp_seq=6 ttl=64 time=0.038 ms
64 bytes from 127.0.0.1: icmp_seq=7 ttl=64 time=0.030 ms
64 bytes from 127.0.0.1: icmp_seq=8 ttl=64 time=0.048 ms
64 bytes from 127.0.0.1: icmp_seq=9 ttl=64 time=0.024 ms
64 bytes from 127.0.0.1: icmp_seq=10 ttl=64 time=0.027 ms
[root@discuz tmp]# timeout -s 9 10 ping 127.0.0.1    ##传递9信号,10秒后强制杀死
PING 127.0.0.1 (127.0.0.1) 56(84) bytes of data.
64 bytes from 127.0.0.1: icmp_seq=1 ttl=64 time=0.018 ms
64 bytes from 127.0.0.1: icmp_seq=2 ttl=64 time=0.029 ms
64 bytes from 127.0.0.1: icmp_seq=3 ttl=64 time=0.048 ms
64 bytes from 127.0.0.1: icmp_seq=4 ttl=64 time=0.026 ms
64 bytes from 127.0.0.1: icmp_seq=5 ttl=64 time=0.043 ms
64 bytes from 127.0.0.1: icmp_seq=6 ttl=64 time=0.028 ms
64 bytes from 127.0.0.1: icmp_seq=7 ttl=64 time=0.026 ms
64 bytes from 127.0.0.1: icmp_seq=8 ttl=64 time=0.054 ms
64 bytes from 127.0.0.1: icmp_seq=9 ttl=64 time=0.027 ms
64 bytes from 127.0.0.1: icmp_seq=10 ttl=64 time=0.046 ms
已杀死

 dirname&basename

#--获取目录
[root@discuz tmp]# dirname /etc/sysconfig/network-scripts/ifcfg-ens33 
/etc/sysconfig/network-scripts
#--获取文件
[root@discuz tmp]# basename /etc/sysconfig/network-scripts/ifcfg-ens33 
ifcfg-ens33

 shell算数计算

算数运算符

整数计算

#--整数运算
#let:加,减,乘,取余,除
[root@discuz ~]# let a=(1+2)
[root@discuz ~]# echo $a
3
[root@discuz ~]# let b=$a+1
[root@discuz ~]# echo $b
4
[root@discuz ~]# let c=2*8
[root@discuz ~]# echo $c
16
[root@discuz ~]# let d=10%3
[root@discuz ~]# echo $d
1
[root@discuz ~]# let e=10/3
[root@discuz ~]# echo $e
3
#expr:加,减,乘,除,取余
注意:空格,*必须转义
[root@discuz ~]# expr 2 + 3
5
[root@discuz ~]# expr 2 * 3
expr: 语法错误
[root@discuz ~]# expr 2 \* 3
6
[root@discuz ~]# expr 10 / 3
3
[root@discuz ~]# expr 10 \% 3
1
[root@discuz ~]# expr 10 % 3
1
[root@discuz ~]# expr 10 - 3
7
#echo $i:加,减,乘,除,取余
[root@discuz ~]# echo $((5+9))
14
[root@discuz ~]# echo $((10-9))
1
[root@discuz ~]# echo $((10/9))
1
[root@discuz ~]# echo $((10%3))
1
[root@discuz ~]# echo $((10*3))
30
或
[root@discuz ~]# echo $[10+3]
13
[root@discuz ~]# echo $[10-3]
7
[root@discuz ~]# echo $[10*3]
30
[root@discuz ~]# echo $[10/3]
3
[root@discuz ~]# echo $[10%3]
1

小数计算

#--小数运算
#进入bc,不指定精度默认不计算小数
#scale=6:指定保留6位小数
[root@discuz ~]# bc     ##交互式
bc 1.06.95
Copyright 1991-1994, 1997, 1998, 2000, 2004, 2006 Free Software Foundation, Inc.
This is free software with ABSOLUTELY NO WARRANTY.
For details type 'warranty'.
1+3
4
4*5
20
6%3
0

10/3
3

scale=6
10/3
3.333333

10%3
.000001
^C
(interrupt) Exiting bc.
[root@discuz ~]# echo "scale=3;10/3" | bc    ##非交互式
3.333
[root@discuz ~]# echo "scale=5;10%3" | bc    ##不支持取余
.00001
[root@discuz ~]# echo "scale=3;10/3" | bc
3.333

自增自减运算 

 

#++a:先自增再赋值
[root@discuz ~]# a=1
[root@discuz ~]# let b=a++
[root@discuz ~]# echo $a
2
[root@discuz ~]# echo $b
1
#a++:先赋值再自增
[root@discuz ~]# a=1
[root@discuz ~]# let b=++a
[root@discuz ~]# echo $a
2
[root@discuz ~]# echo $b
2
#--a:先自减再赋值
[root@discuz ~]# a=1
[root@discuz ~]# let  b=--a
[root@discuz ~]# echo $a
0
[root@discuz ~]# echo $b
0
#a--:先赋值再自减
[root@discuz ~]# a=1
[root@discuz ~]# let b=a--
[root@discuz ~]# echo $b
1
[root@discuz ~]# echo $a
0

 shell条件判断

文件判断

#test:条件判断
[root@discuz ~]# test -d /tmp   ##-d:是否为目录
[root@discuz ~]# echo $?
0
[root@discuz ~]# [ -d /tmp ]  ##-d:是否为目录文件
[root@discuz ~]# echo $?
0
[root@discuz ~]# [ -f /tmp ]   ##-f:是否为普通文件
[root@discuz ~]# echo $?
1
[root@discuz ~]# [ -e /tmp ]   ##-e:是否存在
[root@discuz ~]# echo $?
0  
[root@discuz ~]# [ -r /tmp/shadow ]  ##判断文件是否有读权限,文件不存在
[root@discuz ~]# echo $?
1
[root@discuz ~]# ll /tmp/shadow
ls: 无法访问/tmp/shadow: 没有那个文件或目录
[root@discuz ~]# [ -r /etc/shadow ]   ##判断文件是否有读权限,root用户干扰
[root@discuz ~]# echo $?
0
[root@discuz ~]# ll /etc/shadow 
----------. 1 root root 644 1月  27 22:27 /etc/shadow
[root@discuz ~]# [ -r /etc/passwd ]   ##判断文件是否有读权限
[root@discuz ~]# echo $?
0
[root@discuz ~]# [ -x /etc/passwd ]    ##判断文件是否有执行权限
[root@discuz ~]# echo $?
1
[root@discuz ~]# ll /etc/passwd
-rw-r--r--. 1 root root 1052 1月  27 22:27 /etc/passwd

数值大小判断 

[root@discuz ~]# test 1 -eq 2     ##判断1等于2
[root@discuz ~]# echo $?
1
[root@discuz ~]# [ 5 -gt 3 ]   ##判断5大于3
[root@discuz ~]# echo $?
0
[root@discuz ~]# [ 5 -gt 5 ]   ##判断5大于5
[root@discuz ~]# echo $?
1
[root@discuz ~]# [ 5 -ge 5 ]  ##判断5大于等于5
[root@discuz ~]# echo $?
0
[root@discuz ~]# [ 3 -lt 6 ]   ##判断3小于6
[root@discuz ~]# echo $?
0
[root@discuz ~]# [ 3 -le 3 ]   ##判断3小于等于3
[root@discuz ~]# echo $?
0
[root@discuz ~]# [ 6 -ge 6 ]   ##判断6大于等于6
[root@discuz ~]# echo $?
0

判断字符串

#--判断字符串是否为空
[root@discuz ~]# [ -z " " ]    ##有空格字符不为空
[root@discuz ~]# echo $?
1
[root@discuz ~]# [ -z "" ]    ##字符串为空
[root@discuz ~]# echo $?
0
#--判断字符串是否为非空
[root@discuz ~]# [ -n "" ]   ##字符串为空
[root@discuz ~]# echo $?
1
[root@discuz ~]# [ -n " " ]   ##字符串非空
[root@discuz ~]# echo $?
0
[root@discuz ~]# [ -n abc ]   ##字符串为非空
[root@discuz ~]# echo $?
0
#--判断字符串是否相等
[root@discuz ~]# [ "abc" = "bac" ]    ##字符串不相等
[root@discuz ~]# echo $?
1
[root@discuz ~]# [ "abc" = "abc" ]     ##字符串相等
[root@discuz ~]# echo $?
0
#--判断字符串是否不相等
[root@discuz ~]# [ "abc" != "abc" ]    ##字符串相等
[root@discuz ~]# echo $?
1
[root@discuz ~]# [ "abc" != "bac" ]    ##字符串不相等
[root@discuz ~]# echo $?
0

多条件判断 

 

#-a:逻辑与,两个都为真才为真
[root@discuz ~]# [ 1 -eq 1 -a "abc" = "bac" ]     ##1等于1[为真],且字符串相等[为假]
[root@discuz ~]# echo $?
1
#-o:逻辑或,有一个为真则为真
[root@discuz ~]# [ 1 -eq 1 -o "abc" = "bac" ]    ##1等于1[为真],或字符串相等[为假]
[root@discuz ~]# echo $?
0
#--判断文件为普通文件
[root@discuz ~]# [ -f /etc/passwd ]    ##判断文件是否是普通文件
[root@discuz ~]# echo $?
0
[root@discuz ~]# ll /etc/passwd
-rw-r--r--. 1 root root 1052 1月  27 22:27 /etc/passwd
#--判断文件不是普通文件
[root@discuz ~]# [ ! -f /etc/passwd ]     ##判断文件是否非普通文件
[root@discuz ~]# echo $?
1
#&&:逻辑与,两个都为真才为真
[root@discuz ~]# [[ 1 -eq 1 ]] && [[ -d /tmp ]]   ##1等于1[为真],且/tmp为目录文件[为真]
[root@discuz ~]# echo $?
0
#||:逻辑或,有一个为真则为真
[root@discuz ~]# [[ 1 -eq 1 ]] || [[ -d /tmp ]]   ##1等于1[为真],或/tmp为目录文件[为真]
[root@discuz ~]# echo $?
0
[root@discuz ~]# [[ 1 -eq 1 ]] || [[ -f /tmp/pass ]]   ##1等于1[为真],或/tmp/pass为普通文件[为假]
[root@discuz ~]# echo $?
0
 命令连接符

[root@discuz ~]# ls &> /dev/null   ##将输出结果丢到黑洞

if条件控制

#--单分支
#如果文件存在则输出
[root@discuz ~]# if [ -f /etc/passwd ] ; then echo "文件存在"; fi
文件存在
#文件不存在则不输出
[root@discuz ~]# if [ -f /tmp/passwd ] ; then echo "文件存在"; fi
[root@discuz ~]# cat > if.sh << EOF
> #!/bin/bash
> #判断文件是否存在
> if [ -f /etc/passwd ];then
>    echo "文件已存在"
> fi
> EOF
[root@discuz ~]# cat if.sh 
#!/bin/bash
#判断文件是否存在
if [ -f /etc/passwd ];then
   echo "文件已存在"
fi
[root@discuz ~]# sh if.sh 
文件已存在
[root@discuz ~]# sh -x if.sh 
+ '[' -f /etc/passwd ']'
+ echo 文件已存在
文件已存在
#--双分支
[root@discuz ~]# if [ -f /etc/passwd ];then echo "file is exist";else "is not exist"; fi
file is exist
[root@discuz ~]# if [ -f /tmp/passwd ] ;then echo "file is exits"; else echo "file is not exits"; fi
file is not exits
[root@discuz ~]# cat > if01.sh << EOF
> #!/bin/bash
> if id user1
> then
>   echo "用户存在"
> else
>   echo "用户不存在"
> fi
> EOF
[root@discuz ~]# cat if01.sh
#!/bin/bash
if id user1
then
  echo "用户存在"
else
  echo "用户不存在"
fi
[root@discuz ~]# sh if01.sh 
id: user1: no such user
用户不存在
#更完善
[root@discuz ~]# cat if01.sh
#!/bin/bash
read -e -p "请输入一个用户名" user
if id $user &> /dev/null
then
  echo "用户存在"
else
  echo "用户不存在"
fi
[root@discuz ~]# sh if01.sh 
请输入一个用户名user1
用户不存在
[root@discuz ~]# sh if01.sh 
请输入一个用户名root
用户存在

 :set ts=4     ##在末行模式将tab键修改为4个空格

注意:if判断如果满足则结束,除非都不满足才会进入else否则

[root@discuz ~]# vi if.sh
[root@discuz ~]# cat if.sh
#!/bin/bash
if [ -f /tmp/passwd ];then
	echo "文件已存在"
elif [ -d /tmp ]; then
	echo "/tmp为目录"
elif id user1 &>/dev/null ;then
	echo "用户user1已存在"
else
	echo "都没有匹配到"
fi
[root@discuz ~]# sh if.sh 
/tmp为目录

[root@discuz ~]# cat if03.sh 
#!/bin/bash
#判断用户输入的学生分数
read -e -p "请输入一个分数" score
#分数等于0,提示你个渣渣
if [ $score -eq 0 ] ;then
	echo "你个渣渣"
#分数大于0大于等于59,提示太菜了
elif [ $score -gt 0 -a $score -le 59 ] ; then
	echo "太菜了"
#分数大于等于60小于等于70,提示继续加油
elif [ $score -ge 60 -a $score -le 70 ] ; then
	echo "继续加油"
#分数大于70小于等于80,提示良好
elif [ $score -gt 70 -a $score -le 80 ] ; then
	echo "良好"
#分数大于80小于等于90,提示优秀
elif [ $score -gt 80 -a $score -le 90 ] ; then
	echo "优秀"
#分数大于90小于等于100,提示非常棒
elif [ $score -gt 90 -a $score -le 100 ] ; then
	echo "非常棒"
else 
	echo "请输入0~100的数字"
fi
[root@discuz ~]# sh if03.sh 
请输入一个分数10
太菜了
[root@discuz ~]# sh if03.sh 
请输入一个分数60
继续加油
[root@discuz ~]# sh if03.sh 
请输入一个分数61
继续加油
[root@discuz ~]# sh if03.sh 
请输入一个分数81
优秀
[root@discuz ~]# sh if03.sh 
请输入一个分数77
良好
[root@discuz ~]# sh if03.sh 
请输入一个分数90
优秀
[root@discuz ~]# sh if03.sh 
请输入一个分数99
非常棒
[root@discuz ~]# sh if03.sh 
请输入一个分数0
你个渣渣
[root@discuz ~]# sh if03.sh 
请输入一个分数999
请输入0~100的数字

 case

[root@discuz ~]# cat case.sh
#!/bin/bash
case $1 in
start)
	systemctl $1 httpd
	echo "apache is started"
;;
stop)
	systemctl $1 httpd
	echo "apache is stoped"
;;
restart)
	systemctl $1 httpd
	echo "apache is restarted"
;;
status)
	systemctl $1 https
	echo "echo "查看apache状态""
;;
*)
	echo "usage:please input start|stop|restart|status"
esac
[root@discuz ~]# rpm -qa | grep httpd
httpd-tools-2.4.6-99.el7.centos.1.x86_64
httpd-2.4.6-99.el7.centos.1.x86_64
[root@discuz ~]# sh case.sh start
apache is started
[root@discuz ~]# curl 127.0.0.1
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<meta name="renderer" content="webkit" />
<meta http-equiv="X-UA-Compatible" content="IE=edge" />
<title>论坛 -  Powered by Discuz!</title>
[root@discuz ~]# sh case.sh stop
apache is stoped
[root@discuz ~]# curl 127.0.0.1
curl: (7) Failed connect to 127.0.0.1:80; 拒绝连接

for循环 

#--for循环,格式1
[root@discuz ~]# for ((i=1;i<=10;i++));do echo "这是第$i次循环";done
这是第1次循环
这是第2次循环
这是第3次循环
这是第4次循环
这是第5次循环
这是第6次循环
这是第7次循环
这是第8次循环
这是第9次循环
这是第10次循环
[root@discuz ~]# sh for.sh 
this is 1次循环
this is 2次循环
this is 3次循环
this is 4次循环
this is 5次循环
[root@discuz ~]# cat for.sh
#!/bin/bash
for ((i=1;i<=5;i++))
do
	echo "this is $i次循环"
done
[root@discuz ~]# for i in a b c d ;do echo $i ;done
a
b
c
d
[root@discuz ~]# for i in `cut -d ":" -f1 /etc/passwd` ; do echo "/etc/passwd文件中的用户是$i";done
/etc/passwd文件中的用户是root
/etc/passwd文件中的用户是bin
/etc/passwd文件中的用户是daemon
/etc/passwd文件中的用户是adm
/etc/passwd文件中的用户是lp
/etc/passwd文件中的用户是sync
/etc/passwd文件中的用户是shutdown
/etc/passwd文件中的用户是halt
/etc/passwd文件中的用户是mail
/etc/passwd文件中的用户是operator
/etc/passwd文件中的用户是games
/etc/passwd文件中的用户是ftp
/etc/passwd文件中的用户是nobody
/etc/passwd文件中的用户是systemd-network
/etc/passwd文件中的用户是dbus
/etc/passwd文件中的用户是polkitd
/etc/passwd文件中的用户是tss
/etc/passwd文件中的用户是sshd
/etc/passwd文件中的用户是postfix
/etc/passwd文件中的用户是chrony
/etc/passwd文件中的用户是apache
/etc/passwd文件中的用户是mysql
[root@discuz ~]# for i in {1..5} ;do echo $i ;done
1
2
3
4
5
[root@discuz ~]# for i in `seq 5`; do echo $i ;done
1
2
3
4
5
[root@discuz ~]# for i in `seq  -w 10`; do echo $i ;done
01
02
03
04
05
06
07
08
09
10
[root@discuz ~]# for i in {1..3} ; do useradd u$i; done
[root@discuz ~]# for i in {1..3} ; do id u$i; done
uid=1000(u1) gid=1000(u1) 组=1000(u1)
uid=1001(u2) gid=1001(u2) 组=1001(u2)
uid=1002(u3) gid=1002(u3) 组=1002(u3)
[root@discuz ~]# for i in {1..3} ; do userdel -r u$i; done
[root@discuz ~]# for i in {1..3} ; do id u$i; done
id: u1: no such user
id: u2: no such user
id: u3: no such user

while循环:条件不成立退出

#--输入大于10的数字将循环脚本
[root@discuz ~]# n=1;while [ $n -le 10 ];do read -p "请输入一个数字:" n;done
请输入一个数字:4
请输入一个数字:4
请输入一个数字:10
请输入一个数字:11
[root@discuz ~]# sh while.sh 
请输入一个数字:9
请输入一个数字:3
请输入一个数字:11
[root@discuz ~]# cat while.sh
#!/bin/bash
n=0
while (($n<=10))
do
    read -p "请输入一个数字:" n
done
#--死循环
[root@discuz ~]# while :;do echo "死循环"; done
#--大于10,结束
[root@discuz ~]# sh while.sh 
请输入一个数字:11
循环结束
[root@discuz ~]# cat while.sh 
#!/bin/bash
n=0
while (($n<=10))
do
    read -p "请输入一个数字:" n
    if [ $n -gt 10 ];then
	echo "循环结束"
    fi
done

until循环 

循环控制 

 

#符合条件就结束循环
#比10大一直执行,小于等于10,成立就退出循环
[root@discuz ~]# n=11;until [ $n -le 10 ] ;do read -p "请输入一个数字:" n;echo "hello" ; done
请输入一个数字:13
hello
请输入一个数字:18
hello
请输入一个数字:9
hello
#--跳过第五次循环
[root@discuz ~]# for ((i=1;i<=10;i++));do [ $i -eq 5 ] && continue; echo "这是第$i次循环";done
这是第1次循环
这是第2次循环
这是第3次循环
这是第4次循环
这是第6次循环
这是第7次循环
这是第8次循环
这是第9次循环
这是第10次循环
#--退出循环体
[root@discuz ~]# for ((i=1;i<=10;i++));do [ $i -eq 5 ]&& break; echo "这 是第$i次循环"; done; echo "hello";
这是第1次循环
这是第2次循环
这是第3次循环
这是第4次循环
hello
#--break与continue;退出循环体与退出本次循环
[root@discuz ~]# for ((i=1;i<=10;i++));do [ $i -eq 5 ]&& continue; echo "这是第$i次循环"; done;echo "hello"
这是第1次循环
这是第2次循环
这是第3次循环
这是第4次循环
这是第6次循环
这是第7次循环
这是第8次循环
这是第9次循环
这是第10次循环
hello
[root@discuz ~]# for ((i=1;i<=10;i++));do [ $i -eq 5 ]&& break; echo "这 是第$i次循环"; done; echo "hello";
这是第1次循环
这是第2次循环
这是第3次循环
这是第4次循环
hello
[root@discuz ~]# for ((i=1;i<=10;i++));do [ $i -eq 5 ]&& exit; echo "这.第$次.循环"; done; echo "hello";
这是第1次循环
这是第2次循环
这是第3次循环
这是第4次循环
[退出终端]
#--在脚本中执行,流程控制continue
[root@discuz ~]# sh continue.sh 
这是第1次循环
这是第2次循环
这是第3次循环
这是第4次循环
这是第6次循环
这是第7次循环
这是第8次循环
这是第9次循环
这是第10次循环
hello
[root@discuz ~]# cat continue.sh 
#!/bin/bash
for ((i=1;i<=10;i++))
do 
    [ $i -eq 5 ]&& continue
    echo "这是第$i次循环"
done
echo "hello"
[root@discuz ~]# sh break.sh 
这是第1次循环
这是第2次循环
这是第3次循环
这是第4次循环
hello
#--break
[root@discuz ~]# cat break.sh 
#!/bin/bash
for ((i=1;i<=10;i++))
do 
    [ $i -eq 5 ]&& break
    echo "这是第$i次循环"
done
echo "hello"
[root@discuz ~]# cat > break.sh << EOF
> for ((i=1;i<=10;i++))
> do
> [ \$i -eq 5 ]&& break
> echo "这是第\$i次循环"
> done
> echo "hello"
> EOF
[root@discuz ~]# cat break.sh 
for ((i=1;i<=10;i++))
do
[ $i -eq 5 ]&& break
echo "这是第$i次循环"
done
echo "hello"
#--exit不设置状态码
[root@discuz ~]# cat exit.sh 
for ((i=1;i<=10;i++))
do
    [ $i -eq 5 ]&& exit
    echo "这是第$i次循环"
done
    echo "hello"
[root@discuz ~]# echo $?
0
[root@discuz ~]# sh exit.sh 
这是第1次循环
这是第2次循环
这是第3次循环
这是第4次循环
#--exit,设置状态码为1
[root@discuz ~]# sh exit.sh 
这是第1次循环
这是第2次循环
这是第3次循环
这是第4次循环
[root@discuz ~]# echo $?
1
[root@discuz ~]# cat exit.sh 
for ((i=1;i<=10;i++))
do
    [ $i -eq 5 ]&& exit 1
    echo "这是第$i次循环"
done
    echo "hello"

获取随机数 

#--取随机数[0,1]
[root@discuz ~]# echo $[$RANDOM%2]
1
#--取随机数[0~9]
[root@discuz ~]# echo $[$RANDOM%10]
8
#--取随机数[50~100]
[root@discuz ~]# echo $[$RANDOM%51+50]
78
#--取随机数[100~999]
[root@discuz ~]# echo $[$RANDOM%900+100]
553
#--取159开头的100个随机电话号码
[root@discuz ~]# vim random.sh
[root@discuz ~]# sh random.sh 
[root@discuz ~]# cat phone.txt
...
15955326372
15981207303
15942495678
15920479568
15990015799
15904579441
15912460264
15967241215
15999574369
15937776928
15909392098
15996047115
15955372446
15913429628
15934132031
15942017634
[root@discuz ~]# cat random.sh 
#!/bin/bash
for ((i=1;i<=100;i++))
do
    n1=$[$RANDOM%10]
    n2=$[$RANDOM%10]
    n3=$[$RANDOM%10]
    n4=$[$RANDOM%10]
    n5=$[$RANDOM%10]
    n6=$[$RANDOM%10]
    n7=$[$RANDOM%10]
    n8=$[$RANDOM%10]
    echo "159$n1$n2$n3$n4$n5$n6$n7$n8" >> phone.txt
done
#--在100个手机号中随机抽取3个
[root@discuz ~]# vim random.sh 
[root@discuz ~]# sh random.sh 
幸运观众手机号码是:15975645353
幸运观众手机号码是:15950301102
幸运观众手机号码是:15968506485
恭喜以上宠儿
[root@discuz ~]# cat random.sh 
#!/bin/bash
> /root/phone.txt
for ((i=1;i<=100;i++))
do
    n1=$[$RANDOM%10]
    n2=$[$RANDOM%10]
    n3=$[$RANDOM%10]
    n4=$[$RANDOM%10]
    n5=$[$RANDOM%10]
    n6=$[$RANDOM%10]
    n7=$[$RANDOM%10]
    n8=$[$RANDOM%10]
    echo "159$n1$n2$n3$n4$n5$n6$n7$n8" >> phone.txt
done
    #将文件中的手机号定义为数组
    phone=(`cat /root/phone.txt`)
    #将数组中的元素个数计算出来
    num=`echo ${#phone[*]}`
for ((i=1;i<=3;i++))
do
    #产生随机的下标(索引)
    index=`echo $[$RANDOM%$num]`
    #通过随机下标获取一个随机的电话号码
    echo "幸运观众手机号码是:${phone[$index]}"
done
echo "恭喜以上宠儿"

 嵌套循环

shell函数 

[root@discuz ~]# sh for_in.sh 
1
12
123
1234
12345
[root@discuz ~]# cat for_in.sh 
#!/bin/bash
for ((i=1;i<=5;i++))
do
    for ((j=1;j<=i;j++))
    do
	echo  -n "$j"
    done
    echo
done

[root@discuz ~]# sh for_in.sh 
1*1=1	
2*1=2	2*2=4	
3*1=3	3*2=6	3*3=9	
4*1=4	4*2=8	4*3=12	4*4=16	
5*1=5	5*2=10	5*3=15	5*4=20	5*5=25	
6*1=6	6*2=12	6*3=18	6*4=24	6*5=30	6*6=36	
7*1=7	7*2=14	7*3=21	7*4=28	7*5=35	7*6=42	7*7=49	
8*1=8	8*2=16	8*3=24	8*4=32	8*5=40	8*6=48	8*7=56	8*8=64	
9*1=9	9*2=18	9*3=27	9*4=36	9*5=45	9*6=54	9*7=63	9*8=72	9*9=81	
[root@discuz ~]# cat for_in.sh 
#!/bin/bash
for ((i=1;i<=9;i++))
do
    for ((j=1;j<=i;j++))
    do
	let result=$j*$i
	echo -n -e "$i*$j=$result\t"
    done
    echo
done

#--设置函数并传递参数
[root@discuz ~]# sh test.sh 1 2
3
[root@discuz ~]# cat test.sh 
#!/bin/bash
ADD(){
    let a=$1+$2
    echo $a
}
ADD $1 $2
#--查看服务状态,查看时间
[root@discuz ~]# systemctl is-active httpd
active
[root@discuz ~]# systemctl stop httpd
[root@discuz ~]# systemctl is-active httpd
inactive
[root@discuz ~]# echo $?
3
[root@discuz ~]# systemctl start httpd
[root@discuz ~]# systemctl is-active httpd
active
[root@discuz ~]# echo $?
0
[root@discuz ~]# date +%F\ %T
2025-01-30 19:30:18
[root@discuz ~]# systemctl --quiet is-active httpd
[root@discuz ~]# echo $?
0
[root@discuz ~]# vim format.sh
[root@discuz ~]# sh format.sh httpd
[2025-01-30 19:42:56]:httpd.service is active
[root@discuz ~]# systemctl stop httpd
[root@discuz ~]# sh format.sh httpd
[2025-01-30 19:43:08]:httpd.service is not active
[root@discuz ~]# cat format.sh 
#!/bin/bash
date_format=`date +%F\ %T`
check_service() {
    for i in $@
do
    if systemctl --quiet is-active $i.service;then
        echo -e "\033[32m[$date_format]:$i.service is active\033[0m"
    else
        echo -e "\033[31m[$date_format]:$i.service is not active\033[0m"
    fi
done
}

check_service $@

#--写网段,记录可以ping通的主机
[root@discuz ~]# cat ip.txt 
192.168.81.2
192.168.81.2
[root@discuz ~]# cat ip.sh 
#!/bin/bash
read -p "请输入一个网段:" range
for ((i=1;i<=10;i++))
do
    ping -c 2 $range.$i &>/dev/null
    if [ $? -eq 0 ];then
        echo "$range.$i" >> ip.txt
    fi
done
#--计算1~100的和
[root@discuz ~]# vi sz.sh
[root@discuz ~]# sh sz.sh 
5050
[root@discuz ~]# cat sz.sh 
#!/bin/bash
a=0
for ((i=1;i<=100;i++))
do
    let a=$a+$i
done
echo $a
#--求1~100的偶数和
[root@discuz ~]# sh sz.sh 
2550
[root@discuz ~]# cat sz.sh 
#!/bin/bash
a=0
for ((i=1;i<=100;i++))
do
    if [ $(($i%2)) -eq 0 ];then
    let a=$a+$i
    fi
done
echo $a

 练习

##1.使用脚本让用户对随意的两个整数进行加减乘除进行计算,并输出结果?且用户输入exit退出脚本,输入其它不退出脚本?输入非数字提示输入不正确?
[root@discuz ~]# sh sz.sh
请输入两个整数,空格隔开a b
输入不正确,请输入有效整数
请输入两个整数,空格隔开10 20
请输入一个计算方式(+ - * /)+
加法的结果为30
请输入两个整数,空格隔开10 20 
请输入一个计算方式(+ - * /)/
除法的结果为0
请输入两个整数,空格隔开10 20
请输入一个计算方式(+ - * /)*
乘法的结果为200
请输入两个整数,空格隔开20 10
请输入一个计算方式(+ - * /)/
除法的结果为2
请输入两个整数,空格隔开exit
[root@discuz ~]# cat sz.sh 
#!/bin/bash
while true; do
    read -p "请输入两个整数,空格隔开" n m
    if [ $n = "exit" ]; then
        break
    fi
    if ! [[ "$n" =~  ^-?[0-9]+$ ]]; then
        echo "输入不正确,请输入有效整数"
        continue
    fi
        read -p "请输入一个计算方式(+ - * /)" c
	case $c in
	+)
 		let a=$n+$m
 		echo "加法的结果为$a"
	;;
	-)
		let a=$n-$m
		echo "减法的结果为$a"
	;;
	\*)
		let a=$n*$m
		echo "乘法的结果为$a"
	;;
	/)
		let a=$n/$m
		echo "除法的结果为$a"
	;;
	esac
done
9..判断用户输入的分数?小于60 提示成绩不合格,大于等于60小于等于70 提示继续努力,大于70小于等于80 提示 良好继续加油,大于80小于等于90 提示优秀,大于90小于等于100 提示非常棒,输入其它提示输入不正确请重新输入。
[root@discuz ~]# sh sum.sh 
请输入您的分数(1~100)111
输入不正确,请重新输入
[root@discuz ~]# sh sum.sh 
请输入您的分数(1~100)100
非常棒
[root@discuz ~]# sh sum.sh 
请输入您的分数(1~100)60
继续努力
[root@discuz ~]# sh sum.sh 
请输入您的分数(1~100)59
不及格
[root@discuz ~]# sh sum.sh 
请输入您的分数(1~100)90
优秀
[root@discuz ~]# cat sum.sh 
#!/bin/bash
read -e -p "请输入您的分数(1~100)" num
if [ $num -lt 60 ];then
    echo "不及格"
elif [ $num -ge 60 -a $num -le 70 ]; then
    echo "继续努力"
elif [ $num -gt 70 -a $num -le 80 ]; then
    echo "良好,继续加油"
elif [ $num -gt 80 -a $num -le 90 ]; then
    echo "优秀"
elif [ $num -gt 90 -a $num -le 100 ]; then
    echo "非常棒"
else
    echo "输入不正确,请重新输入"
fi

10. 自定义命令 ”fw “ ,让用户通过 fw 命令管理防火墙 firewalld的 启动、 重启、 停止 、和状态、及 查看帮助信息?
    如: 
     fw  start    启动firewalld
     fw  stop       停止firewalld
     fw  status    查看firewalld 状态
     fw  restart    重启firewalld
     fw  --help 或 -h    查看fw 命令帮助信息
 [root@discuz ~]# sh 1.sh
请输入您系统的状态fw stop
停止firewalld
[root@discuz ~]# sh 1.sh
请输入您系统的状态fw status
● firewalld.service - firewalld - dynamic firewall daemon
   Loaded: loaded (/usr/lib/systemd/system/firewalld.service; disabled; vendor preset: enabled)
   Active: inactive (dead)
     Docs: man:firewalld(1)

1月 30 22:15:49 discuz systemd[1]: Starting firewalld - dynamic firewall daemon...
1月 30 22:15:49 discuz systemd[1]: Started firewalld - dynamic firewall daemon.
1月 30 22:15:49 discuz firewalld[2347]: WARNING: AllowZoneDrifting is enabled. Th...w.
1月 30 22:16:23 discuz systemd[1]: Stopping firewalld - dynamic firewall daemon...
1月 30 22:16:24 discuz systemd[1]: Stopped firewalld - dynamic firewall daemon.
Hint: Some lines were ellipsized, use -l to show in full.
查看firewalld状态
[root@discuz ~]# sh 1.sh
请输入您系统的状态fw -h
usage: firewalld [-h] [--debug [level]] [--debug-gc] [--nofork] [--nopid]
                 [--system-config path] [--default-config path]
                 [--log-file path]

optional arguments:
  -h, --help            show this help message and exit
  --debug [level]       Enable logging of debug messages. Additional argument
                        in range 1..10 can be used to specify log level.
  --debug-gc            Turn on garbage collector leak information. The
                        collector runs every 10 seconds and if there are
                        leaks, it prints information about the leaks.
...
[root@discuz ~]# cat 1.sh 
#!/bin/bash
read -e -p "请输入您系统的状态" fw a 
fw=firewalld
case $a in
start)
    systemctl start firewalld
    echo "启动firewalld"
;;
status)
    systemctl status firewalld
    echo "查看firewalld状态"
;;
stop)
    systemctl stop firewalld
    echo "停止firewalld"
;;
restart)
    systemctl restart firewalld
    echo "firewalld重启"
;;
--help)
    firewalld --help
;;
-h)
    firewalld --help
;;
*)
    echo "请重新输入"
esac
10.使用脚本统计曾经登录过linux系统的ip,并取出登录次数最多的前三 的ip地址?(查看登录系统ip的命令 who /var/log/wtmp)
[root@discuz ~]# who /var/log/wtmp | grep -oE "([0-9]{1,3}\.){3}[0-9]{1,3}"|uniq -c
     15 192.168.81.1
12. 使用脚本 打印菜单,根据用户选择输出相关信息?
     1) 显示磁盘信息及磁盘使用率
     2) 显示内存信息及内存使用率
     3) 显示网卡信息及网卡ip
     4) 退出脚本
[root@discuz ~]# sh 1.sh
1查看磁盘;2查看内存信息;3查看网卡信息;4退出3
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host 
       valid_lft forever preferred_lft forever
2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UNKNOWN group default qlen 1000
    link/ether 00:0c:29:fd:00:2a brd ff:ff:ff:ff:ff:ff
    inet 192.168.81.130/24 brd 192.168.81.255 scope global noprefixroute dynamic ens33
       valid_lft 1775sec preferred_lft 1775sec
    inet6 fe80::20c:29ff:fefd:2a/64 scope link 
       valid_lft forever preferred_lft forever
1查看磁盘;2查看内存信息;3查看网卡信息;4退出2
              total        used        free      shared  buff/cache   available
Mem:           3770         377        3111          12         281        3168
Swap:          2047           0        2047
1查看磁盘;2查看内存信息;3查看网卡信息;4退出1
NAME            MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT
sda               8:0    0   20G  0 disk 
├─sda1            8:1    0    1G  0 part /boot
└─sda2            8:2    0   19G  0 part 
  ├─centos-root 253:0    0   17G  0 lvm  /
  └─centos-swap 253:1    0    2G  0 lvm  [SWAP]
sr0              11:0    1  4.4G  0 rom  
1查看磁盘;2查看内存信息;3查看网卡信息;4退出4
[root@discuz ~]# cat 1.sh 
#!/bin/bash
while true; do
read -e -p "1查看磁盘;2查看内存信息;3查看网卡信息;4退出" a
case $a in
1)
    echo "`lsblk`"
;;
2)
    echo "`free -m`"
;;
3)
    echo "`ip a`"
;;
4)
    exit
esac
done


#1.循环测试192.168.20.0/24网段主机是否被机器占用,占用输出ip已被占用,未占用,将ip保存到当前目录下命名为ip.txt?
[root@discuz ~]# cat 2.sh 
#!/bin/bash
while true;do
    for ((i=1;i<=100;i++));do
    ping -c 2 192.168.20.$i
        if [ $? -eq 0 ] ;then
            echo "IP已被占用"
        else 
            echo "192.168.20.$i" >> ip.txt
        fi
    done
    exit
done
[root@discuz ~]# cat ip.txt 

192.168.20.1
192.168.20.2
192.168.20.3
192.168.20.4
192.168.20.5
192.168.20.6
192.168.20.7
192.168.20.8
192.168.20.9
192.168.20.10
192.168.20.11
192.168.20.12
192.168.20.13
192.168.20.14

#2.定义函数,实现整数的加减乘除计算?
[root@discuz ~]# sh 3.sh
请输入两个整数以及计算符号,空格隔开10 20 +
加法的结果为30
请输入两个整数以及计算符号,空格隔开10 20 *
乘法的结果为200
请输入两个整数以及计算符号,空格隔开10 20 -
减法的结果为-10
请输入两个整数以及计算符号,空格隔开10 20 /
除法的结果为0
请输入两个整数以及计算符号,空格隔开exit
[root@discuz ~]# cat 3.sh 
#!/bin/bash
while true; do
    if [[ $n = "exit" ]] ; then
        break
    fi
check_sum() {
read -p "请输入两个整数以及计算符号,空格隔开" n m i
    case $i in
	+)
 		let a=$n+$m
 		echo "加法的结果为$a"
	;;
	-)
		let a=$n-$m
		echo "减法的结果为$a"
	;;
	\*)
		let a=$n*$m
		echo "乘法的结果为$a"
	;;
	/)
		let a=$n/$m
		echo "除法的结果为$a"
	;;
	esac
}
check_sum $i
done
1.使用脚本配置服务器ip地址,并让用户输入想要配置的ip、网关、DNS?并判断用户输入的ip是否被占用?如果被占用提示用户请更换ip?
#!/bin/bash

# 函数:判断IP是否被占用
is_ip_occupied() {
    ping -c 1 "$1" &> /dev/null
    return $?
}

# 获取用户输入的IP地址
while true; do
    read -p "请输入想要配置的IP地址: " ip
    if [[ $ip =~ ^([0-9]{1,3}\.){3}[0-9]{1,3}$ ]]; then
        if is_ip_occupied $ip; then
            echo "该IP地址已被占用,请更换IP。"
        else
            break
        fi
    else
        echo "IP地址格式不正确,请重新输入。"
    fi
done

# 获取用户输入的网关
read -p "请输入网关: " gateway

# 获取用户输入的DNS
read -p "请输入DNS: " dns

# 配置IP地址
sudo ifconfig eth0 $ip netmask 255.255.255.0

# 配置网关
sudo route add default gw $gateway

# 配置DNS
echo "nameserver $dns" | sudo tee /etc/resolv.conf > /dev/null

echo "网络配置成功。"

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值