【问题标题】:How to append lots of variables to one variable with a simple command如何使用一个简单的命令将大量变量附加到一个变量
【发布时间】:2018-09-28 02:01:58
【问题描述】:

我想把所有变量都粘贴到一个变量中

A=('blah')
AA=('blah2')
AAA=('blah3')
AAB=('blah4')
AAC=('blah5')
#^^lets pretend theres 100 more of these ^^
#Variable composition
#after AAA, is AAB then AAC then AAD etc etc, does that 100 times

我希望它们都放入这个 MASTER 变量中

#MASTER=${A}${AA}${AAA} (<-- insert AAB, AAC and 100 more variables here)

我显然不想在这个表达式中输入 100 个变量,因为可能有更简单的方法可以做到这一点。另外,我会做更多这样的事情,因此我需要自动化。

我对 sed、awk 比较陌生,有没有办法将这 100 个变量附加到主变量中?

出于这个特定目的,我不想要一个数组。

【问题讨论】:

  • 你需要的是一个数组。你听说过吗?
  • 这些变量的名称模式是什么?你能告诉我们更多关于这 100 个来自哪里的信息吗?
  • 添加了一些编辑以进一步澄清我的错误。
  • 除非你所有的名字都相似,否则你别无选择,只能全部输入。您可以尝试for x in ${!A*}; do MASTER+="${!x}"; done,但它假定A* 与您要连接的变量名称集完全匹配。您还可以使用多种模式:例如for x in ${!A*} ${!B*}; do
  • 顺便说一句,A=('blah') 定义了一个包含一个元素的数组。你真的想要那里的括号吗?

标签: bash variables awk sed sh


【解决方案1】:

您可以使用 simple 单线,非常简单,但更昂贵:

master=$(set | grep -E '^(A|AA|A[A-D][A-D])=' | sort | cut -f2- -d= | tr -d '\n')
  • setvar=name 格式列出所有变量
  • grep 过滤掉我们需要的变量
  • sort 将它们按正确的顺序排列(可能是可选的,因为 set 给出了排序的输出)
  • cut 提取值,删除变量名
  • tr 删除换行符

让我们测试一下。

A=1
AA=2
AAA=3
AAB=4
AAC=5
AAD=6
AAAA=99 # just to make sure we don't pick this one up
master=$(set | grep -E '^(A|AA|A[A-D][A-D])=' | sort | cut -f2- -d= | tr -d '\n')
echo "$master"

输出:

123456

【讨论】:

    【解决方案2】:

    根据我的最佳猜测,怎么样:

    #!/bin/bash
    
    A=('blah')
    AA=('blah2')
    AAA=('blah3')
    AAB=('blah4')
    AAC=('blah5')
    # to be continued ..
    
    for varname in A AA A{A..D}{A..Z}; do
        value=${!varname}
        if [ -n "$value" ]; then
            MASTER+=$value
        fi
    done
    
    echo $MASTER
    

    产生:

    blahblah2blah3blah4blah5...
    

    虽然我不确定这是否是 OP 想要的。

    【讨论】:

      【解决方案3】:
      echo {a..z}{a..z}{a..z} | tr ' ' '\n' | head -n 100 | tail -n 3
      adt
      adu
      adv
      

      告诉我们,从 AAA 到 ADV 会达到 100,或者 ADY 会达到 103。

      echo A{A..D}{A..Z} | sed 's/ /}${/g'
      AAA}${AAB}${AAC}${AAD}${AAE}${AAF}${AAG}${AAH}${AAI}${AAJ}${AAK}${AAL}${AAM}${AAN}${AAO}${AAP}${AAQ}${AAR}${AAS}${AAT}${AAU}${AAV}${AAW}${AAX}${AAY}${AAZ}${ABA}${ABB}${ABC}${ABD}${ABE}${ABF}${ABG}${ABH}${ABI}${ABJ}${ABK}${ABL}${ABM}${ABN}${ABO}${ABP}${ABQ}${ABR}${ABS}${ABT}${ABU}${ABV}${ABW}${ABX}${ABY}${ABZ}${ACA}${ACB}${ACC}${ACD}${ACE}${ACF}${ACG}${ACH}${ACI}${ACJ}${ACK}${ACL}${ACM}${ACN}${ACO}${ACP}${ACQ}${ACR}${ACS}${ACT}${ACU}${ACV}${ACW}${ACX}${ACY}${ACZ}${ADA}${ADB}${ADC}${ADD}${ADE}${ADF}${ADG}${ADH}${ADI}${ADJ}${ADK}${ADL}${ADM}${ADN}${ADO}${ADP}${ADQ}${ADR}${ADS}${ADT}${ADU}${ADV}${ADW}${ADX}${ADY}${ADZ
      

      最终的化妆品很容易手工制作。

      【讨论】:

      • 我认为 OP 想要变量的 ,而不仅仅是它们的名称。
      • @chepner:我不这么认为。
      • #MASTER=${A}${AA}${AAA},而不是MASTER=AAAAAA
      • @chepner:对不起,我不明白你的意思,我不认为你明白我的意思。我的印象是,他不想输入 100 个变量,而是想生成它们。我可能错了,但我什至不生产 AAAAAA。
      【解决方案4】:

      单行使用for loop:

      for n in A AA A{A..D}{A..Z}; do str+="${!n}"; done; echo ${str}
      

      输出

      blahblah2blah3blah4blah5
      

      【讨论】:

        【解决方案5】:

        假设您有输入文件inputfile.txt,其中有任意变量名称和值:

        name="Joe"
        last="Doe"
        A="blah"
        AA="blah2
        

        然后做:

        master=$(eval echo $(grep -o "^[^=]\+" inputfile.txt | sed 's/^/\$/;:a;N;$!ba;s/\n/$/g'))
        

        这会将inputfile.txt 中所有变量的值连接到master 变量中。所以你将拥有:

        >echo $master
        JoeDoeblahblah2
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2011-01-24
          • 2019-11-23
          • 2021-02-15
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2018-11-30
          相关资源
          最近更新 更多