在我的shell脚本中获取另一个脚本时,我注意到了一些奇怪的行为。我在shell脚本中设置环境的脚本采用可选参数,例如
source setup.sh version1
但是在我的shell脚本中,我还有命令行参数变量。例如:
./myscript.sh TEST 1
内部myscript.sh
:
#!/bin/zsh
source setup.sh
echo ROOT version setup $ROOT_SYS
...more of the script
我在上面的脚本中注意到的问题是$1
命令中使用了TEST
参数(本例中为source setup.sh
)。这会导致命令变为
source setup.sh TEST
当然失败,因为setup.sh
没有版本TEST
。
我通过将脚本编辑到下面解决了这个问题。
#!/bin/zsh
source setup.sh version1
echo ROOT version setup $ROOT_SYS
...more of the script
source
命令现在不会获取$1
参数。
为什么/当我运行shell脚本时,source命令如何获取$ 1参数?
答案 0 :(得分:3)
从历史上看,unix shell不允许将任何参数传递给使用.
内置调用的脚本(source
是bash,ksh中可用的.
的别名。 zsh中)。 .
内置的意思是“就像这个文件实际包含在这里一样”。
在bash,ksh和zsh中,如果将额外的参数传递给.
内置函数,它们将成为源代码脚本中的位置参数($1
等)。如果传递零参数,则主脚本的位置参数仍然有效。在这些shell中,.
的行为与调用函数非常相似,但并不完全如此(特别是在bash中,如果修改子脚本中的位置参数,则主脚本可以看到修改)。 / p>
避免这种困难的一种简单方法是只在下标中定义函数(也许是变量)。将它视为一个代码库,这样只需获取它就没有效果,然后从子脚本中调用函数来实际执行某些操作。
答案 1 :(得分:2)
这是因为源执行setup.sh
的代码就好像它已就位一样,所以当setup.sh
访问时,比如$1
,它的值就是第一个参数的值实际的脚本。如果你想避免它,你可以执行它:
setup.sh
或者,如果您需要从中获取一些变量或值,请将其更改为以输出形式返回结果,如:
ROOT_SYS=`setup.sh`
最后,正如您所知,source
关键字还允许为脚本提供参数,但如果您不提供任何参数,它会绕过当前参数。