shell脚本中source文件引用和传参详解

在 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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值