2016-04-21 3 views
0

Поэтому у меня есть следующий код:Bash: почему эта переменная не отражается?

IFS=' '; 
      dateArr=(${date[i]}); 
      monthStr=${dateArr[0]}; 
      day=${dateArr[1]}; 
      year=${dateArr[2]}; 
      case "$monthStr" in 
        "Jan") month="01";; 
        "Feb") month="02";; 
        "Mar") month="03";; 
        "Apr") month="04";; 
        "May") month="05";; 
        "Jun") month="06";; 
        "Jul") month="07";; 
        "Aug") month="08";; 
        "Sep") month="09";; 
        "Oct") month="10";; 
        "Nov") month="11";; 
        "Dec") month="12";; 
      esac; 

      if [ ${#day} -eq 1 ] 
      then 
        day=0$day; 
      fi 

      dateTemp="$year-$month-$day"; 
      echo $dateTemp; 

Когда я запускаю его, я получаю выход по следующему:

-11-28 
-10-27 
-01-11 
-01-07 
-01-07 

Таким образом, вы можете видеть это правильно Добавляя $ месяца и $ переменного дня , но значение $ year не добавляется к переменной $ dateTemp. Это тоже странно, потому что переменная $ year не пуста, так как если я повторю это, это даст мне правильный год. Образец кода находится в формате «1 января 2016 года», хотя я пытаюсь преобразовать его в YYYY-MM-DD.

Если бы кто-нибудь мог помочь мне в этом, я был бы признателен.

Cheers!

+2

Каков выходной сигнал 'echo '$ year? \ Hexdump -C'? Почему вы касаетесь '$ IFS'? – Mat

+3

Кажется, что $ year содержит '$ '\ r'' в конце. – choroba

+0

http://i.imgur.com/G1D3yKx.png Я имею в виду, что переменная $ year, кажется, правильно обновляется ... – Noob

ответ

1

Ваше значение year заканчивается возвратом каретки (0d видно на вашем снимке экрана). Большинство терминалов «отображает» возврат каретки, перемещая курсор в начало текущей строки, так что последующие символы перезаписывают ранее написанные символы. Быстрое исправление удалить возврат каретки с

year=${year%.} 

лучше исправить это, чтобы удалить возврат каретки из входных данных, используемых для заполнения dateArr.

+1

Хм я пробовал, и это, похоже, не сработало. Это не лучшее решение, но поскольку я знаю, что значение года всегда 4 цифры, я могу просто использовать year = $ {dateArr [2]: 0: 4}; – Noob

+0

Вы сделали это после того, как вы установили 'year' в свой код? Вы также можете сделать это в одной строке с 'year = $ {dateArr [2]%.}'. – chepner

+1

Да, я сделал. Я также попробовал sed, который не работал, пока я не добавил параметр -e. Это похоже на лучший вариант, так как я могу просто использовать sed весь документ, а не индивидуально кодировать для каждой переменной. Привет, хотя человек :) – Noob

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