Как отобразить самый последний файл, когда пользователя просят ввести три имени файла в Bash

Я пытаюсь разработать сценарий оболочки, который просит пользователя ввести три имени файла, а затем сценарий выводит самый последний созданный файл. Однако каждый раз, когда я запускаю свой код, он автоматически переходит в раздел elseif и отображает «Имя файла не найдено…. ВЫХОД»

Какую ошибку я делаю в своем коде?

read -p "Enter three filenames : $1 $2 $3 "
if [ -f "$1" ] && [ -f "$2" ] && [ -f "$3" ]
then 
ls -t $read | head n1
else
echo "No filename found .......EXITING"
fi

person m.Robot    schedule 28.08.2019    source источник
comment
запустите свой код через shellcheck.net. Обязательно укажите #!/bin/bash в качестве первой строки (или укажите используемую оболочку, если не bash). Удачи.   -  person shellter    schedule 28.08.2019
comment
$1 до $3 относятся к позиционным параметрам, а не к тому, что читается через read. Отметьте read --help : вы должны передавать имена переменных в read, которые он будет заполнять считываемыми данными.   -  person Aaron    schedule 28.08.2019
comment
Я что-то упустил, почему бы не просто: $ ls -1c File1 File2 File3 | head -1 Проблема также заключается в флаге -t. -t является последним измененным. Первоначальный вопрос был о самом последнем файле *созданном*`, что означает использование -c для ctime. $ man ls   -  person jdw    schedule 28.08.2019


Ответы (1)


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

read -rp "Enter three filenames: " f1 f2 f3

-r гарантирует, что обратная косая черта не интерпретируется во входных данных.

Теперь вместо $1 и т. д. вы используете f1 и друзей:

if [[ -f $f1 ]] && [[ -f $f2 ]] && [[ -f $f3 ]]; then

Я использовал специфичный для Bash [[ ]] вместо [ ] здесь, так как он более щадящий в отношении цитирования (и делает это за нас).

И, наконец, синтаксический анализ ls — это антишаблон. Вместо этого вы можете сравнить файлы напрямую:

newest=$f1
[[ $f2 -nt $newest ]] && newest=$f2
[[ $f3 -nt $newest ]] && newest=$f3
printf '%s\n' "$newest"

Все вместе:

read -rp "Enter three filenames: " f1 f2 f3
if [[ -f $f1 ]] && [[ -f $f2 ]] && [[ -f $f3 ]]; then
    newest=$f1
    [[ $f2 -nt $newest ]] && newest=$f2
    [[ $f3 -nt $newest ]] && newest=$f3
    printf '%s\n' "$newest"
else
    echo "No filename found" >&2
    exit 1
fi
person Benjamin W.    schedule 28.08.2019