如何在Bash中的分隔符上拆分字符串基础?
我将字符串存储在变量中,如下所示:
DATA="111111-777777-Hello"
现在我想在-
分隔符上拆分上面的字符串,并将两个数字存储在两个不同的变量中。
NUMBER1="111111"
NUMBER2="777777"
如果NUMBER1和NUMBER2是一个空字符串而不是一个数字,那么退出该脚本并使用非零状态代码。
答案 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;
}
答案 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保留。