我有以下问题:(关于日期) 用户将设置以下变量。
变量1 = 33_2016
现在我想以某种方式想要自动设置第二个变量来设置" 33" +1 我得到了
变量= 34_2016
感谢您的任何建议。
答案 0 :(得分:1)
我的第一选择是用read
分开第一个变量,然后将(更新的)部分重新组合在一起。
IFS=_ read f1 f2 <<< "$variable1"
# Option 1
variable2=$((f1 + 1))_$f2
# Option 2
printf -v variable2 '%s_%s" "$((f1 + 1))" "$f2"
您还可以使用参数扩展来进行解析:
f1=${variable%_*}
f2=${variable#*_}
您还可以使用正则表达式,这种表达式在解析时更具可读性,但更长时间才能将这些部分重新组合在一起(BASH_REMATCH
可以使用更短的同义词)。
[[ $variable1 =~ (.*)_(.*) ]] &&
f1=$((${BASH_REMATCH[1]}+1)) f2=${BASH_REMATCH[2]}
第一个和第三个选项也允许使用数组:
# With read -a
IFS=_ read -a f <<< "$variable1"
variable2=$(IFS=_; echo "${f[*]}")
# With regular expression
[[ $variable1 =~ (.*)_(.*) ]]
variable2=$(IFS=_; echo "${BASH_REMATCH[*]:1:2}")
答案 1 :(得分:0)
您可以使用awk
:
awk 'BEGIN{FS=OFS="_"}{$1+=1}1' <<< "${variable1}"
虽然这需要一个外部进程来生成(稍微慢一些),但它更容易读/写。在这里确定对你来说更重要的事情。
要将返回值存储在变量中,请使用命令替换:
variable2=$(awk 'BEGIN{FS=OFS="_"}{$1+=1}1' <<< "${variable1}")
答案 2 :(得分:0)
使用子串替换进行参数扩展可以做同样的事情,例如
$ v1=33_2016
$ v2=${v1/${v1%_*}/$((${v1%_*}+1))}
$ echo $v2
34_2016
它六一个,六个到另一个
。