Если вы запустите 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
, где упоминается файл по умолчанию.
Ваша первая проблема заключается в том, что вы используете текстовый файл 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 "
Так что это исчезнет, если вы исправите файл, как я описал в начале.