Нотация var=$(command)
запускает command
и присваивает свой вывод var
. Поскольку home/admin17/folder/data_log
— это файл, а не команда, это должно привести к ошибке:
log=$(home/admin17/folder/data_log)
bash: home/admin17/folder/data_log: command not found
Если вы хотите сохранить имя файла как переменную, вам нужно:
log=home/admin17/folder/data_log
Затем все остальное должно работать так, как вы ожидаете.:
log=home/admin17/folder/data_log
read -p "Number of log entries" num
cat $log | tail -n $num
Или, избегая бесполезного использования кота (UUoC):
log=home/admin17/folder/data_log
read -p "Number of log entries: " num
tail -n "$num" "$log"
У вас тут две проблемы. Во-первых, вы используете оболочку, которая не поддерживает массивы. Скорее всего sh
или dash
. Я предполагаю, что хотя у вас есть строка bash shebang, вы вызываете свой скрипт с помощью sh script.sh
, что означает, что он интерпретируется тем, что sh
находится в вашей системе. Например, на dash
(, который по умолчанию sh
в Debian и Ubuntu ), вы получите:
$ out=$(echo 23.3 43.6 )
$ echo ${out[0]}
dash: 2: Bad substitution
Однако в bash вы получите:
$ out=$(echo 23.3 43.6 )
$ echo ${out[0]}
23.3 43.6
Следующая проблема заключается в том, что даже если вы запускаете это в bash, массивы работают иначе:
$ out=$(echo 23.3 43.6 )
$ echo ${out[0]}
23.3 43.6
$ echo ${out[1]} ## prints nothing but a newline since the variable is empty
$
Чтобы получить массив в bash, нужно поместить элементы в круглые скобки:
$ out=( $(echo 23.3 43.6 ) )
$ echo ${out[0]}
23.3
$ echo ${out[1]}
43.6