在 Shell 脚本中,使用 source
命令引用文件时,也可以传递参数。尽管 source
通常用于引入脚本中的变量和函数,它同样可以像执行其他脚本那样接收参数,并在被引用的脚本中处理这些参数。
1. 基本用法
当我们使用 source
或 .
来引用一个文件时,可以传递参数,传递的参数会在被引用的脚本中通过 $1
, $2
, $3
等变量获取。也就是说,source
的参数传递和执行脚本时的参数传递方式是一样的。
source 文件名.sh arg1 arg2 arg3
# 或者
. 文件名.sh arg1 arg2 arg3
在 文件名.sh
脚本中,可以通过 $1
, $2
, $3
来访问这些参数:
#!/bin/bash
echo "第一个参数:$1"
echo "第二个参数:$2"
echo "第三个参数:$3"
2. 参数传递示例
假设有一个文件 script.sh
,内容如下:
#!/bin/bash
# script.sh
echo "脚本名称:$0"
echo "第一个参数:$1"
echo "第二个参数:$2"
echo "所有参数:$@"
然后,你可以通过 source
来引用并传递参数:
#!/bin/bash
# main.sh
echo "运行主脚本"
source script.sh "参数1" "参数2"
运行 main.sh
:
$ ./main.sh
运行主脚本
脚本名称:script.sh
第一个参数:参数1
第二个参数:参数2
所有参数:参数1 参数2
3. 参数范围
被 source
的文件所接收到的参数仅限于该文件执行时提供的参数,与调用该文件的脚本中的参数是分离的。例如:
#!/bin/bash
# parent.sh
echo "父脚本第一个参数:$1"
source child.sh "子参数1" "子参数2"
假设 child.sh
如下:
#!/bin/bash
echo "子脚本第一个参数:$1"
echo "子脚本第二个参数:$2"
执行 parent.sh
时传递参数:
$ ./parent.sh 父参数1
父脚本第一个参数:父参数1
子脚本第一个参数:子参数1
子脚本第二个参数:子参数2
解释:parent.sh
的参数与 child.sh
的参数互不干扰,传递给 source child.sh
的参数仅限于子脚本。
4. source
和 $@
/$*
在被 source
的脚本中,$@
和 $*
会包含引用该文件时传递的所有参数:
$@
:以独立的字符串方式传递所有参数。$*
:将所有参数作为一个整体字符串。
#!/bin/bash
# script.sh
echo "所有参数 \$@:$@"
echo "所有参数 \$*:$*"
调用:
$ source script.sh "参数1" "参数2" "参数3"
所有参数 $@:参数1 参数2 参数3
所有参数 $*:参数1 参数2 参数3
5. 结合函数和 source
传参
你还可以在被引用的脚本中定义函数,函数也可以使用传递的参数:
#!/bin/bash
# functions.sh
greet() {
echo "Hello, $1!"
}
greet_all() {
for name in "$@"; do
echo "Hello, $name!"
done
}
在另一个脚本中引用并传递参数:
#!/bin/bash
# main.sh
source functions.sh
greet "Alice"
greet_all "Alice" "Bob" "Charlie"
执行 main.sh
:
$ ./main.sh
Hello, Alice!
Hello, Alice!
Hello, Bob!
Hello, Charlie!
6. 参数默认值与处理技巧
在使用 source
时,可以为参数提供默认值,避免未传递参数时脚本报错:
#!/bin/bash
# script.sh
param1=${1:-"默认值1"}
param2=${2:-"默认值2"}
echo "第一个参数:$param1"
echo "第二个参数:$param2"
调用:
$ source script.sh "指定值1"
第一个参数:指定值1
第二个参数:默认值2