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 "网络配置成功。"