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

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。在shdashmain.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)

  • 从技术上讲,这里更像是一种 kshism(在 ksh86 中已经存在,可能更早)。@SomebodystillusesyouMS-DOS,“sh”规范没有说明如果您传递额外的参数会发生什么,因此破折号或 bash 行为不再是“sh”,并且同样有效。 (2认同)

Mic*_*zek 17

我看到三个错误:

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

    $NAME="a string"
    
    Run Code Online (Sandbox Code Playgroud)

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

    NAME="a string"
    
    Run Code Online (Sandbox Code Playgroud)
  2. 你不见了then;条件行应该是:

    if [ -f $HOME/install.sh ]; then
    
    Run Code Online (Sandbox Code Playgroud)
  3. 您没有引用$NAME,即使它有空格。源代码行应该是:

    . $HOME/install.sh "$NAME"
    
    Run Code Online (Sandbox Code Playgroud)


Yun*_*nus 7

只需在采购脚本之前设置您的参数!

主文件

#!/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)