2016-08-16 3 views
0

У меня проблема: (о датах) Пользователь установит следующую переменную.Измените номер внутри переменной

variable1 = 33_2016

теперь я почему-то хочу, чтобы автоматически установить вторую переменную, которая устанавливает "33" +1 что я получаю

variable2 = 34_2016

Спасибо за любой совет.

+0

Приходит ли точка, в которой добавление 1 не должно давать следующий последовательный номер? Вы сказали, что это даты, поэтому, если 33_2016 - это 33-й день 2016 года, тогда +1 - 34_2016, но если вы начали с 366_2016, тогда должен +1 дать 1_2017? –

ответ

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}") 
0

Вы можете использовать awk:

awk 'BEGIN{FS=OFS="_"}{$1+=1}1' <<< "${variable1}" 

Хотя это требуется внешний процесс на нерест (немного медленнее), это легче читать/писать. Решите для себя, что более важно для вас здесь.

Для хранения возвращаемого значения переменной, используйте команду подстановки:

variable2=$(awk 'BEGIN{FS=OFS="_"}{$1+=1}1' <<< "${variable1}") 
0

Вы можете сделать несколько то же самое с расширением параметра с подстроки замещения, например,

$ v1=33_2016 
$ v2=${v1/${v1%_*}/$((${v1%_*}+1))} 
$ echo $v2 
34_2016 

Это шесть к одному, полдюжины к другому.

Смежные вопросы