Невъзможен bash: синтактична грешка: невалиден аритметичен оператор (токенът за грешка е )

Знам, че тук имаше много подобни въпроси, но този е доста специален, моля, прочетете нататък.

Имам bash скрипт, който не прави нищо друго, освен да сравнява две числа, основно така:

[[ 1408039118 -lt 1401215749 ]]

Сега изпълнението на този скрипт извежда следната грешка:

/usr/bin/pacaur: line 179: 1408039118: syntax error: invalid arithmetic operator (error token is "")

Разбирам, че нещо не е наред, това е моят ред 179:

[[ "${depsAlastmodified[$i]}" -lt 1401215749 ]] && note "f" $"no AUR metadata for ${colorR}${depsAname[$i]}${reset} package"

Изпълнението на това през bash -x показва:

+ [[ 1408039118 -lt 1401215749 ]]
/usr/bin/pacaur: line 179: 1406628774: syntax error: invalid arithmetic operator (error token is "")

Наистина няма нищо видимо лошо в това. Опитах допълнително отстраняване на грешки с помощта на od -c на тази променлива:

echo ${depsAlastmodified[$i]} | od -c

Резултатът е:

+ echo '1408039118'
+ od -c
0000000   1   4   0   8   0   3   9   1   1   8 033   [   m 033   [   K
0000020  \n
0000021

Но сега не съм сигурен как да прочета това. Разбирам, че знакът за нов ред принадлежи на командата echo. Но какво точно е 033 [ m 033 [ K? И това принадлежи ли към моя проблем?

Опитах също да пусна този номер през bc:

echo ${depsAlastmodified[$i]} | bc | od -c

Това е резултатът:

+ echo '1408039118'
+ bc
+ od -c
(standard_in) 1: illegal character: ^[
(standard_in) 1: syntax error
(standard_in) 1: illegal character: ^[
(standard_in) 1: illegal character: K
0000000

Нещо не е наред с тази променлива. Какво друго можех да опитам? Как да поправя това?

Само за справка, това е пълната история на проблемите.


person Afr    schedule 17.08.2014    source източник
comment
Той не адресира проблема ви директно, но в bash можете (трябва?) да използвате (( depsAlastmodified[i] < 1401215749 )) за вашето сравнение.   -  person Tom Fenech    schedule 17.08.2014
comment
Това ми казва обратното stackoverflow.com/a/17526818/1260906   -  person Afr    schedule 17.08.2014
comment
Завършващите знаци изглеждат като ANSI escape кодове за нулиране на цвета и съответно изтриване на част от реда. Как се задава вашият масив?   -  person chepner    schedule 17.08.2014


Отговори (2)


Изглежда, че имате завършващи знаци във вашия масив.

Опитайте това с tr -cd '[[:digit:]]', което ще изтрие всички нецифрени данни от входа:

echo "${depsAlastmodified[$i]}" | tr -cd '[[:digit:]]' | od -c

Трябва да даде:

0000000   1   4   0   8   0   3   9   1   1   8
0000012
person anubhava    schedule 17.08.2014

Има нещо общо с grep добавяне на цвят escape неща в края на реда,

Наистина не е лесна задача да проследите това и да го поправите. За справка, ако някой друг срещне този проблем: Имах GREP_OPTIONS="--color=always" в моя ~\.bashrc файл, за да коригирате това, трябва да направите следното:

  • Деинсталирайте pacaur, премахнете цялата директория /tmp/pacaurtmp-*/.
  • Поставете GREP_OPTIONS="--color=never" (или auto) във вашето ~/.bashrc и source ~/.bashrc него.
  • Преинсталирайте pacaur и надстройте цялата система pacaur -Syu
person Afr    schedule 11.11.2014