shell脚本内调用另外一个shell脚本的几种方法

文章介绍了如何在shell脚本中调用另一个shell脚本的四种方法,包括使用source、/bin/bash、sh和.。这些方法在Linux和Windows(通过GitBash)环境下均适用。示例脚本展示了参数传递和处理,以及如何检查参数个数和使用特殊变量。文章还提到了通过添加脚本路径到$PATH环境变量来直接调用脚本。

      有时会在一个shell脚本(如test_call_other_shell.sh)中调用另外一个shell脚本(如parameter_usage.sh),这里总结几种可行的方法,这些方法在linux上和windows上(通过Git Bash)均适用
      1.通过source: 运行在相同的进程,在test_call_other_shell.sh中调用parameter_usage.sh后,parameter_usage.sh中的变量和函数在test_call_other_shell.sh中可直接使用
      2.通过/bin/bash: 运行在不同的进程
      3.通过sh: 运行在不同的进程
      4.通过.: 运行在相同的进程,在test_call_other_shell.sh中调用parameter_usage.sh后,parameter_usage.sh中的变量和函数在test_call_other_shell.sh中可直接使用

      parameter_usage.sh内容如下:

#! /bin/bash

# 参数的使用

# 我们可以在执行Shell脚本时,向脚本传递参数,脚本内获取参数的格式为:$n. n代表一个数字,1为执行脚本的第一个参数,2为执行脚本的第二个参数,以此类推

if [ $# != 3 ]; then
    echo "usage: $0 param1 param2 param3"
    echo "e.g: $0 1 2 3"
    exit 1
fi

echo "执行文件名: $0"
echo "param1: $1"; echo "param2: $2"; echo "param3: $3"

parameters=$*

# 特殊字符用来处理参数
# $#: 传递到脚本的参数个数
echo "参数个数为: $#"
# $*: 以一个单字符串显示所有向脚本传递的参数
echo "传递的参数作为一个字符串显示: $*"
# $@: 与$*相同,但是使用时加引号,并在引号中返回每个参数
echo "传递的参数作为字符串显示: $@"

for i in "$*"; do # 循环一次
    echo "loop"; echo $i
done

echo ""
for i in "$@"; do # 循环三次
    echo "loop"; echo $i
done

get_csdn_addr()
{
    echo "csdn addr: https://blog.csdn.net/fengbingchun/"
}

      test_call_other_shell.sh内容如下:

#! /bin/bash

params=(source /bin/bash sh .)

usage()
{
	echo "Error: $0 needs to have an input parameter"

	echo "supported input parameters:"
	for param in ${params[@]}; do
		echo "  $0 ${param}"
	done

	exit -1
}

if [ $# != 1 ]; then
	usage
fi

flag=0
for param in ${params[@]}; do
	if [ $1 == ${param} ]; then
		flag=1
		break
	fi
done

if [ ${flag} == 0 ]; then
	echo "Error: parameter \"$1\" is not supported"
	usage
	exit -1
fi

echo "==== test $1 ===="

$1 parameter_usage.sh 1 2 3
echo "parameters: ${parameters}"
get_csdn_addr

$1 parameter_usage 123
#ret=$?
#if [[ ${ret} != 0 ]]; then
#	echo "##### Error: some of the above commands have gone wrong, please check: ${ret}"
#	exit ${ret}
#fi
if [ $? -ne 0 ]; then
    echo "##### Error: some of the above commands have gone wrong, please check"
	exit -1
fi

echo "test finish"

      在linux上的执行结果如下:

      在windows上执行结果如下:

      在linux下也可以将另外一个shell脚本所在的路径添加到$PATH环境变量,然后你就可以把它作为普通命令调用。

      GitHub: https://github.com/fengbingchun/Linux_Code_Test

<think> 首先,用户的问题是:“我想查找在一个shell脚本调用一个shell脚本参数的方法 请问shell脚本调用一个shell脚本的参数的方法”。所以,核心是关于如何在shell脚本调用一个shell脚本时处理参数。 现在,我需要参考提供的引用: - 引用[1] 讨论了如何在脚本中获取参数,使用 $n 来获取参数,并展示了 $#, $*, $@ 的用法。 - 引用[2] 比较了三种调用方式:exec、source 和 fork (默认),并展示了每种方式如何影响环境变量和进程ID。 - 引用[3] 和 [4] 提到了三种调用方法:source、点号(.)和 sh 命令。 用户的问题是关于如何调用一个脚本的参数。参数传递通常是通过命令行参数实现的。 从引用中,关键点是: - 当调用一个脚本时,参数可以通过在命令行中传递来处理。例如,在 main.sh 中调用 called.sh,可以通过 ./called.sh arg1 arg2 arg3 来传递参数。 - 在引用[2] 中,main.sh 调用 called.sh 时,是通过 ./called.sh 来调用的,这暗示了参数可以在调用时传入。 - 在引用[1] 中,parameter_usage.sh 展示了如何获取参数:$1, $2, $3 等。 所以,方法总结如下: 1. **fork方式(默认)**:使用 ./other_script.sh arg1 arg2 arg3 或 sh other_script.sh arg1 arg2 arg3。这会在子进程中运行脚本,参数通过命令行传递。 2. **source方式**:使用 source other_script.sh arg1 arg2 arg3 或 . other_script.sh arg1 arg2 arg3。这会直接在当前shell会话中运行脚本,共享变量和环境,参数通过命令行传递。 3. **exec方式**:使用 exec other_script.sh arg1 arg2 arg3。这会替换当前进程为新的脚本进程,参数传递方式相同。 在所有情况下,参数都可以在调用时通过命令行传递给脚本。被调用脚本可以使用 $1, $2, $@, $* 等来访问这些参数。 在引用[1] 中,脚本展示了如何获取参数:echo "param1: $1"; echo "param2: $2"; 等等。 在引用[2] 中,main.sh 调用 called.sh 时,使用了 ./called.sh,但并没有显式传递参数,因为代码是 ./called.sh,没有参数。但在实际应用中,可以添加参数。例如,在 case 中,可以是 ./called.sh "$arg1" "$arg2" 等。 所以,回答的核心是:在调用一个脚本时,直接在命令行中传递参数,被调用脚本会自动获取这些参数。 此外,如果需要共享参数或变量,source 方式可能更合适,因为它共享环境。 现在,构建回答: - 回答结构清晰:逐步解释。 - 使用中文。 - 添加引用标识:[^1], [^2], 等。 - 生成相关问题。 先梳理关键点: - 方法1: fork方式 - 在脚本中使用 ./other_script.sh param1 param2 param3 - 方法2: source方式 - 使用 source other_script.sh param1 param2 param3 或 . other_script.sh param1 param2 param3 - 方法3: exec方式 - 使用 exec other_script.sh param1 param2 param3 所有方式都允许传递参数,并通过 $1, $2, $@ 等在被调用脚本中访问。 在引用[2] 中,展示了调用方式的不同点: - fork: 创建子进程,当前脚本继续执行。 - source: 在当前shell中执行,共享变量。 - exec: 替换当前进程,后续代码不执行。 但参数传递机制相同。 被调用脚本的参数处理如引用[1] 所示。 回答内容: 1. 介绍三种调用方式。 2. 解释如何在调用时传递参数。 3. 说明在被调用脚本中如何获取参数。 最后,生成相关问题。 引用使用: - 在解释时,自然地添加引用。例如,提到参数获取时引用[1],提到调用方式时引用[2]。 系统指令要求:行内数学表达式用$...$,但这里是shell脚本,没有数学表达式。独立公式用$$...$$,同样不需要。确保LaTeX语法正确,但可能不适用。使用中文回答。 生成相关问题:例如,关于参数传递细节、共享变量等。 回答结构: - 引言:总结方法。 - 详细解释三种调用方式。 - 参数传递示例。 - 总结。 - 相关问题。 </think> ### Shell脚本调用一个Shell脚本的参数方法Shell脚本调用一个脚本并传递参数,主要有三种常用方式:fork(默认方式)、source(或点号),以及exec。所有方法都允许通过在命令行中指定参数来传递值,被调用脚本可以通过位置参数(如 `$1`, `$2`, `$*`, `$@`)来访问这些参数。以下是基于参考引用的详细解释和示例。 #### 1. **fork方式(默认方式)** - **描述**: 通过创建子进程来运行一个脚本(例如 `./another_script.sh`)。父脚本继续执行后续代码,子脚本独立运行,不共享变量环境。参数直接在调用命令中传递。 - **参数传递方法**: 在调用命令后添加参数,被调用脚本使用 `$1`, `$2` 等获取。 - **示例**: - 假设 `main.sh` 调用 `called.sh`,并传递三个参数: ```shell # main.sh #!/bin/bash echo "父脚本PID: $$" # 调用called.sh,并传递参数 ./called.sh arg1 arg2 arg3 echo "父脚本继续执行" ``` - `called.sh` 获取参数: ```shell # called.sh #!/bin/bash echo "参数1: $1" # arg1 echo "参数2: $2" # arg2 echo "参数3: $3" # arg3 echo "所有参数: $*" # arg1 arg2 arg3 ``` - **关键点**: 使用 `./called.sh arg1 arg2 arg3` 调用时,参数通过命令行传递。被调用脚本的位置参数 `$1`, `$2` 对应传入的值[^2]。 - **适用场景**: 需要独立运行子脚本且不影响父脚本环境时使用。 #### 2. **source方式(或点号方式)** - **描述**: 使用 `source another_script.sh` 或 `. another_script.sh` 直接在当前Shell会话中执行脚本。共享所有变量和环境,参数通过命令行传递。 - **参数传递方法**: 调用时添加参数,被调用脚本同样使用 `$1`, `$2` 访问。 - **示例**: - `main.sh` 使用source调用 `called.sh`: ```shell # main.sh #!/bin/bash export VAR="parent_value" echo "当前PID: $$" # 使用source传递参数 source ./called.sh param1 param2 echo "共享变量: $VAR" # 可能被called.sh修改 ``` - `called.sh` 获取参数并修改共享变量: ```shell # called.sh #!/bin/bash echo "参数1: $1" # param1 echo "参数2: $2" # param2 VAR="modified_value" # 修改共享变量 ``` - **关键点**: 参数传递语法为 `source ./called.sh param1 param2`。被调用脚本的位置参数 `$1`, `$2` 对应传入参数,且变量共享,适用于需要环境一致的场景[^2][^3]。 - **适用场景**: 需要共享变量或修改父脚本环境时使用。 #### 3. **exec方式** - **描述**: 使用 `exec another_script.sh` 替换当前进程为新脚本。当前脚本终止执行,新脚本接管进程ID(PID)。参数通过命令行传递。 - **参数传递方法**: 调用时添加参数,被调用脚本用位置参数获取。 - **示例**: - `main.sh` 使用exec调用 `called.sh`: ```shell # main.sh #!/bin/bash echo "父脚本PID: $$" # 使用exec传递参数 exec ./called.sh arg1 arg2 echo "此行不会执行" # exec后代码终止 ``` - `called.sh` 获取参数: ```shell # called.sh #!/bin/bash echo "新脚本PID: $$" # 与main.sh相同 echo "参数1: $1" # arg1 echo "参数2: $2" # arg2 ``` - **关键点**: 参数传递语法为 `exec ./called.sh arg1 arg2`。被调用脚本的 `$1`, `$2` 对应参数,但父脚本后续代码不执行[^2]。 - **适用场景**: 需要替换当前进程或节省资源时使用(例如,在脚本结束时启动一个程序)。 #### 总结 - **参数访问通用规则**: 无论哪种调用方式,被调用脚本都使用 `$1`(第一个参数)、`$2`(第二个参数)、`$*`(所有参数字符串)或 `$@`(参数数组)获取参数[^1]。 - **最佳实践**: - 使用fork方式时,参数传递安全且独立。 - 使用source方式时,注意变量冲突风险(因为环境共享)。 - 参数传递应确保数量匹配,避免错误(例如,引用[1] 中的参数检查:`if [ $# != 3 ]; then exit 1; fi`)。 - **变量共享差异**: fork不共享变量,source共享变量,exec不共享且终止父进程[^2][^3]。 #### 相关问题 1. 如何在被调用脚本中处理可变数量的参数? 2. Shell脚本中source和fork方式调用对全局变量的影响有何不同? 3. 使用exec调用脚本时,如何确保父脚本的状态被正确清理? [^1]: 参数获取方式如 `$1`, `$2`, `$*`, `$@` 在脚本中的使用示例。 [^2]: fork、source和exec三种调用方式的区别及其对参数传递和环境的影响。 [^3]: source方式调用脚本共享变量的实现方法。 [^4]: 脚本调用基础概念和示例。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值