01 为什么需要学shell编程_哔哩哔哩_bilibili
目录
条件1 && 条件1成立要执行的操作 || 条件1不成立要执行的操作
通过test命令判断heiheihei.txt文件是否存在,不存在就创建
Shell脚本不同于python脚本,中间报错还会继续向下执行
什么是shell
Shebang
CentOS支持多种Shell
运行shell脚本的命令
如何运行filename.sh?
/bin/bash filename.sh、
bash filename.sh、
sh filename.sh、
或者
chmod +x filename.sh # 赋予文件可执行权限
./filename.sh
查看历史命令的相关命令
history #查看历史命令
history 10 #显示最近10条命令
echo $HISTSIZE #history命令显示的历史命令条数
echo $HISTFILE #存放历史命令的文件
history -c #清除历史命令
history -r #恢复历史命令
! 3006 #!+历史命令id,执行该历史命令
!! #执行上条命令,类似上下键寻找命令
创建新用户
几个简单的Shell内置命令
echo
-n 不换行输出
-e 解析字符串中的特殊符号如\n
\n 换行
\r 回车
\t 制表符 四个空格
\b 退格
printf 命令可以识别特殊字符
eval 命令可以执行多个命令
exec 不创建子进程,执行后续命令且执行完毕后自动exit
Shell内置命令和外置命令
内置命令:系统启动时就会加载到内存中一直存在,内置命令和shell进程是一体的不会开启子进程执行,执行效率高但占资源,如cd命令;
外置命令:系统需要从硬盘中加载程序文件到内存执行效率低,是自己单独下载的文件系统命令,处于bash shell之外的程序,一般存储在/bin、/usr/bin、/sbin、/usr/sbin,外置命令一定会开启子进程执行;
通过linux的type命令可以验证某命令是否是内置/外置命令;
查看shell内置命令列表的命令:compgen -b
变量
定义变量、单双反引号和$()的区别
shell中变量全都是字符串类型,定义变量不需要加$符
name="奥利给" # =号前后不能有空格,双引号可以改为单引号,也可以省略
name1='${name}' #单引号,不能识别特殊语法
echo $name1
${name}
name2="${name}" #双引号,可以识别特殊语法
echo $name2
奥利给
nickname=`whoami` #反引号中的内容被作为命令执行,同$(),结果赋给nickname
变量作用域
pstree 命令用于查看进程树。
局部变量,仅在本地会话中才有效,运行sh命令即进入到新会话;假如在两个终端中同时以一个用户名登录(一个用户可以同时在不同的终端多次登陆),此时两个终端分属不同的进程树分支,局部变量互不影响。
全局变量即环境变量,针对当前shell及其任意子进程有效,如$PATH。
特殊变量,$?,返回值0表示上条命令执行成功,返回值1-255是错误码。
环境变量设置
非root用户登录后所在目录为用户的家目录即/home/{用户名}目录
~对非root用户而言即代表家目录而非根目录
~目录下有用户环境变量配置文件~/.bash_profile和~/.bashrc,用户登录时加载一次
ls /usr/local -a # 显示/usr/local目录下所有文件
ls ~ -a # 显示家目录下所有文件
只有root用户才有权限编辑全局环境变量配置文件/etc/profile和/etc/bashrc,此文件在登录系统时加载一次
如果全局环境变量配置文件和用户环境变量配置文件都定义了变量name,后者会覆盖前者
远程登录linux服务器如何设置终端失效时间
(即过了多久不操作,终端即将失效)。
方法如下:
[root@mq-console-nameserver ~]
# vim /etc/profile
......
export
TMOUT=600
[root@mq-console-nameserver ~]
# source /etc/profile
如上设置后,登录这台服务器的终端在10分钟内不做操作,则该终端就将失效!
环境变量初始化与加载顺序
如果全局环境变量配置文件和用户环境变量配置文件都定义了变量name,后者会覆盖前者
查看环境变量的命令
set # 输出所有变量,包括全局的和局部的
set | wc -l # 统计行数
ls -l /etc | grep "^d" | wc -l # 统计/etc/下目录的个数。执行ls -l命令后,一个目录显示为一行,所以统计行数即为统计目录数,grep "^d"过滤出目录
set | grep ^name # ^name表示以name开头的行
declare # 同set
env # 只显示全局变量
export # 显示和设置环境变量值
readonly # 显示当前系统只读变量
# 使用awk命令输出所有的环境变量名:
删除变量
unset 变量名 # 删除变量或者函数
定义只读变量
exit当前shell,则当前shell的只读变量失效
readonly # 显示当前系统只读变量
shell特殊‘获取参数’变量 和 for语句
$_ # 获取上次命令的最后一个参数
$@和"$@"一样,加不加引号效果相同,每个参数都是独立的。但是$*被双引号包围时,会将所有参数看作一个整体,下面两段代码的结果是不同的:
$*和$@在没有被双引号包围时,两者没有区别,接受到的每个参数都是独立的,用空格分隔,也就是说下面两段代码是等效的:
[root@localhost code]# cat test.sh for var in $@ do echo ${var} done [root@localhost code]# [root@localhost code]# bash test.sh a b c d a b c d [root@localhost code]# chmod a+x test1.sh # a--all所有用户 [root@localhost code]# cat test1.sh for var in $* do echo ${var} done [root@localhost code]# ./test1.sh a b c d a b c d
shell特殊‘获取状态’变量
$? # 获取上条指令执行的结果
$! # 获取上次后台运行的进程的PID
$$ # 获取当前脚本的PID
$_ # 获取上次命令的最后一个参数
变量子串的用法
name="fanglong"
echo ${#name} # 8
echo ${name:2} # nglong
echo ${name:2:5} # nglon n个空格会占n个字符
echo ${name#fang} # long
echo ${name#ang} # fanglong 必须从开头就完全匹配
echo ${name%ong} # fangl
echo ${name%on} # fanglong 必须从结尾就完全匹配
name="fangfanglongfang"
echo ${name##fang} # fanglongfang
echo ${name##fang*long} # fang
统计变量值长度${#name}
最快的方式
echo ${#name}
wc命令
wc -l # 统计行数
wc -L # 统计最长一行的字符个数
expr命令(接收以空格分割的参数)
expr --help # 查看使用帮助
name="获取你的123"
expr length $name # 7 统计变量值长度
补充:
算数运算(必须加空格和\)
# 【必须加空格,最好加\否则乘法等会报错】 expr 5 \+ 2 # 7 expr 5 \/ 2 # 2 expr 5 \% 2 # 1
字符运算
expr length 1234567 # 7 expr length 1234567;j就 # 10
逻辑运算(必须加空格和\)
expr 5 \> 7 # 0 expr 5 \< 7 # 1
模式匹配(字符串匹配上了就统计匹配到部分的长度并返回,否则返回0)
: 计算字符串长度
.* 任意的字符重复任意次
.*\.jpg 匹配以任意字符开头和结尾,字符串中含有.jpg的字符串
.*\.jpg$ 添加$,表示.jpg只能出现在末尾
# 【添加$,表示.jpg只能出现在末尾】 expr yc.jpgggg ":" ".*\.jpg" # 6 expr yc.jpgggg ":" ".*\.jpg$" # 0
执行脚本,传入一个文件名,判断文件名后缀是否合法:
在shell中,0为false、1为真 expr 3 \- 1 # 2 expr 1 \- 1 # 0 if expr 3 \- 1 # 2 then echo "判断结果为true" # 判断结果为true else echo "判断结果为false" fi if expr 1 \- 1 # 0 then echo "判断结果为true" else echo "判断结果为false" # 判断结果为false fi if expr 3 \- 4 # -1 then echo "判断结果为true" # 判断结果为true else echo "判断结果为false" fi if 2 then echo "判断结果为true" else echo "判断结果为false" # 判断结果为false fi if expr yc.jpgggg ":" ".*jpg$" >/dev/null # 这里输入到黑洞中的是0 then echo "判断结果为true" else echo "判断结果为false" # 判断结果为false fi if expr yc.jpgggg ":" ".*jpg" >/dev/null # 这里输入到黑洞中的是6 then echo "判断结果为true" # 判断结果为true else echo "判断结果为false" fi 【总结: if 命令执行成功返回值为0, # false if 命令执行成功返回值不为0即便是负数, # true if 某个数字不管是0还是1还是正数, #false】
找出长度小于5的单词
-lt less than 小于
-le 小于等于
awk命令
name="获取你的123"
expr $name|awk '{print length($0)}' # $0 第一行
if语句
【总结:
if 命令执行成功返回值为0, # false
if 命令执行成功返回值不为0即便是负数, # true
if 某个数字不管是0还是1还是正数, #false】if条件判断参数
-z 判断字符串是否为空,空 - $?获取的状态码0 - 为true
-n 判断字符串是否非空,空 - $?获取的状态码非0 - 为false
扩展变量 和 find命令
${parameter:?word}用法:
删除某目录下7天以前的.tar.gz文件:
将当前目录及其子目录下所有文件后缀为.txt的文件列出来:
find . -name "*.txt"
BASH多命令一步执行
分号分割各命令
vim中如何粘贴、设置行号等
在拷贝前输入:set paste (这样的话,vim就不会启动自动缩进,而只是纯拷贝粘贴)
拷贝完成之后,输入:set nopaste (关闭paste)
在命令模式下输入
:set nu
或者
:set number
都可以为vi设置行号,如果要取消的话,则输入
:set nonu
行号的设置是vi的环境设置,不会影响文本的内容。:25 光标跳转到第25行
快速定位到另一半括号:将光标选中(),[],{},中的任何一半括号上,按下%键(shift+5),便可以看到此时光标已经跳转到另一半的括号上了。
nohup和>/dev/null 2>&1 &
一、背景说明:
启动服务的时候,如果使用如下命令,则会在start.sh脚本所在的目录下,产生一个名为 nohup.out 的输出文件
nohup ./startup.sh &这个多余的 nohup.out 文件是不需要的,可以使用如下命令解决:
nohup ./startup.sh >/dev/null 2>&1 &二、命令解析:
1、nohup和尾部 &
1)nohup 是no hangup,不要挂断,永久运行。关闭终端,当前运行的进程不终止,标准输出内容会输出到当前目录的 nohup.out 日志文件中而不显示在终端。
2)命令最后一个 &,表示后台运行的意思,和 nohup 一起配置表示不挂断后台运行。
2、>/dev/null 和 2>&1
1)/dev/null 是 Linux 一个空设备文件,通常也被称为位桶(bit bucket)或黑洞,这个文件接收到任何数据都会被丢弃,也就是不输出任何信息到终端。
2)> 代表重定向到哪里;重定向的符号有两个:> 或 >>,> 会先清空文件,然后再写入内容,>> 会将重定向的内容追加到现有文件的尾部。
3)Linux系统预留了三个文件描述符:0、1 和 2,他们的意义如下所示:
①0:标准输入流 stdin
②1:标准输出流 stdout,默认值是1
③2:标准错误流 stderr
4)">/dev/null" 等价于 "1>/dev/null",表示标准输出(1)输出到 /dev/null 中,即终端不输出标准输出信息;
"2>&1" 中的 “&” 是等价于的意思,表示标准错误(2)输出的位置等价于标准输出(1)的位置,即等价于 “2>/dev/null”, 即终端不输出标准错误信息。
因此,">/dev/null 2>&1" 表示 标准错误信息和标准输出信息,在终端上均不输出。
三、指定输出文件:
如果想要将服务启动和运行过程中的日志信息输出到指定位置(比如:/var/log/start.log),可以参考如下命令:
nohup ./startup.sh >/var/log/start.log 2>&1 & 或 nohup sh startup.sh >/var/log/start.log 2>&1 &
四、sh xxx.sh与./xxx.sh区别:
sh xxx.sh是用sh执行startup.sh,startup.sh可以没有执行标志,可以不用加./,可以不用在脚本第一行写上#! /bin/sh。
./startup.sh是调用脚本第一行指定的shell去解释执行,缺省为sh,就是bash,需要chmod +x startup.sh赋予可执行权限。五、补充
for n in {1..10}
do
char=`seq -s "chaoge" 10`
echo ${#char} 1>/dev/null # 1>/dev/null同&>/dev/null同>/dev/null,echo不会打印
1>/dev/null # 须写在一行,分行写无效done
for循环
seq命令-生成序列
seq -s ":" 10 # 指定分隔符
time命令-统计命令执行时长
time for n in {1..10}
do
char=`seq -s "chaoge" 10`
echo ${#char} >/dev/null
done
同
time for n in {1..10};do char=`seq -s "chaoge" 10`;echo ${#char} >/dev/null;done
mv命令
将/usr/udt中的所有文件移到当前目录(用”.”表示)中:
mv /usr/udt/* .
把当前目录里的文件移动到另一个目录里
mv 当前目录/* 另一个目录
移动当前文件夹下的所有文件到上一级目录../表示
mv * ../
批量创建文件&批量修改文件名
批量创建文件:
修改当前目录下所有jpg文件的文件名,去掉_finished字符
父子shell
pstree可以查看进程树,ps -ef --forest也可以查看进程树:
exit命令可以退出子shell。
使用子shell可以做什么?
测试:
使用小括号是开启了子shell运行,$BASH_SUBSHELL返回1
不使用小括号是在当前shell运行,$BASH_SUBSHELL返回0
多个小括号嵌套时会嵌套shell执行,$BASH_SUBSHELL值会累加
数学运算脚本开发
数学运算基础学习-双小括号$(( ))计算等
逻辑运算,真为1假为0:
shell的一些基础命令只支持整数运算,小数运算则需要像bc这样的命令才支持:
面试题:
通过$1特殊参数变量把计算表达式作为脚本的参数传递到脚本中进行计算:
sed命令-字符串替换
name="qwe123" # echo不能去掉,s代表替换支持正则,[0-9]正则,替换成m,g表示全部替换不止第一个 res="`echo $name|sed 's/[0-9]/m/g'`" echo $res # qwemmm # 只替换第一个数字,最后一个/不能去掉 res="`echo $name|sed 's/[0-9]/m/'`" echo $res # qwem23 # 把数字去掉 res="`echo $name|sed 's/[0-9]//g'`" echo $res # qwe
开发一个接收用户输入数值并计算的脚本,判断输入是否合法:
Let运算命令
let命令效果等同于双小括号,但是效率相对较慢
num=8 num=num+8 echo $num # num+8 unset num num=8 let num=num+8 echo $num # 16 unset num num=8 echo $((num = num + 8)) # 16
$[]计算
num=5; echo $[num*4] # 20 echo $[num+4*-1*num] # -15 #中括号方式不支持小数运算 # num1=5.1 # echo $[num1+4] # syntax error: invalid arithmetic operator (error token is ".1")
awk命令(支持小数计算)
bc命令(支持小数计算)
敲bc回车即可进行交互式计算
数值与运算符之间加不加空格都可以
管道符 + bc 非交互式的小数计算,可以在脚本中做小数计算并赋值
计算1~100的和
第一步,先生成字符串计算公式:
echo {1..100} | tr " " "+"
或
seq -s "+" 100
第二步,双括号计算/bc计算/expr计算
xargs是linux中构造参数的命令
echo $((`seq -s "+" 100`)) echo $((`echo {1..100} | tr " " "+"`)) echo {1..100} | tr " " "+" | bc seq -s "+" 100| bc # expr接收的参数需要空格分割,所以+前后须有空格 seq -s " + " 100| xargs expr
tr命令(替换字符、删除字符等)
把空格替换为+
echo {1..10} # 1 2 3 4 5 6 7 8 9 10 echo {1..10} | tr " " "+" # 1+2+3+4+5+6+7+8+9+10
删除字符串中的指定字符
echo {1..10} | tr -d " " # 12345678910 echo {1..10} | tr -d "2" # 1 3 4 5 6 7 8 9 10 # "158"中的1、5、8处理为单个字符 echo "112345678910" | tr -d "158" # 2346790
网址服务状态监测脚本
read命令
(-t 等待用户输入超时,秒)
(-p 指定接收用户输入的参数,可以多个参数)
条件测试
test命令条件测试
选项参数
-e 判断文件或者目录是否存在,存在则命令执行返回状态码为0,否则不为0
-f 判断是否为文件/文件是否存在
-d 判断是否为目录/目录是否存在
-b 判断文件是否作为block device块设备
-c 判断文件是否作为character device设备
-S 判断文件是否作为Socket文件
-p 判断文件是否作为FIFO(pipe)文件
-L 判断文件是否作为连接档
-r 判断文件是否可读
-w 判断文件是否可写
-x 判断文件是否可执行
-u 判断文件是否具有SUID属性
-g 判断文件是否具有SGID属性
-k 判断文件是否具有sticky bit属性
-s 判断文件是否为非空白文件
-z 判断字符串是否为空,空 - $?获取的状态码0 - 为true
-n 判断字符串是否非空,空 - $?获取的状态码非0 - 为false
-a、-o、!
-nt、-ot、-ef
inode即索引节点,用来存放文件或目录的基本信息,包含时间、链接数、群组等。
硬连接和软链接
"硬链接"(hard link)一般情况下,文件名和inode号码是"一一对应"关系,每个inode号码对应一个文件名。但是,Unix/Linux系统允许,多个文件名指向同一个inode号码。这意味着,可以用不同的文件名访问同样的内容;对文件内容进行修改,会影响到所有文件;但是,删除一个文件,不影响另一个文件的访问。ln命令可以创建硬链接:
ln 源文件 目标文件
"软链接"(soft link)除了硬链接以外,还有一种特殊情况。文件A和文件B的inode号码虽然不一样,但是文件A指向文件B的路径。读取文件A时,系统会自动将访问者导向文件B。因此,无论打开哪一个文件,最终读取的都是文件B。这时,文件A就称为文件B的"软链接"(soft link)或者"符号链接(symbolic link)。这意味着,文件A依赖于文件B而存在,如果删除了文件B,打开文件A就会报错:"No such file or directory"。这是软链接与硬链接最大的不同:文件A指向文件B的路径,而不是文件B的inode号码,文件B的inode"链接数"不会因此发生变化。ln -s命令可以创建软链接:
ln -s 源文件或目录 目标文件或目录
条件1 && 条件1成立要执行的操作 || 条件1不成立要执行的操作
通过test命令判断heiheihei.txt文件是否存在,不存在就创建
Shell脚本不同于python脚本,中间报错还会继续向下执行
使用shell编写创建hello目录的脚本
所以需要加条件判断,只需要将脚本中的mkdir hello命令替换成下面的命令即可
单中括号条件测试
test和[]作用一样,中括号前后需要有空格,
在单中括号中也可以使用 > 等比较运算符,但需要加转义符。
在单中括号中,只能使用-a、-o、!逻辑运算符,不能使用&&等。
使用变量必须用双引号包裹如"$name"
=、!=、!
双中括号条件测试
[[ 条件表达式 ]] 前后必须有空格,和单中括号区别:使用>等不需要转义;支持正则;
ll命令可以查看文件权限,
chmod 0 文件名 取消文件权限
chmod +r 文件名 授予可读权限
chmod +w 文件名 授予可写权限
支持正则 ~
>和>>区别
> 会覆盖目标的原有内容,当文件存在时,会先删除原文件,再重新创建文件,然后把内容写入该文件,否则直接创建文件。
>> 会在目标原有内容后追加内容,当文件存在时直接在文件末尾进行内容追加,不会删除原文件,否则直接创建文件。
比较运算符使用场景 区别
test命令也可以使用 > 等比较运算符。
在单中括号中也可以使用 > 等比较运算符,但需要加转义符。
在双中括号也可以使用-eq等。
在单中括号中也可以使用 > 等比较运算符,但需要加转义符,否则运算错误:
逻辑运算符使用场景 区别
在单中括号中,只能使用-a等逻辑运算符,不能使用&&等。
总结
在单中括号中也可以使用 > 等比较运算符,但需要加转义符。
在单中括号中,只能使用-a、-o、!逻辑运算符,不能使用&&等。
使用变量必须用双引号包裹如"$name"
test命令也可以使用 > 等比较运算符
开发一个脚本(接收用户输入,根据输入调用不同脚本)
在/shell_program/test_scripts目录下模拟两个将被调用的脚本:
开发脚本:
# 被调用脚本所在目录
# 判断目录是否存在,不存在就创建
# 打印在屏幕上的提示语
cat <<END
文本
END
# 限制只能输入数字
# 如果输入1
# 如果输入2
省略。。。
# 如果输入3 退出脚本
省略。。。
# 限制只能输入1,2,3
定时 内存检测 发邮件 脚本
1、需求
定时执行脚本检测内存,当内存小于某值,使用linux发邮件给运维
tee是Linux命令,用于显示程序的输出并将其复制到一个文件中,-a追加
2、编写脚本
在/shell_program/scripts/下编写脚本,由于没有安装mail服务故注释掉对应行
3、配置定时任务执行脚本
回车,编辑如下内容保存退出(退出即启动):
回车,显示当前运行的定时任务
如果任务未按照你的预期运行,可以通过
systemctl status cron.service
查看守护进程是否 running,使用journalctl -u cron.service
可以查看更多的日志信息。
4、cron定时任务
crond定时任务表达式的格式不同于java的cron表达式没有秒
*/3 * * * * 每3分钟执行1次
检测系统是否安装crond服务
- service crond status
- 所有的定时任务都是由
cron
守护进程来负责调度执行的,如果任务未按照你的预期运行,可以通过systemctl status cron.service
查看守护进程是否 running,使用journalctl -u cron.service
可以查看更多的日志信息。安装
- yum -y install vixie-cron
- yum -y install crontabs
cron服务是linux的内置服务,但它不会开机自动启动。可以用以下命令启动和停止服务:
/sbin/service crond start /sbin/service crond stop /sbin/service crond restart /sbin/service crond reload
要把cron设为开机启动
- 在/etc/rc.d/rc.local脚本中加入
/sbin/service crond start
即可。设置开机自动启动
- chkconfig --level 345 crond on
linux系统是一个多用户系统,crontab也支持多用户,每个用户都可以有自己的crontab(在 /var/spool/cron/crontabs下),比如
sudo crontab -u root -e
便可编辑 root 用户的配置。除此之外,/etc/cron.allow
文件控制哪些用户可以使用 crontab,/etc/cron.deny
文件控制哪些用户不可以使用 crontab。系统级的crontab:
/etc/crontab
文件中设置的是一些系统级的定时任务,其中每行都多了一个执行用户,并且是直接编辑该文件而不是使用crontab
命令来管理。
- file 使用file文件作为某个用户的cron服务配置,内容会复制到cron服务此用户的配置文件中,可省略此参数
crontab
-u 指定某个用户的cron服务配置,这个前提是你必须要有其权限(比如说是 root)才能够指定他人的时程表,一般 root 用户在执行这个命令的时候需要此参数。如果不使用 -u user 的话,就是表示设定自己的时程表。crontab -l
查看当前运行的定时任务crontab -r
删除所有的定时任务crontab -e
回车打开文件编辑定时任务保存退出- 停止某个定时任务,只需要
-e
的时候使用#
将其注释即可crontab默认编辑器为nano,设置crontab的默认编辑器:
1、永久性设置:在 /etc/profile、/etc/bashrc 文件,$HOME/.bashrc文件或者$HOME/.bash_profile文件里面添加export EDITOR=vim
echo export EDITOR=vim >>$HOME/.bashrc
2、临时设置:
export EDITOR=”/usr/bin/vim” ; crontab -e3、更简单的办法,直接执行命令:select-editor,然后选择3(不是所有发行版都有这个命令)
root@ubuntu:~# select-editor
Select an editor. To change later, run ‘select-editor’.
1. /bin/ed
2. /bin/nano <—- easiest
3. /usr/bin/vim.basic
4. /usr/bin/vim.tinyChoose 1-4 [2]: 3
5、mail服务安装
date命令格式化
date +%F\ %T # 2022-10-21 15:31:47 date +%F%T # 2022-10-2115:31:31 date +%F-%T # 2022-10-21-15:31:09 其他格式略,参考: https://blog.csdn.net/drcwr/article/details/50971637
服务监控命令、脚本
服务器本地监控本地服务
netstat命令
netstat -tunlp | grep 3306 | wc -l # 查看端口为3306的进程
netstat -tunlp | grep mysql | wc -l # 查看服务名为mysql的进程
ss命令
ss -tunlp | grep mysql | wc -l
lsof命令
lsof -i:3380 | wc -l
lsof -i tcp:3380 | wc -l
ps命令加grep -v grep
远程监控远程服务
yum -y install telnet nmap nc
nmap命令
nmap 远程服务器ip -p 3380
telnet命令
telnet ip port
nc命令
nc命令在linux系统中实际命令是ncat,nc是软连接到ncat。
-l 用于指定nc将处于侦听模式。指定该参数,则意味着nc被当作server,侦听并接受连接,而非向其它地址发起连接
-s 指定发送数据的源IP地址,适用于多网卡机
-u 指定nc使用UDP协议,默认为TCP
-v 输出交互或出错信息,新手调试时尤为有用
-w 超时秒数,后面跟数字
-z 表示zero,表示扫描时不发送任何数据
-n 直接使用IP地址,而不通过域名服务器
-r 乱数指定本地与远端主机的通信端口
- 如下验证172.16.7.78服务器的80端口通,81端口不通:
- 端口扫描,通的端口返回succeeded,不通的端口返回refused
nc -zv -w 2 172.16.7.78 22-81
- 文件传输
首先在文件接收终端test2机器上激活nc监听,开放端口33333,保存为tc.txt
然后在文件发送终端test1机器上发送文件,指定目标ip port,要传输的文件
在test2上检查文件是否已成功接收
- 通信聊天
test1主机上启动nc监听,ctrl+C中断通信。
test2上连接监听,ctrl+C中断通信。
php/python脚本案例(连接mysql)
php脚本
在脚本中调用外部脚本:
python脚本
服务启停脚本开发案例-未使用函数
killall命令
killall [选项] name
选项包含如下几个参数:
- name : 进程名
- -e | --exact : 进程需要和名字完全相符
- -I | --ignore-case :忽略大小写
- -g | --process-group :结束进程组
- -i | --interactive :结束之前询问
- -l | --list :列出所有的信号名称
- -q | --quite :进程没有结束时,不输出任何信息
- -r | --regexp :将进程名模式解释为扩展的正则表达式。
- -s | --signal :发送指定信号
- -u | --user :结束指定用户的进程
- -v | --verbose :显示详细执行过程
- -w | --wait :等待所有的进程都结束
- -V |--version :显示版本信息
- --help :显示帮助信息
alias命令
alias #列出已存在的别名
alias catname="cat /usr/local/springboot/spring.config" # 创建别名,使命令更易用
执行catname命令,等同执行cat /usr/local/springboot/spring.config
>和>>
>是覆盖
>>是追加
函数
return [ n ]
其中,n是退出函数时的退出值(退出状态), 即$?的值。当n值默认时,则退出值是最后一个命令执行后的退出值!function关键字和()可以省略,
参数不能写在括号中,当n>=10时,需要使用${n}来获取参数,
$*不加引号=$@不加引号:
function sayHello() { echo "第一个参数为 $1 !" echo "第二个参数为 $2 !" echo "第十个参数为 ${10} !" echo "第十一个参数为 ${11} !" echo "参数总数有 $# 个!" echo "作为一个字符串输出所有参数 $* !" }
第一种方式,函数定义和函数调用在同一文件中,略。
第二种方式,函数定义在单独文件中,在外部调用函数:
set是显示当前shell的全局变量和局部变量,执行此命令会发现没有环境变量chao
输入函数名回车就可以执行此函数,相当于一个命令了
检测网站存活-使用函数开发脚本
wget命令
-q, –-quiet 安静模式(没有输出)
-o, –-output-file=FILE 把记录写到FILE文件中
-a, –-append-output=FILE 把记录追加到FILE文件中--spider 不下载任何东西
-t, –-tries=NUMBER 设定最大尝试链接次数(0 表示无限制)
-T, –-timeout=SECONDS 设定响应超时的秒数
-w, –-wait=SECONDS 两次尝试之间间隔SECONDS秒不用函数时:
改造为使用函数:
执行使用函数的脚本,可以看到美化的“确定“和”失败”:
服务启停脚本开发案例-使用函数
/etc/init.d/目录下一般存放服务启停管理相关脚本
完结撒花!!!!!!!!!勇毅前行、踔厉奋发