【问题标题】:Multiple shell parameter assignments prefixing a bash command多个 shell 参数分配以 bash 命令为前缀
【发布时间】:2011-12-13 06:48:04
【问题描述】:

bash manual section 3.7.4 中声明

可以扩充任何简单命令或功能的环境 暂时通过在其前面加上参数分配,如所述 在Shell Parameters [section 3.4]

一个简单的例子是

MYVAR=MYVALUE mycommand

我已阅读第 3.4 节,但仍然不知道如何指定多个参数分配。请注意,3.7.4 中的陈述绝对是复数,暗示它是可能的。

以下似乎不起作用:

MYVAR1=abc MYVAR2=xyz mycommand

我正在使用 2009 年 12 月 23 日的 bash 版本 4.1。

【问题讨论】:

  • 在这里工作。你又搞砸了。

标签: bash command-line environment-variables


【解决方案1】:

它应该工作。这是可接受的语法。这是一个例子:

$ cat a
#!/bin/sh
echo $MYVAR1
echo $MYVAR2
$ ./a


$ MYVAR1=abc MYVAR2=xyz ./a
abc
xyz
$

更新:如果您在简单命令之前根据需要使用变量,则答案中给出的更新示例将起作用:

mycommand () { echo MYVAR1=[$MYVAR1]; echo MYVAR2=[$MYVAR2]; }
for f in ~/*.txt ; do MYVAR1=abc MYVAR2=xyz mycommand; done 

【讨论】:

    【解决方案2】:

    我从没见过这种方法。

    您总是可以只将常规参数传递给脚本。

    更新新示例:

    这在两种情况下都有效:

    > mycommand () { echo MYVAR1=[$1]; echo MYVAR2=[$2]; }
    
    > mycommand a b
    MYVAR1=[a]
    MYVAR2=[b]
    
    > for f in ~/file*.txt; do mycommand a b; done
    MYVAR1=[a]
    MYVAR2=[b]
    MYVAR1=[a]
    MYVAR2=[b]
    

    【讨论】:

    • 这是完全合法的,并在 POSIX 标准中定义(它甚至不是一个 bashism):'“简单命令”是一系列可选的变量分配和重定向,以任何顺序,可选地后跟单词和重定向,由控制操作员终止。 pubs.opengroup.org/onlinepubs/9699919799/utilities/…
    • 什么在技术上应该可行,什么是容易实现的,通常是两件不同的事情。为什么要为一些你可以通过摇两下羊尾巴以另一种方式发挥作用的东西而自责呢?
    • 嗯?传递参数和设置变量不是一回事。这是基本的外壳材料。没有什么难的。
    • 如果没有什么难点,你就没有机会回答有关它的问题。
    【解决方案3】:

    糟糕,我的示例过于简单了。这工作正常:

    mycommand () { echo MYVAR1=[$MYVAR1]; echo MYVAR2=[$MYVAR2]; }
    MYVAR1=abc MYVAR2=xyz mycommand
    

    但事实并非如此:

    mycommand () { echo MYVAR1=[$MYVAR1]; echo MYVAR2=[$MYVAR2]; }
    MYVAR1=abc MYVAR2=xyz for f in ~/*.txt; do mycommand; done
    

    关键区别在于这句话:

    对于任何简单的命令或函数

    根据section 3.2for 命令是复杂命令,而不是“简单命令或函数”。

    【讨论】:

    • 但确实如此:for f in ~/*.txt ; do MYVAR1=abc MYVAR2=xyz mycommand; done
    猜你喜欢
    • 2011-10-16
    • 2022-07-26
    • 2011-01-02
    • 2020-11-08
    • 1970-01-01
    • 2018-03-04
    相关资源
    最近更新 更多