Shell / Bat 脚本 - 基础梳理【史上最强】

Shell / Bat 脚本 - 基础梳理


1. bat(Batch)


1. 概念解析 -(知识、异常处理)


1. 解决 Bat脚本 中包含中文,运行乱码

Shell / Bat 脚本 - 基础梳理【史上最强】_第1张图片

Shell / Bat 脚本 - 基础梳理【史上最强】_第2张图片


2. 批处理脚本传递参数

批处理参数的传递与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] =
…
请按任意键继续…

总结:

  • 如果不借助其他其他命令,批处理做多接收 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 的条件,

“=” 后面的内容便是对这个参数的描述,在用户需要输入值得时候提示用户。

测试:

我们新建一个.bat文件,输入内容:

set /p a=请输入a:
set /p b=请输入b:
echo %a%   %b%
pause>nul

Shell / Bat 脚本 - 基础梳理【史上最强】_第3张图片


2. ping ip

Shell / Bat 脚本 - 基础梳理【史上最强】_第4张图片


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

Shell / Bat 脚本 - 基础梳理【史上最强】_第5张图片


3. 通过端口号,直接杀对应IP,解除端口占用

初始版:

​ 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=

Shell / Bat 脚本 - 基础梳理【史上最强】_第6张图片


1. 优化版(动态入参)

优化版:

​ 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 / Bat 脚本 - 基础梳理【史上最强】_第7张图片


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

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

ping批量ip并显示结果


1. ping 一个文件里面的 ip (.sh 待测)

类型一:
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

Shell / Bat 脚本 - 基础梳理【史上最强】_第8张图片


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

Shell / Bat 脚本 - 基础梳理【史上最强】_第9张图片


3. 拓展:查看 CPU 信息(.sh)

预先经需要查看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的其他参数,添加变量即可。


1. 优化版(动态入参)
#!/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

史上最强,没有之一,手动狗头。

你可能感兴趣的:(综合篇,java,shell)