代码之家  ›  专栏  ›  技术社区  ›  GetFree

Linux bash:多变量分配

  •  92
  • GetFree  · 技术社区  · 14 年前

    在Linux bash中是否存在类似于以下PHP代码的代码:

    list($var1, $var2, $var3) = function_that_returns_a_three_element_array() ;
    

    也就是说,你在一句话中给3个不同的变量赋予相应的值。

    假设我有bash函数 myBashFuntion 将字符串“qwert asdfg zxcvb”写入stdout。 是否可以做如下的事情:

    (var1 var2 var3) = ( `myBashFuntion param1 param2` )
    

    当然,等号左边的部分不是有效的语法。我只是想解释一下我的要求。

    不过,有以下几点是有效的:

    array = ( `myBashFuntion param1 param2` )
    echo ${array[0]} ${array[1]} ${array[2]}
    

    但是索引数组并不像普通变量名那样具有描述性。
    不过,我可以这样做:

    var1 = ${array[0]} ; var2 = ${array[1]} ; var3 = ${array[2]}
    

    但我更愿意避免这三种说法。

    我只是在找一个快捷语法。有可能吗?

    5 回复  |  直到 6 年前
        1
  •  178
  •   Tom Hale    7 年前

    我想到的第一件事是:

    read -r a b c <<<$(echo 1 2 3) ; echo "$a|$b|$c"
    

    不出所料,产出

    1|2|3
    
        2
  •  14
  •   John Strood gdaras    6 年前

    我想给数组赋值。所以,延伸 Michael Krelin's approach 我做到了:

    read a[{1..3}] <<< $(echo 2 4 6); echo "${a[1]}|${a[2]}|${a[3]}"
    

    收益率:

    2|4|6 
    

    果不其然。

        3
  •  4
  •   SDGuero    14 年前

    我想这可能有帮助…

    为了分解脚本中用户输入的日期(mm/dd/yyyy),我将日期、月份和年份存储到一个数组中,然后将这些值放入单独的变量中,如下所示:

    DATE_ARRAY=(`echo $2 | sed -e 's/\// /g'`)
    MONTH=(`echo ${DATE_ARRAY[0]}`)
    DAY=(`echo ${DATE_ARRAY[1]}`)
    YEAR=(`echo ${DATE_ARRAY[2]}`)
    
        4
  •  3
  •   Otheus    11 年前

    有时候你必须做些很奇怪的事情。假设您希望从命令(例如sdguero提供的日期示例)中读取数据,但希望避免出现多个分叉。

    read month day year << DATE_COMMAND
     $(date "+%m %d %Y")
    DATE_COMMAND
    echo $month $day $year
    

    您也可以通过管道输入read命令,但随后必须使用子shell中的变量:

    day=n/a; month=n/a; year=n/a
    date "+%d %m %Y" | { read day month year ; echo $day $month $year; }
    echo $day $month $year
    

    结果在…

    13 08 2013
    n/a n/a n/a
    
        5
  •  0
  •   pavium    14 年前

    第5章 Bash Cookbook O'Reilly讨论了(在一定长度上)变量赋值中要求“=”符号周围没有空格的原因。

    MYVAR="something"
    

    解释与区分命令名和变量有关(其中“=”可能是有效参数)。

    这一切似乎有点像事后证明,但在任何情况下都没有提到分配给变量列表的方法。