采购变量时将变量传递给bash脚本


18

假设我在main.sh中:

$NAME="a string"
if [ -f $HOME/install.sh ]
    . $HOME/install.sh $NAME
fi

并在install.sh中:

echo $1

这应该是回声"a string",但它没有回声。为什么?


2
请不要更新问题。这样,我们看不到您最初的问题出了什么问题。我只是回滚了。
Valentin Bajrami 2014年

Answers:


20

Michael Mrozek涵盖了大多数问题,并且由于您正在使用Bash,因此他的修复程序将起作用。

您可能对以下事实感兴趣:带有参数的脚本源是一种批评。在sh或中,dashmain.sh不会回显任何内容,因为源脚本的参数将被忽略,$1并将引用到main.sh.

当您在中使用脚本sh作为源脚本时,就好像您只是将源脚本的文本复制并粘贴到源脚本一样。考虑以下内容(请注意,我已对Michael提出的建议进行了更正):

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

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

“在sh或dash中,您的main.sh将不会回显任何内容,因为将忽略源脚本的参数,而$ 1将引用main.sh的参数。”这就是正在发生的事情。谢谢回答。
有人仍在使用您MS-DOS 2010年

我将您的回答标记为已接受,因为真正的问题不是我的脚本中有错误,而主要是因为我将sh等同于bash,在这种情况下bash在模拟sh方面做得很差。您的回答使我对这个问题很感激,谢谢。
有人仍在使用您MS-DOS 2010年

2
从技术上讲,这里更像是一种kshism(可能早于ksh86)。@ SomebodystillusesyouMS-DOS,“ sh”规范没有说明如果传递额外的参数会发生什么,因此破折号或bash行为与其他“ sh”行为不再相同,并且同样有效。
斯特凡Chazelas

16

我看到三个错误:

  1. 您的分配行有误:

    $NAME="a string"

    当您分配一个变量时,您不包含$; 它应该是:

    NAME="a string"
  2. 你不见了then; 条件行应为:

    if [ -f $HOME/install.sh ]; then
  3. 您没有引用$NAME,即使它有空格。源代码行应为:

    . $HOME/install.sh "$NAME"

他还存在其他一些错误,但我认为这不一定是他提出的问题的根源。
史蒂文D

@史蒂文你是对的,还有我没提到的几件事。现在列出的修复程序对我很有效
Michael Mrozek

@Steven当我把脚本放在一起尝试时,我将其缩写为[ -f $HOME/install.sh ] && . $HOME/install.sh $NAME:寻找错误时,我可能不应该做这样的事情
Michael Mrozek

好像是我以为实际上没有问题的另一个问题,因为他特别提到了BASH。
史蒂文D

5

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

main.sh

#!/bin/bash
NAME=${*:-"a string"}
if [[ -f install.sh ]];
then
    set -- $NAME ;
    . install.sh ;
fi
exit;

install.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$

您如何设置标志?
乔纳森·兰德鲁姆

编辑:您显然只是将它们串起来,--就像它们是命令参数一样:set -- -v foo -l bar -j "${bin}"
Jonathan Landrum
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.