声明:
本文的学习内容来源于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