在bash中的 - 分隔符上拆分一个字符串?

时间:2016-10-04 22:31:08

标签: linux bash shell split

如何在Bash中的分隔符上拆分字符串基础?

我将字符串存储在变量中,如下所示:

DATA="111111-777777-Hello"

现在我想在-分隔符上拆分上面的字符串,并将两个数字存储在两个不同的变量中。

NUMBER1="111111"
NUMBER2="777777"

如果NUMBER1和NUMBER2是一个空字符串而不是一个数字,那么退出该脚本并使用非零状态代码。

3 个答案:

答案 0 :(得分:3)

IFS=- read -r number1 number2 _ <<<"$DATA"
[[ $number1 && $number2 ]] || { echo "Initial columns not read" >&2; exit 1; }
[[ $number1$number2 = *[![:digit:]]* ]] && { echo "Values are not numeric" >&2; exit 1; }

echo "Number 1 is $number1"
echo "Number 2 is $number2"

IFS设置为与read命令位于同一行的分隔符(没有;之间没有分隔符)将其范围限定为单read个操作,因此它不会修改shell在脚本中其他地方的行为。

请注意_作为read的额外参数 - 该行的其余部分存储在那里,以防止将其附加到number2

答案 1 :(得分:0)

如果要将其拆分为数组,请使用此

split() {
    #  split string separator
    #  split a string into an array
    #  the array returned will be newArray
    #  on error return status is 1
    #  usage:- split bash?ksh?zsh?dash ? >>> returns an array of 3 elements bash[0] ksh[1] zsh[2] dash[3]
   local string="${1}" separator="${2}"
   declare cutOneCharacter;
   declare tempvar
   # appending $sepeartor to the ending of $string
   # bacon?tuna?hamburger ? >>>>> if not appeneded the result will be>>>>>> bacon tuna //o_O where is hamburger ?
   # if appeneded the result will be >>>> bacon tuna harmburger 
   string="$string$separator"
   [[ ${newArray[@]} ]] && unset newArray
   splitUsage() {
     echo  "Usage: split string separator" >&2
   }

  (( "${#@}" != "2" )) && splitUsage && return 1;
  while [ -n "${string}" ];do
    cutOneCharacter=$( printf "%c" "$string" )
    if [[ "${cutOneCharacter}" == "${separator}" ]];then
        newArray+=( "${tempvar}" )
        unset tempvar;
    else
        tempvar+="${cutOneCharacter}"
    fi
    string=${string#*?}
  done
  echo"${newArray[@]}"
  return 0;
}

more details are here

答案 2 :(得分:0)

使用bash,操纵IFS

data="111111-777777-Hello"
mapfile -t data < <(IFS=-; printf "%s\n" $data)  # variable is not quoted
echo "${data[0]}"    # 111111
echo "${data[1]}"    # 777777

不要使用ALLCAPS变量名 - 保留为shell保留。