脚本 Learning
● Primary tutorial
1. bat(Batch)
1. 概念解析 -(知识、异常处理)
1. 解决 Bat脚本
中包含中文,运行乱码
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-0mV4jRvV-1608020507501)(C:\Users\Administrator\Desktop\Notes\pic\bat ping 20121001.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-scMccEVe-1608020507505)(C:\Users\Administrator\Desktop\Notes\pic\bat ping 20121002.png)]
2. 批处理脚本传递参数
批处理参数的传递与main函数居然非常相似
批处理文件中可引用的参数为%0~%9,
%1~%9是批处理参数,也称形参
@echo off
echo param[0] = %0
echo param[1] = %1
echo param[2] = %2
echo param[3] = %3
echo param[4] = %4
echo param[5] = %5
echo ...
pause
在控制台运行,并且处传入参数,运行结果如下:
F:\batTool>test_argv.bat 1 game test what
param[0] = test_argv.bat
param[1] = 1
param[2] = game
param[3] = test
param[4] = what
param[5] =
…
请按任意键继续…
总结:
- 如果不借助其他其他命令,批处理做多接收9个额外的参数。
- 使用
shift
命令可以对参数进行偏移,从而取到更多的参数 - 如果使用的某个参数没有传递进来,则该变量为空,如例子中的%5
1. bat 输入参数 / 应用参数值
@echo off
set /p var=请输入项目名:
echo 输入的项目名为:%var%, 如果正确按回车! //确认输入名
pause
sppbuild --create=%var%
%var% , 定义好变量,直接在变量前后各加一个% ,即可在脚本中进行使用。
2. xxx.bat
批处理 - 实现手动输入变量参数
情景:
批处理实现过程中实现手动输入动态参数,比如我在批处理中定义了a,b两个参数,但是参数的值需要在执行.bat的过程中去赋值,那么,该怎么去实现
执行:
首先,我们定义这两个参数:
set /p a=请输入a:
set /p b=请输入b:
set
是对参数的定义,动态的话需要加上 /p
的条件,
“=”
后面的内容便是对这个参数的描述,在用户需要输入值得时候提示用户。
测试:
set /p a=请输入a:
set /p b=请输入b:
echo %a% %b%
pause>nul
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-C4EcauoP-1608020507510)(C:\Users\Administrator\Desktop\Notes\pic\bat ping 20121005.png)]
2. ping ip
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-iKTsPidJ-1608020507517)(C:\Users\Administrator\Desktop\Notes\pic\bat ping 20121006.png)]
1. Windows 批处理 ping 某个网段
情景:想知道自己局域网内或外网任意某一段在线的ip,或想要知道目前有多少人同时在上网
思路:利用Windows内置的批处理功能完全可以实现批量ping查找指定网段存活主机的目的
@echo off
set /p ip="请输入IP地址段,格式如:"192.168.1." >>> "
for /L %%i in (1,1,254) do (
Ping.exe -n 1 -l 16 -w 100 %ip%%%i>>ipscan.txt
if not errorlevel 1 (echo %ip%%%i 可以ping通)
)
pause
执行:
复制以上代码粘贴到记事本文档里,然后另存为 ipscan.bat 。
然后双击一键运行 ipscan.bat 批处理脚本根据提示输入要扫描的IP段,就可以看到返回的结果了
结果:
格式类似于:
请输入IP地址段,格式如:”192.168.1.” >>> 192.168.1.
192.168.1.100 可以ping通
192.168.1.101 可以ping通
192.168.1.102 可以ping通
192.168.1.103 可以ping通
192.168.1.104 可以ping通
192.168.1.123 可以ping通
192.168.1.144 可以ping通
192.168.1.146 可以ping通
192.168.1.149 可以ping通
192.168.1.150 可以ping通
请按任意键继续…
修改:测试端口
@echo off
set /p ip="请输入IP地址段,格式如:"192.168.1." >>> "
set /p port="请输入要测试的端口,格式如:"1521" >>> "
for /L %%i in (1,1,254) do (
tcping.exe -n 1 %ip%%%i %port%>>ipportscan.txt
if not errorlevel 1 (echo %ip%%%i 可以tcping通)
)
pause
2. ping IP 后保存到 xxx.txt文档
ping 192.168.1.100 -t >>c:\pingtext.txt
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-qvRd9GmL-1608020507520)(C:\Users\Administrator\Desktop\Notes\pic\bat ping 20121003.png)]
3. 通过端口号,直接杀对应IP,解除端口占用
初始版:
1、优点:双击直接使用
@echo off
netstat -aon |findstr 4100>pid_log.txt
for /f "delims=" %%a in (pid_log.txt) do (
for /f "tokens=1* delims=:" %%i in ('call echo %%a^|find /i "TCP"') do (
echo %%a
)
)
rem 读取文件中内容
set /P OEM=<Pid_log.txt
rem 截取文件中的字符串
echo %OEM:~71,76%
taskkill /f /pid %OEM:~71,76%
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-fA6BTR2m-1608020507525)(C:\Users\Administrator\Desktop\Notes\pic\bat ping 20121004.png)]
1. 优化版(动态入参)
优化版:
@echo off
set /p ip="请输入需要解除占用的端口号,格式如:`4003` >>> "
netstat -aon |findstr %ip%>pid_log.txt
for /f "delims=" %%a in (pid_log.txt) do (
for /f "tokens=1* delims=:" %%i in ('call echo %%a^|find /i "TCP"') do (
echo %%a
)
)
rem 读取文件中内容
set /P OEM=<pid_log.txt
rem 截取文件中的字符串
echo %OEM:~71,76%
taskkill /f /pid %OEM:~71,76%
定义变量:set /p ip="请输入需要解除占用的端口号,格式如:
4003
>>> "使用变量:%ip%
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-HRF23Azb-1608020507527)(C:\Users\Administrator\Desktop\Notes\pic\bat ping 20121004.png)]
2. bash(Bourne-Again Shell)
1. 概念解析
1. Shell bash 和 sh 区别 - ★★
1. Shell / Shell 脚本 / sh / bash / dash
Shell 中文意思贝壳,寓意类似内核的壳。Shell是指一种应用程序,这个应用程序提供了一个界面,用户通过这个界面访问操作系统内核的服务。Shell 是一个用 C 语言编写的程序,它是用户使用 Linux 的桥梁。Shell 既是一种命令语言,又是一种程序设计语言。
Shell 脚本(shell script)是一种为 shell 编写的脚本程序。常说的shell通常都是指 shell 脚本,但shell和shell script是两个不同的概念。通常说“shell编程”都是指 shell 脚本编程,不是指开发 shell 自身。
sh(Bourne Shell)是一个早期的重要shell,1978年由史蒂夫·伯恩编写,并同Version 7 Unix一起发布。
bash(Bourne-Again Shell)是一个为GNU计划编写的Unix shell。1987年由布莱恩·福克斯创造。主要目标是与POSIX标准保持一致,同时兼顾对sh的兼容,是各种Linux发行版标准配置的Shell,在Linux系统上/bin/sh往往是指向/bin/bash的符号链接。
dash (Debian Almquist shell)一种 Unix shell。它比 Bash 小,只需要较少的磁盘空间,但是它的对话性功能也较少。它由 NetBSD版本的Almquist shell (ash)发展而来,于1997年由赫伯特·许(Herbert Xu)移植到Linux上,于2002年改名为 dash。
含义:
**#!**是一个特殊标记,说明这是一个可执行的脚本。除了第一行,其他以#开头的都不再生效,为注释。
#!后面是脚本的解释器程序路径。这个程序可以是shell,程序语言或者其他通用程序,常用的是 bash、sh。
#!/bin/bash
#!/bin/sh
查看:
cat /etc/shells 查看系统可使用的shell类型
cat /etc/passwd 查看当前默认设置,一般在第一行:
root:x:0:0:root:/root:/bin/bash
ll /bin/sh 查看当前sh状态
lrwxrwxrwx 1 root root 4 3月 31 2018 /bin/sh -> dash*
区别:
sh 遵循POSIX规范:“当某行代码出错时,不继续往下解释”。
bash 就算出错,也会继续向下执行。
POSIX表示可移植操作系统接口(Portable Operating System Interface of UNIX,缩写为 POSIX )。
POSIX标准意在期望获得源代码级别的软件可移植性。
换句话说,为一个POSIX兼容的操作系统编写的程序,应该可以在任何其它的POSIX操作系统上编译执行。
sh 脚本:
#!/bin/sh
source err
echo "test sh"
结果为:
testsh.sh: 2: testsh.sh: source: not found
bash 脚本:
#!/bin/bash
source err
echo "test sh"
结果为:
testsh.sh: 2: testsh.sh: source: not found
test sh
sh 跟 bash 的区别,实际上是bash有没开启POSIX模式的区别。
简单说,sh是bash的一种特殊的模式,sh就是开启了POSIX标准的bash, /bin/sh 相当于 /bin/bash --posix。
在Linux系统上/bin/sh往往是指向/bin/bash的符号链接
ln -s /bin/bash /bin/sh
2.
3. sh(Bourne Shell)
Shell脚本获取系统运行信息 (信息包括:内存M,硬盘%,CPU%,负载情况,进程数,等)
1. 概念解析
1. linux 中 .sh 文件是什么
linux中“.sh”文件是脚本文件,一般都是bash脚本,
我们可以使用sh命令运行“sh xxx.sh”,并且由于在linux中sh是链接到bash上的,所以sh与bash在功能上是没有区别的。
注:
sh或是执行脚本,或是切换到sh这个bash里,默认的shell是bash。
当然,linux中sh是链接到bash上的,所以sh与bash在功能上是没有区别的。
还有就是在执行脚本的时候是用sh + 脚本名的方式来执行,其实,大部分的时候,简单脚本只要权限设置正确,可以直接执行,不需要sh命令的。
1.【定位】:sh 一般设成 bash 的软链,一种特殊的模式
2. sh 与 bash 的区别
1. 发现区别
同样的 shell 脚本,使用 sh xxx.sh 和 bash xxx.sh 调用执行时结果不同,使用 sh 时会输出许多匪夷所思的结果,而使用 bash 时就完全按照预期。
2. 探究区别
(1)sh 是 bash 的软链接,如下:
fxw@fxw-Lenovo:~ $ which sh
/bin/sh
fxw@fxw-Lenovo:~ $ ls -l /bin/sh
lrwxrwxrwx 1 root root 4 7月 12 00:55 /bin/sh -> dash
这么看似乎二者并没有什么区别呀,其实不然。
(2)在一般的 Linux 系统中(例如 Ubuntu )中,使用 sh 调用执行 shell 脚本相当于打开了 bash 的 POSIX 标准模式,这种模式在一定程度上保证了脚本的跨系统性(跨 UNIX 系统),即 /bin/sh 相当于 /bin/bash --posix,所以二者的一个区别就是有没有开启 POSIX 标准模式。
1. Linux 中 bash 与 sh 的区别
在我们所使用的系统当中,使用sh调用执行脚本,相当于打开了bash的POSIX标准模式 (等效于bash的 --posix 参数)
一般的,sh是bash的“子集” (不是子集的部分,具体区别见下的“Things sh has that bash does not”)
3. linux shell 之 sh与bash区别
1. #!/bin/sh
与 #!/bin/bash
的区别 - ★★
在shell脚本的开头往往有一句话来定义:使用哪种sh解释器来解释脚本。
(1) #!/bin/sh
(2) #!/bin/bash
二者区别如下:
1、新建 test.sh
脚本内容如下:
#!/bin/sh
source pcy.sh #pcy.sh并不存在
echo hello
2、执行 ./test.sh
,屏幕输出为:
./test.sh: line 2: pcy.sh: No such file or directory
3、因此可以得知,在#!/bin/sh的情况下,source不成功,不会运行source后面的代码。
4、修改 test.sh
脚本的第一行如下:
#!/bin/bash
source pcy.sh #pcy.sh并不存在
echo hello
5、再次执行./test.sh,屏幕输出为:
./test.sh: line 2: pcy.sh: No such file or directory
hello
原因:
1、sh一般设成bash的软链
[work@zjm-testing-app46 cy]$ ll /bin/sh
lrwxrwxrwx 1 root root 4 Nov 13 2006 /bin/sh -> bash
2、在一般的 linux 系统当中(如redhat),使用sh调用执行脚本相当于打开了bash的POSIX标准模式
3、也就是说 /bin/sh
相当于 /bin/bash --posix
所以:
sh 跟 bash的区别,实际上就是bash有没有开启posix模式的区别
假如第一行写成 #!/bin/bash --posix,执行效果跟#!/bin/sh是一样的(遵循posix的特定规范,代码就不会再向下解释了,程序会停止在这里!)
2. ping ip
1. ping 一个文件里面的 ip (.sh 待测)
#! /bin/bash
for ip in `cat iplist`
do
ping=`ping -c 1 $ip|grep loss|awk '{print $8}'|awk -F "%" '{print $1}'`
if [ $ping -eq 100 ];then
echo $ip is down
else
echo $ip is up
fi
done
解释一下:
for ip in `cat iplist` #这个是逐个读取iplist文件里的IP 这个文件最好一个IP写一行
ping=`ping -c 1 $ip|grep loss|awk '{print $8}'|awk -F "%" '{print $1}'`
#对读出来的ip ping一次,看是否ping通。并取出loss的百分比的值 也就是掉包的值 ,看是否掉包
if [ $ping -eq 100 ];then
#看掉包的值是不是100,如果是100就是全部掉包,那就是没ping通,那就显示 ip is down,如果不等于100的话,就ping通了,就显示ip is up
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-LPJDpvPW-1608020507533)(C:\Users\Administrator\Desktop\Notes\pic\shell ping 20121001.png)]
2. ping 一网段里的主机显示哪些是通,哪些不通(.sh 待测)
#!/bin/bash
for ip in `seq 1 255`
do
ping=`ping -c 1 $ip|grep loss|awk '{print $8}'|awk -F "%" '{print $1}'`
if [ $ping -eq 100 ];then
echo 192.168.1.$ip is down
else
echo 192.168.1.$ip is up
fi
done
说明:
for ip in `seq 1 255` #是取1~225之间的整数(包含1和225)
简单点写就是:
#!/bin/bash
for ip in `seq 1 255`
do
ping -c 1 192.168.1.$ip > /dev/null 2>&1
if [ $? -eq 0 ]; then
echo 192.168.1.$ip is UP
else
echo 192.168.1.$ip is DOWN
fi
done
wait
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-zvUHF7n7-1608020507535)(C:\Users\Administrator\Desktop\Notes\pic\shell ping 20121002.png)]
3. 拓展:查看 cpu 信息(.sh)
预先经需要查看cpu信息的 ip 写到 iplist 文件里面
(注意这个文件的目录,本博文是将iplist和脚本放在同一个目录下,并到这个目录用./cpu@R_734_404[email protected]的方式运行及脚本)。
#!/bin/bash
echo "IP cpu @R_734_4045@ion cpu(s) Core(s) Socket(s)" >> listcpu
for ip in `cat iplist`
do
ping -c 1 $ip > /dev/null 2>&1
if [ $? -eq 0 ]; then
ssh $ip
A=`lscpu | grep '^cpu(s):' | awk -F ":" '{print$2}'`
B=`lscpu | grep 'Core(s) per socket:' | awk -F ":" '{print$2}'`
C=`lscpu | grep 'Socket(s):' | awk -F ":" '{print$2}'`
echo "$ip $A $B $C" >> listcpu
else
echo $ip is DOWN
fi
done
wait
分析:
for ip in `cat iplist` #这个是逐个读取iplist文件里的IP 这个文件最好一个IP写一行
IP cpu @R_734_4045@ion cpu(s) Core(s) Socket(s)
192.168.*.** 1 1 1
192.168.*.** 1 1 1
192.168.*.*** 1 1 1
192.168.*.*** 1 1 1
1. 优化版(动态入参)
#!/bin/bash
echo "IP cpu @R_734_4045@ion cpu(s) Core(s) Socket(s)" >> listcpu
for ip in `cat iplist`
do
ping -c 1 $ip > /dev/null 2>&1
if [ $? -eq 0 ]; then
ssh $ip
A=`lscpu | grep '^cpu(s):' | awk -F ":" '{print$2}'`
B=`lscpu | grep 'Core(s) per socket:' | awk -F ":" '{print$2}'`
C=`lscpu | grep 'Socket(s):' | awk -F ":" '{print$2}'`
echo "$ip $A $B $C" >> listcpu
else
echo $ip is DOWN
fi
done
wait
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。