![在获取 bash 脚本时将变量传递给它](https://linux22.com/image/42401/%E5%9C%A8%E8%8E%B7%E5%8F%96%20bash%20%E8%84%9A%E6%9C%AC%E6%97%B6%E5%B0%86%E5%8F%98%E9%87%8F%E4%BC%A0%E9%80%92%E7%BB%99%E5%AE%83.png)
假设我在 main.sh 中有:
$NAME="a string"
if [ -f $HOME/install.sh ]
. $HOME/install.sh $NAME
fi
并在 install.sh 中:
echo $1
这应该是 echo "a string"
,但它什么也没有回显。为什么?
答案1
迈克尔·莫罗泽克涵盖了大部分问题,并且他的修复将会起作用,因为您正在使用 Bash。
您可能会对以下事实感兴趣:使用参数获取脚本的能力是一种羞辱。或者您将不会回显任何内容sh
,因为源脚本的参数将被忽略,并且将引用参数dash
main.sh
$1
main.sh.
当您在 中获取脚本时sh
,就好像您只是将源脚本的文本复制并粘贴到源脚本的文件中一样。请考虑以下事项(请注意,我已做出迈克尔建议的更正):
$ bash ./test.sh
A String
$ sh ./test.sh
$ sh ./test.sh "HELLO WORLD"
HELLO WORLD
答案2
我看到三个错误:
您的分配行是错误的:
$NAME="a string"
当您分配给变量时,您不包括
$
;它应该是:NAME="a string"
你失踪了
then
;条件行应该是:if [ -f $HOME/install.sh ]; then
你没有引用
$NAME
,即使它有空格。源行应该是:. $HOME/install.sh "$NAME"
答案3
只需在获取脚本之前设置参数即可!
主目录
#!/bin/bash
NAME=${*:-"a string"}
if [[ -f install.sh ]];
then
set -- $NAME ;
. install.sh ;
fi
exit;
安装.sh
#!/bin/bash
echo " i am sourced by [ ${0##*/} ]";
echo " with [ $@ ] as parametr(s) ";
exit;
测试
u@h$ ./main.sh some args
i am sourced by [ main.sh ]
with [ some args ] as parametr(s)
u@h$