如何在shell脚本中将部分变量提取到另一个变量中

时间:2012-03-28 04:31:39

标签: bash shell sh

我有一个看起来像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脚本很陌生,所以我可能错过了一些东西。

5 个答案:

答案 0 :(得分:13)

使用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

警告:仅在bash模式下运行sh时对此进行了测试。

答案 1 :(得分:4)

/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 :(得分:1)

PART1=`echo $VARIABLE | cut -d'-' -f1`

答案 3 :(得分:1)

这可能对您有用:

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

答案 4 :(得分:0)

 echo "abc-def-ghi"|cut -f1 -d'-'

more about cut