【问题标题】:How to extract part of variable into another variable in shell script如何在shell脚本中将部分变量提取到另一个变量中
【发布时间】:2012-03-28 04:31:39
【问题描述】:

我有一个看起来像 xx-xx-xx-xx 的变量,其中每个 xx 是一个数字(每个 xx 的长度未知)

我需要将这些数字提取到单独的变量中,以便能够操纵它们。 我试图查看正则表达式,但看不到任何解决方案(或者我只是盲目地没有注意到。

理想的解决方案应该是这样的

#!/bin/sh
# assume VARIABLE equals 1234-123-456-890
VARIABLE=$1

# HERE SOME CODE assigning variables $PART1 $PART2 $PART3 $PART4

echo $PART1-$PART2-$PART3-$PART4
# Output will give us back 1234-123-456-890

我对 shell 脚本很陌生,所以我可能错过了一些东西。

【问题讨论】:

    标签: bash shell sh


    【解决方案1】:

    /bin/shdash(参见“参数扩展”部分)

    #!/bin/sh
    # assume VARIABLE equals 1234-123-456-890
    
    VARIABLE="$1"
    
    PART4="$VARIABLE"       # PART4 is 1234-123-456-890
    
    PART1="${PART4%%-*}"    # PART1 is 1234
    PART4="${PART4#*-}"     # PART4 is 123-456-890
    
    PART2="${PART4%%-*}"    # PART2 is 123
    PART4="${PART4#*-}"     # PART4 is 456-890
    
    PART3="${PART4%%-*}"    # PART3 is 456
                            # PART4 is 456-890
    
    PART4="${PART4#*-}"     # PART4 is 890
    
    echo "$PART1-$PART2-$PART3-$PART4"
    

    测试$PART1-$PART2-$PART3-$PART4

    $ ./test.sh 1234-123-456-890
    1234-123-456-890
    
    $ ./test.sh 1234-abc-789-ABCD
    1234-abc-789-ABCD
    

    【讨论】:

      【解决方案2】:

      使用bash,您可以使用这样的数组:

      #!/bin/bash
      VARIABLE=1234-123-456-890
      
      PART=(${VARIABLE//-/ })
      
      echo ${PART[0]}-${PART[1]}-${PART[2]}-${PART[3]}
      

      ${VARIABLE//-/ } 扩展将所有 - 更改为空格,然后在单词边界上将其拆分为一个数组。

      或者,您可以使用read

      #!/bin/bash
      VARIABLE=1234-123-456-890
      
      read PART1 PART2 PART3 PART4 <<< "${VARIABLE//-/ }"
      echo $PART1-$PART2-$PART3-$PART4
      

      要使其在sh 中工作,您可以稍微更改它并设置IFS,输入字段分隔符:

      #!/bin/sh
      VARIABLE=1234-123-456-890
      
      old_ifs="$IFS"
      IFS=-
      read PART1 PART2 PART3 PART4 <<EOF
      $VARIABLE
      EOF
      
      IFS="$old_ifs"
      echo $PART1-$PART2-$PART3-$PART4
      

      警告:这仅在 bashsh 模式下运行时进行了测试。

      【讨论】:

      • 感谢@FatalError,这就是我想要的。我想我会选择read
      • 如果您使用IFS=- read a b c d &lt;&lt;&lt; "$VARIABLE",则不需要使用“old_ifs”临时变量,因为“IFS”只会在读取命令期间被修改。
      • @glennjackman 整洁!不知道那个,但它在我的把戏里。谢谢。
      【解决方案3】:
      PART1=`echo $VARIABLE | cut -d'-' -f1`
      

      【讨论】:

        【解决方案4】:

        这可能对你有用:

        a="1234-123-456-890"
        OIFS=$IFS; IFS=-; b=($a); echo "${b[*]}"; echo "${b[@]}"; IFS=$OIFS; echo "${b[*]}"
        1234-123-456-890
        1234 123 456 890
        1234 123 456 890
        echo "${b[0]}"
        1234
        echo "${b[1]}"
        123
        echo "${b[2]}"
        456
        echo "${b[3]}"
        890
        

        【讨论】:

          【解决方案5】:
           echo "abc-def-ghi"|cut -f1 -d'-'
          

          more about cut

          【讨论】:

            猜你喜欢
            • 2016-07-09
            • 2015-10-20
            • 1970-01-01
            • 2018-11-30
            • 2017-11-07
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多