Bash 如何将shell脚本中的变量作为参数传递?

Bash 如何将shell脚本中的变量作为参数传递?,bash,shell,Bash,Shell,我有一个shell脚本,在这个脚本中,我多次传递相同的值作为参数。我不想在所有py脚本中硬编码这个冗余值,而是想看看是否可以使用变量并将它们作为参数传递到py脚本中 Here is the script.sh: python A.py --month=10 python B.py --country=USA --month=10 我想要这样的东西: #Setting variables to pass into args country=USA month=10 pytho

我有一个shell脚本,在这个脚本中,我多次传递相同的值作为参数。我不想在所有py脚本中硬编码这个冗余值,而是想看看是否可以使用变量并将它们作为参数传递到py脚本中

Here is the script.sh:

python A.py     --month=10
python B.py     --country=USA --month=10
我想要这样的东西:

#Setting variables to pass into args
country=USA
month=10

python A.py     --month=month
python B.py     --country=country --month=month

如何执行此操作?

要访问shell脚本中任何变量的值,可以使用$符号

下面是你如何做到这一点的:

#Setting variables to pass into args
country=USA
month=10

python A.py     --month="$month"
python B.py     --country="$country" --month="$month"

如果必须使用传递给脚本的参数,请尝试以下操作

script SomeMonth SomeCountry
然后用脚本

python A.py     --month="$1"
python B.py     --country="$2" --month="$1"
位置参数

$0=脚本名称

$1=SomeMonth第一个参数

$2=SomeCountry第二个参数


以此类推..

只是为了给其他正确答案添加一些内容。如果多次使用这些参数,还可以将参数名称与其值一起嵌入,并保存键入和错误:

# Setting variables to pass into args
p_country="--country=USA"
p_month="--month=10"

python A.py     $p_month
python B.py     $p_country $p_month
注意1:注意包含空格的值,或对shell有意义的任何其他奇怪字符。普通的单词或数字,如USA和10不会带来任何问题

注2:您还可以在单个变量中存储多个arg=值;它可以节省更多的打字时间。例如:

  p_m_and_c="--country=USA --month=10"
  ...
  python B.py     $p_m_and_c

请包括您拥有的代码try-country=$country-month=$month@Jaydeep,这个例子需要引用。否则,带空格的国家名称将严重失败。需要引号才能可靠地运行$国家,而不仅仅是美元国家。运行此答案中的代码,并按照其发出的警告中的链接进行操作。感谢您将此链接指向@CharlesDuffy。我打算在回答中包括这一点。但是,引号用于保留变量中的空白。在上面的示例中,我们没有任何空格。但无论如何,出于预防目的,最好将其包括在内。如果它始终与问题示例中给出的值相同,则根本没有理由使用变量。不管怎么说,堆栈溢出的意义在于教学,而教学一个在值出现意外注释时出现错误的实践显然是个坏主意。即使上面示例中的值保持不变,OP说他希望在脚本中的多个位置使用这些值。最好将它放在一个变量中,这样在需要对值进行任何更改的情况下,他就可以在一个地方进行更改。无论如何,我接受了这样一个事实,那就是在预防措施的引号中包含这个变量会很好。再次感谢。这不是一个好的做法;如果您的变量包含空格或其他shell元字符,它将以令人困惑的方式中断。您可以通过使用数组而不是传统的标量来解决这个问题,但这会破坏到传统Bourne/POSIX shell的可移植性。@tripleee我假设脚本中的参数设置为文本,就像OP发布的示例一样,我在注释1中警告了这一点。我会更新注释1。@tripleee你读过问题了吗?你知道OP为什么要使用变量吗?@LinuxFan说Restatemonica,答案不仅仅是为提出问题的人写的;它们是为每个人写的,每个人都在阅读这个问题,并试图从未来的答案中学习。如果某件事的教学方式存在限制,使重用变得危险,那么这些限制甚至在OP中也需要明确,因为他们在场景a中学习使用的实践可能会在场景B中尝试使用。@linuxfansaysrestemonica,……事实上,bash社区首先构建的一个重要原因是TLDP ABS展示了一些糟糕的实践示例,如果狭义地解释,这些示例不会显示出实际的错误,但会导致人们在尝试在其他场景中使用它们时编写错误代码;我们这些在freenode上的bash IRC频道的人已经受够了那些带着bug进来的人,他们在那些文档编写的狭窄范围之外引用了这些文档的示例;不仅如此,除非完全控制变量的内容,并且知道它不包含空格或其他shell元字符,否则不引用总是不安全的。