【问题标题】:Multiple variable assignments separated by space in single line in BashBash中单行中用空格分隔的多个变量赋值
【发布时间】:2021-01-23 12:42:54
【问题描述】:

对于 bash 中的变量赋值,我通常会这样做:

a=1
b=2
c=3

如果它在一行中完成,它将是这样的:

a=1; b=2; c=3

最近我看到了一些类似的代码:

a=1 b=2 c=3

分配由空格分隔,它正在工作。我试图用谷歌搜索这种方法,但无法快速找到教科书的答案。现在我只知道,它有效。

那么,是所有的 shell 都支持这种语法,还是一种标准方法?

【问题讨论】:

  • by all shell "all shell" - 究竟是什么There are many of them
  • 或“by other shell (e.g. csh, ksh..)”会是更好的术语。
  • POSIX 明确支持这一点。一个简单的命令之前可以有一个或多个赋值,而“赋值语句”实际上只是一个没有实际命令的简单命令。请参阅shell grammar rules,尤其是规则 7。

标签: bash variable-assignment


【解决方案1】:

是的,它有效。一个可能的警告是SC2155,因为您应该单独声明和分配。

话虽如此,除了在参数之间使用多个声明选项外,它将起作用。另请注意,声明参数将应用于所有变量(在本例中为 -i)。

脚本0:

#!/bin/bash

declare a b c
a=foo
b=bar
c=baz

foo () {
    local a=1 b=2 c=3

    echo "From within func:"
    declare -p a
    declare -p b
    declare -p c
}

foo

echo "From outside func:"
declare -p a
declare -p b
declare -p c
Output:

$ ./script.sh
From within func:
declare -- a="1"
declare -- b="2"
declare -- c="3"
From outside func:
declare -- a="foo"
declare -- b="bar"
declare -- c="baz"

脚本1:

#!/usr/bin/env bash

declare -i a -a b c
a=foo
b=(bar)
c=baz

foo () {
    local -i a=1 -a b=(2) c=3

    echo "From within func:"
    declare -p a
    declare -p b
    declare -p c
}

foo

echo "From outside func:"
declare -p a
declare -p b
declare -p c
Output:

$ ./script.sh
./script.sh: line 3: declare: `-a': not a valid identifier
./script.sh: line 9: local: `-a': not a valid identifier
From within func:
declare -i a="1"
declare -ai b=([0]="2")
declare -i c="3"
From outside func:
declare -i a="0"
declare -ai b=([0]="0")
declare -i c="0"

【讨论】:

    【解决方案2】:

    POSIX 将simple command 定义为

    “简单命令”是一系列可选的变量赋值和重定向,以任意顺序,可选地后跟单词和重定向,由控制运算符终止。

    请注意,赋值“语句”属于此定义:它只是一个或多个变量赋值,后面没有用于指定实际命令的可选词。

    稍后在同一部分中,给出了这种无命令赋值的语义:

    变量赋值应按如下方式进行:

    • 如果没有命令名结果,变量赋值将影响当前执行环境。

    【讨论】:

      【解决方案3】:

      这是一种标准方法吗?

      是的。

      来自posix shell language 2.9.1 Simple Commands强调我的:

      “简单命令”是一系列可选变量赋值和重定向,以任意顺序,可选地后跟单词和重定向,由控制操作符终止。

      [...]

      如果没有命令名结果,变量赋值将影响当前执行环境。 [...]

      shell grammar也可以看到:

      simple_command   : cmd_prefix cmd_word cmd_suffix
                       | cmd_prefix cmd_word
                       | cmd_prefix
                       | cmd_name cmd_suffix
                       | cmd_name
      
      cmd_prefix       :            io_redirect
                       | cmd_prefix io_redirect
                       |            ASSIGNMENT_WORD
                       | cmd_prefix ASSIGNMENT_WORD
      

      您可以在命令之前放置任意数量的分配(和重定向)。如果没有命令,分配将影响当前的shell。

      【讨论】:

        猜你喜欢
        • 2010-12-29
        • 1970-01-01
        • 1970-01-01
        • 2021-01-22
        • 1970-01-01
        • 2012-04-13
        相关资源
        最近更新 更多