Som*_*DOS 24 bash source function
假设我在 main.sh 中有:
$NAME="a string"
if [ -f $HOME/install.sh ]
. $HOME/install.sh $NAME
fi
Run Code Online (Sandbox Code Playgroud)
在 install.sh 中:
echo $1
Run Code Online (Sandbox Code Playgroud)
这应该是 echo "a string",但它什么都不回响。为什么?
Ste*_*n D 23
Michael Mrozek涵盖了大部分问题,他的修复将在您使用 Bash 后起作用。
您可能对这样一个事实感兴趣,即使用参数获取脚本的能力是一种 bashism。在sh或dash您main.sh将不会回显任何内容,因为源脚本的参数被忽略,$1并将引用到main.sh.
当您在 中获取脚本时sh,就好像您只是将源脚本的文本复制并粘贴到源文件中一样。考虑以下内容(注意,我已经做出了迈克尔推荐的更正):
$ bash ./test.sh
A String
$ sh ./test.sh
$ sh ./test.sh "HELLO WORLD"
HELLO WORLD
Run Code Online (Sandbox Code Playgroud)
Mic*_*zek 17
我看到三个错误:
您的分配行是错误的:
$NAME="a string"
Run Code Online (Sandbox Code Playgroud)
当您分配给变量时,您不包括$; 它应该是:
NAME="a string"
Run Code Online (Sandbox Code Playgroud)你不见了then;条件行应该是:
if [ -f $HOME/install.sh ]; then
Run Code Online (Sandbox Code Playgroud)您没有引用$NAME,即使它有空格。源代码行应该是:
. $HOME/install.sh "$NAME"
Run Code Online (Sandbox Code Playgroud)只需在采购脚本之前设置您的参数!
#!/bin/bash
NAME=${*:-"a string"}
if [[ -f install.sh ]];
then
set -- $NAME ;
. install.sh ;
fi
exit;
Run Code Online (Sandbox Code Playgroud)
#!/bin/bash
echo " i am sourced by [ ${0##*/} ]";
echo " with [ $@ ] as parametr(s) ";
exit;
Run Code Online (Sandbox Code Playgroud)
u@h$ ./main.sh some args
i am sourced by [ main.sh ]
with [ some args ] as parametr(s)
u@h$
Run Code Online (Sandbox Code Playgroud)