一、Shell参数概述
传递(脚本运行的后面直接加上)的参数本质上是为了让定义的变量更加灵活可用,可以把参数默认为不便在脚本中写死的”变量“要用外部参数传递进去,传递的内容不一样得到的结果也不一样,参数与变量相辅相成,参数让脚本更加灵活可用。
1.shell参数来源
- 脚本外部传入的一系列参数
- 在shell脚本中给函数传递的参数
实际上两种参数都可以视为变量;
2.为什么要用参数
不需要再脚本中写死一些变量,根据输入完成特定的功能,比如说这次是计算10+10的求和,下一次想算100+100,每次都修改变量时不可能的,可以利用传参的方式给变量赋值,拿到我们想要的结果。
二、 Shell参数分类
1.位置参数
可以在shell脚本内部获取到传入的位置参数,位置参数用$n表示,比如说$1,$2就表示从外部传到脚本里的参数1,参数2。如果对传入的参数位置有疑问,可以直接看下面这个表;
变量命名规范中就一条就是不允许使用数字开头,就是避免与获取参数位置发生冲突;
[root@hcss-ecs-72ce paipai]# cat ok.sh
#!/bin/bash
#参数
echo "第一个参数为:$1"
echo "第二个参数为:$2"
echo "脚本名称为:$0"
[root@hcss-ecs-72ce paipai]# bash ./ok.sh paipai
第一个参数为:paipai
第二个参数为:tuitui
脚本名称为:./ok.sh
[root@hcss-ecs-72ce paipai]#
看出来,在运行脚本的时候,我给脚本传进去了2个参数,第一个是paipai 第二个是tuitui
2.特殊参数
| 变量 | 含义 |
|---|---|
| $# | 传递给脚本或者是函数的参数个数总和 |
| $* | 传递给脚本或函数的所有参数,当被双引号""包含时,所有的位置参数被看做一个字符串 |
| $@ | 传递给脚本或函数的所有参数,当被""包含时,每个位置参数被看做独立的字符串 |
| $? | 上个命令的退出状态,或函数的返回值,0为执行成功,非0为执行失败 |
| $$ | 当前shell进程ID。对于shell脚本,就是这些脚本所在的进程ID |
| 注意 | $@ 与 $* 不用双引号两个都一样,都是列表,用了双引号 $* 是所有字符串拼接, $@ 是列表 |
#!/bin/bash
#参数
echo "第一个参数为:$1"
echo "第二个参数为:$2"
echo "脚本名称为:$0"
echo "==========分割线"
curl -I baidu.com
echo "运行命令的状态为:$?"
echo "============分割线"
echo "当前脚本的ID为:$$"
echo "=========分割线"
echo "\$*的结果为:$*"
echo "============分割线"
echo "\$@的结果为:$@"
for i in "$*";
do
echo $i
done
echo "======分割线"
for j in "$@";
do
echo $j
done
📢 在Linux脚本中,curl -I baidu.com 命令的意思是啥????
🙋🏻♀️ 实际上是说使用curl工具向baidu.com发送一个HTTP HEAD请求。这里的 -I 参数(大写的字母i)告诉curl只获取HTTP响应头信息,而不是整个网页内容。这常用于检查网页的状态(比如HTTP状态码)、服务器类型、响应头等内容,而不需要下载实际的网页数据。简而言之,这条命令的作用是检查baidu.com的服务器响应头信息。
执行结果(学习的过程不太能理解,根据执行结果来一一对应下)

⚠️注意
- 运行 curl -I baidu.com 的输出为0,表示命令正常,获取到了正常的返回值
- $@与 $* 看上去很像,都是传递给脚本或函数的所有参数;
- $* 当被双引号 " " 包含时,所有的位置参数被看做一个字符串,我们用 for 循环遍历的时候可以看到输出为一行;
- $@当被双引号 " " 包含时,每个位置参数被看做独立的字符串,我们用 for 循环遍历的时候可以看到为每个字符串输出为单独的一行。
三、shell参数的使用
1.脚本传递
脚本传递参数就是在运行脚本的时候通过位置参数(跟在运行脚本命令后)传递进脚本内,每个参数利用一个空格来分割;就是上面位置参数举过例子;
[root@hcss-ecs-72ce paipai]# cat ok.sh
#!/bin/bash
#参数
echo "第一个参数为:$1"
echo "第二个参数为:$2"
echo "脚本名称为:$0"
[root@hcss-ecs-72ce paipai]# bash ./ok.sh paipai tuitui
第一个参数为:paipai
第二个参数为:tuitui
脚本名称为:./ok.sh
[root@hcss-ecs-72ce paipai]#
2.函数传递
与脚本传递类似,在调用函数的时候直接在函数的外部进行参数的传递
#!/bin/bash
#函数定义
function show_args(){
echo "第一个参数为:$1"
echo "第二个参数为:$2"
echo "脚本名称为:$0"
}
#函数调用
show_args hello paipai
执行结果
[root@hcss-ecs-72ce paipai]# bash test.sh
第一个参数为:hello
第二个参数为:paipai
脚本名称为:test.sh
四、实际操作
1、需求
做一个内网批量扫描批量可用ip脚本,判断某一网段中网络的可达性。
2、操作思路
利用ping命令,检测可以ping通的ip
可以利用 ping 命令来检测可以 ping 通的 IP,将返回正常的内容记录在 success.log 中,失败的内容记录在 fail.log 中。
传递两个参数,第一个参数为网络前缀,例如 192.168.0.,然后在脚本内部循环 1-255 来检测。192.168.1.86
第二个参数为 ping 包的个数,如果包太多,时间花费太长,太短有可能造成误判,在此我们建议使用 2 个包来判断。
4.3 实现
#!/bin/bash
#Description:net check scripts
# Auth:Achao
# Email:Achao@163.com
# function: net check
# data:2024-8-7
# version: V1.0
# 日志目录
LOG_DIR="/tmp/netlog"
# 如果日志目录不存在则直接创建
[ ! -d ${LOG_DIR}] && mkdir -p ${LOG_DIR}
# 定义成功与失败日志文件
SUCCESS_LOGFILE="success.log"
FAIL_LOGFILE="fail.log"
# 网络前缀
NET_PREFIX=$1
# 检测包数量
PACKAGE_NUM=$2
# for循环
for num in ‘seq 1 255’;
do
# 开始进行ping检测
echo "check ${NET_PREFIX}${num}..."
ping -c ${PACKAGE_NUM} ${NET_PREFIX}${num} &>/dev/null
#如果返回正常则记录可以ping通的ip到successlog中
[ $? -eq 0] && echo ${NET_PREFIX}&{num} >> ${LOG_DIR}${SUCCESS_LOGFILE} || echo ${NET_PREFIX}&{num} >> ${LOG_DIR}${FAIL_LOGFILE}
done
执行结果


2345

被折叠的 条评论
为什么被折叠?



