Intereting Posts
Почему вырезать не разрезание в правой колонке? Перенаправление в файл не работает должным образом Ограничить текстовый файл до 100 МБ Неовим цветовая гамма в Urxvt неправильно рендерится передача составленных команд в качестве аргументов Загрузка с раздела жесткого диска. Update-grub? Где находится файл журнала для fsck на Kali v2.0? Easy-RSA index.txt, серийный номер и дубликаты Ошибка ssh-keygen -y: ошибка загрузки Как выполнить аутентификацию в «открытой» сети беспроводного провайдера без использования браузера? Что произойдет, если я переведу жесткие диски, используемые Rsync на другой компьютер, и синхронизирую их с ним? Строка, сравниваемая с подстановочными знаками Получить переменные среды для запуска сеанса Сетевое обслуживание должно быть перезапущено после отключения кабеля с сетью zeroconf Резервные устройства для файлов, открытые без O_EXCL

Сравните два числа, считанные из файла

У меня есть скрипт, который читает файл со стандартным форматом, где 9-е слово – это число. Я пытаюсь сравнить число, которое читается из файла. Я умею правильно читать строку, и она работает точно так, как я хочу. Но я получаю сообщение об ошибке:

./age.sh: line 8: [: age: integer expression expected 

Вот мой сценарий:

 #!/bin/bash if [ -f $1 ] ; then while read -r LINE || [[ -n $LINE ]]; do name=$( echo $LINE | cut -d " " -f1 -f2) ago=$( echo $LINE | cut -d " " -f9) echo "$name ----- $age" if [ $ago -gt 30 ] ; then echo "You get a discount" fi done < $1 else echo "No file found" fi 

Вот пример входного файла

 #FirstName LastName SuperheroName Powers Weapons City Enemy isOutOfEarth Age Bruce Wayne Batman Martial_arts No_Guns Gowtham Joker No 31 Clark Kent Superman Extreme_strength None Metropolitan Lex_Luther Yes 32 Oliver Queen Green_arrow Accuracy Bow_and_Arrow Star_city Cupid No 30 

Конкретная ошибка, которую вы получаете, заключается в том, что ваш скрипт также обрабатывает заголовок вашего файла. Легким решением было бы пропустить строки, начинающиеся с символа # :

 #!/bin/bash if [ ! -f "$1" ]; then echo "No file found" exit 1 fi ## Use grep -v to print lines that don't match the pattern given. grep -v '^#' "$1" | while read -r LINE || [ -n "$LINE" ]; do name=$( echo "$LINE" | cut -d " " -f1,2) age=$( echo "$LINE" | cut -d " " -f9) echo "$name ----- $age" if [ "$age" -gt 30 ]; then echo "You got a discount" fi done 

Однако, поскольку, предположительно, вы также захотите делать что-то с другими столбцами, я бы сразу прочитал их все в переменных:

 #!/bin/bash if [ ! -f "$1" ]; then echo "No file found" exit 1 fi ## read can take multiple values and splits the input line on whitespace ## automatically. Each field is assigned to one of the variables given. ## If there are more fields than variable names, the remaining fields ## are all assigned to the last variable. grep -v '^#' "$1" | while read -r first last super powers weapons city enemy isout age; do echo "$first $last ----- $age" if [ "$age" -gt 30 ]; then echo "You got a discount" fi done 
 #!/bin/bash if [ ! -f "$1" ]; then echo "No file found" exit 1 fi exec < $1 while read -r LINE || [ -n "$LINE" ]; do name=$( echo "$LINE" | cut -d " " -f1,2) age=$( echo "$LINE" | cut -d " " -f9) echo "$name ----- $age" if [ "$age" -gt 30 ]; then echo "You got a discount" fi done 

Так вот что я сделал:

 #!/bin/bash if [ -f $1 ] ; then sum=0 echo "#FirstName LastName City Age" while read -r LINE || [[ -n $LINE ]]; do name=$( echo $LINE | cut -d " " -f1 -f2) city=$( echo $LINE | cut -d " " -f3) age=$( echo $LINE | cut -d " " -f9) check=$( echo $amount | grep -c "[0-9]") if [ $check -gt 0 ]; then if [ $age -gt 30 ] ; then echo "You get a discount" fi fi done < $1 else echo "No file found" fi 

Я бы прочитал строку в массив bash:

 if [[ -f $1 ]] ; then while read -ra line; do (( ${#line[@]} > 0 )) || continue # skip empty lines name=${line[*]:0:2} age=${line[-1]} echo "$name ----- $age" if (( $age > 30 )); then echo "You get a discount" fi done < "$1" else echo "No file found" fi 
 #FirstName LastName ----- Age Bruce Wayne ----- 31 You get a discount Clark Kent ----- 32 You get a discount Oliver Queen ----- 30 

Это также не беспокоит, что $ age является нецелым:

 $ age=Age $ [ $age -gt 30 ] && echo old || echo young bash: [: Age: integer expression expected young $ (( $age > 30 )) && echo old || echo young young $ [[ $age -gt 30 ]] && echo old || echo young young