【Shell 参数】

一、Shell参数概述

传递(脚本运行的后面直接加上)的参数本质上是为了让定义的变量更加灵活可用,可以把参数默认为不便在脚本中写死的”变量“要用外部参数传递进去,传递的内容不一样得到的结果也不一样,参数与变量相辅相成,参数让脚本更加灵活可用。

1.shell参数来源

  1. 脚本外部传入的一系列参数
  2. 在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

执行结果
在这里插入图片描述
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值