Bat脚本
中包含中文,运行乱码批处理参数的传递与main函数居然非常相似
批处理文件中可引用的参数为%0~%9,
%0 是指批处理文件的本身,也可以说是一个外部命令;
%1~%9 是批处理参数,也称形参
新建一个文件,文件命名为test_argv.bat,文件内容如下:
@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] =
…
请按任意键继续…
总结:
shift
命令可以对参数进行偏移,从而取到更多的参数@echo off
set /p var=请输入项目名:
echo 输入的项目名为:%var%, 如果正确按回车! //确认输入名
pause
sppbuild --create=%var%
%var% , 定义好变量,直接在变量前后各加一个% ,即可在脚本中进行使用。
xxx.bat
批处理 - 实现手动输入变量参数情景:
批处理实现过程中实现手动输入动态参数,比如我在批处理中定义了a,b两个参数,但是参数的值需要在执行.bat的过程中去赋值,那么,该怎么去实现
执行:
首先,我们定义这两个参数:
set /p a=请输入a:
set /p b=请输入b:
set
是对参数的定义,动态的话需要加上 /p
的条件,
“=”
后面的内容便是对这个参数的描述,在用户需要输入值得时候提示用户。
测试:
我们新建一个.bat文件,输入内容:
set /p a=请输入a:
set /p b=请输入b:
echo %a% %b%
pause>nul
情景:想知道自己局域网内或外网任意某一段在线的 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
xxx.txt文档
ping 192.168.1.100 -t >>c:\pingtext.txt
初始版:
1、优点:双击直接使用
2、缺点:需要编辑文件进行修改需要解除占用的端口
@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=
优化版:
1、需要解除占用的端口号,由原先修改 xxx.bat 脚本方式,优化为用户自定义手动输入
@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=
定义变量:set /p ip="请输入需要解除占用的端口号,格式如:
4003
>>> "使用变量:%ip%
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
Shell脚本获取系统运行信息 (信息包括:内存M,硬盘%,CPU%,负载情况,进程数,等)
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. 发现区别
同样的 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 标准模式。
在我们所使用的系统当中,使用sh调用执行脚本,相当于打开了bash的POSIX标准模式 (等效于bash的 --posix 参数)
一般的,sh是bash的“子集” (不是子集的部分,具体区别见下的“Things sh has that bash does not”)
#!/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的特定规范,代码就不会再向下解释了,程序会停止在这里!)
ping批量ip并显示结果
类型一:
ping一个文件里面的ip。如果可以ping通显示up,如果不能ping通显示down
#! /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
#!/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
预先经需要查看CPU信息的 ip 写到 iplist 文件里面
(注意这个文件的目录,本博文是将iplist和脚本放在同一个目录下,并到这个目录用./cpuinformation.sh的方式运行及脚本)。
#!/bin/bash
echo "IP CPU information 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写一行
结果输出到cpulist里面:
输出结果是:
IP CPU information 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
如果要看CPU的其他参数,添加变量即可。
#!/bin/bash
echo "IP CPU information 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
史上最强,没有之一,手动狗头。