Сценарий Bash :Проблема с переменными из CSV-файла

Если вы запустите strace -e open who, вы увидите все файлы, которые whoоткрывает. В Linux это включает /var/run/utmp. utmpявляется не человеком -читаемым файлом, а представляет собой последовательность utmpструктур (см.utmpx(5)). Во FreeBSD whoоткрывает /var/run/utx.active.

Вы также можете найти эту информацию в who --help, man 1 whoили даже info who, где упоминается файл по умолчанию.

4
02.06.2021, 12:51
1 ответ

Ваша первая проблема заключается в том, что вы используете текстовый файл Windows. Ваш csv имеет окончание строки в стиле Windows(\r\n). Вы можете исправить это, используя:

dos2unix teste_input.csv

Или, если у вас не установлено dos2unix, просто установите:

sed -i 's/\r//g' teste_input.csv

Это заставит ваш код выдать ожидаемый результат. Почти:

$ foo.sh teste_input.fixed.csv 
Name : Marc
Age : 18
$c_1 can drive
Name : Joseph
Age : 10

$c_1из-за одинарных кавычек в этой строке:

echo '$c_1 can drive'

Переменные не заключаются в одинарные кавычки, поэтому вы видите $c_1, а не значение переменной. Вам нужно:

echo "$c_1 can drive"

Следующая проблема заключается в том, что ==используется для сравнения строк, а не для арифметики. Здесь это сработает, но если вы хотите сравнить числовые значения, вам нужно-eq:

if [ $c_2 -eq "18" ]

Однако, основываясь на вашем выводе «can drive», я подозреваю, что вы хотите проверить, равно ли значение переменной значению 18или больше, поэтому вы должны использовать-ge:

 if [ $c_2 -ge "18" ]

Наконец, вам нужно выбрать один снаряд для использования. kshне совпадает с bash, который не совпадает с sh. Хотя у них очень похожий синтаксис, он не идентичен, и некоторые вещи будут работать по-разному в зависимости от того, что вы используете. Например, shне поддерживает <(command).

Что касается арифметики, которую вы пробовали, вам просто нужно правильно понять синтаксис, вам нужно использовать «арифметический контекст». s=$c_2+1просто выполняет простое присвоение переменной. Он устанавливает значение переменной $sв значение $c_2с добавленной строкой +1:

.
$ c_2=10
$ s=$c_2+1
$ echo "$s"
10+1

Ваш второй пример, d=$((${c_2}+1))работает, потому что (( ))задает арифметический контекст:

$ c_2=10
$ d=$((${c_2}+1))
$ echo "$d"
11

Вы получили синтаксическую ошибку из-за окончаний строк Windows:

$ c_2=10$'\r'
$ d=$((${c_2}+1))
+1")syntax error: invalid arithmetic operator (error token is "

Так что это исчезнет, ​​если вы исправите файл, как я описал в начале.

6
28.07.2021, 11:27

Теги

Похожие вопросы