在获取 bash 脚本时将变量传递给它

在获取 bash 脚本时将变量传递给它

假设我在 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,因为源脚本的参数将被忽略,并且将引用参数dashmain.sh$1main.sh.

当您在 中获取脚本时sh,就好像您只是将源脚本的文本复制并粘贴到源脚本的文件中一样。请考虑以下事项(请注意,我已做出迈克尔建议的更正):

$ bash ./test.sh
A String
$ sh ./test.sh

$ sh ./test.sh "HELLO WORLD"
HELLO WORLD

答案2

我看到三个错误:

  1. 您的分配行是错误的:

    $NAME="a string"
    

    当您分配给变量时,您不包括$;它应该是:

    NAME="a string"
    
  2. 你失踪了then;条件行应该是:

    if [ -f $HOME/install.sh ]; then
    
  3. 你没有引用$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$

相关内容