Shell脚本3 -- 脚本参数传递

声明:
本文的学习内容来源于B站up主“泷羽sec”视频【shell (3)脚本参数传递与数学运算】的公开分享,所有内容仅限于网络安全技术的交流学习,不涉及任何侵犯版权或其他侵权意图。如有任何侵权问题,请联系本人,我将立即删除相关内容。
本文旨在帮助网络安全爱好者提升自身安全技能,并严格遵守国家法律法规。任何人利用本文中的信息从事违法活动,均与本文作者和“泷羽sec”无关。请读者自觉遵纪守法,合理合法使用相关知识。


1 位置参数

1.1 基本位置参数

  • $0:脚本名称(包含脚本路径)。
  • $1$9:分别表示传递给脚本或函数的第1到第9个参数。
  • ${10}:表示第10个及以上的参数,必须用大括号括起来。
示例:

创建一个脚本 script.sh

#!/bin/bash
echo "Script name: $0"
echo "First parameter: $1"
echo "Second parameter: $2"
echo "Third parameter: $3"

执行:

./script.sh arg1 arg2 arg3

输出:

Script name: ./script.sh
First parameter: arg1
Second parameter: arg2
Third parameter: arg3

1.2 特殊变量

$#

  • 表示传递给脚本或函数的参数个数。

$*

  • 表示所有参数作为一个字符串,参数之间用第一个字符分隔(默认为空格)。 ```

$@

  • 表示所有参数,但保留每个参数的独立性(数组形式)。

"$*""$@"

  • "$*":所有参数合并为一个字符串,参数之间用空格分隔。
  • "$@":每个参数独立处理,通常用于遍历参数。

$*$@"$*""$@" 具体区别见文章[[Shell 中 星号和 星号和 星号和@的区别]]

$?

  • 上一个命令的退出状态码。0 表示成功,非 0 表示失败。

$$

  • 当前脚本的进程 ID。

$!

  • 最近一个后台进程的进程 ID。

$-

  • 当前 shell 的选项集。

2 参数传递方法

2.1 命令行参数

将参数直接传递给脚本。例如:

./script.sh param1 param2 param3

这些参数会通过 $1$2 等变量访问。

2.2 使用 getopts 解析选项

getopts 是解析命令行选项和参数的内置工具,支持短选项(如 -a)或带值选项(如 -f file)。

示例:

创建一个脚本 options.sh

#!/bin/bash

while getopts "a:b:c" opt; do
    case $opt in
        a) echo "Option -a with value: $OPTARG"; a=$OPTARG ;;
        b) echo "Option -b with value: $OPTARG"; b=$OPTARG ;;
        c) echo "Option -c without value" ;;
        *) echo "Invalid option" ;;
    esac
done
echo "Value of a: $a"
echo "Value of b: $b"

执行:

./options.sh -a value1 -b value2 -c

输出:

Option -a with value: value1
Option -b with value: value2
Option -c without value
Value of a: value1
Value of b: value2

2.3 环境变量传递

通过设置环境变量来传递参数。例如:

#!/bin/bash
echo "Environment variable TEST_VAR: $TEST_VAR"

运行脚本:

TEST_VAR="Hello, World!" ./script.sh

输出:

Environment variable TEST_VAR: Hello, World!

2.4 标准输入(stdin)

通过 read 命令从标准输入中读取数据。

示例:
#!/bin/bash
echo "Enter your name:"
read name
echo "Hello, $name!"

运行脚本:

./script.sh

输入:

John

输出:

Hello, John!

2.5 将输出作为参数传递

通过命令替换 $(...) 或反引号 ... 传递参数。

示例:
./script.sh $(date)

等同于如下,所以会有7个参数

./script.sh Mon Nov 18 03:45:39 AM EST 2024

脚本 script.sh

#!/bin/bash
echo "Current date and time: $1"
echo "Number of arguments: $#"
echo "All arguments (\$*): $*"

输出:

Current date and time: Mon
Number of arguments: 7
All arguments ($*): Mon Nov 18 03:48:03 AM EST 2024

3 综合示例

创建一个脚本 args_demo.sh

#!/bin/bash

echo "Script Name: $0"
echo "Number of arguments: $#"
echo "All arguments (\$*): $*"
echo "All arguments (\$@): $@"
echo "Each argument with loop (\$@):"
for arg in "$@"; do
    echo "$arg"
done

echo "Exit code of last command: $?"
echo "Process ID of script: $$"

执行:

./args_demo.sh arg1 "arg2 with spaces" arg3

输出:

Script Name: ./args_demo.sh
Number of arguments: 3
All arguments ($*): arg1 arg2 with spaces arg3
All arguments ($@): arg1 arg2 with spaces arg3
Each argument with loop ($@):
arg1
arg2 with spaces
arg3
Exit code of last command: 0
Process ID of script: 12345
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值