Cara menampilkan file terbaru ketika pengguna diminta memasukkan tiga nama file di Bash

Saya mencoba mengembangkan skrip shell yang meminta pengguna memasukkan tiga nama file dan kemudian skrip akan menampilkan file terbaru yang dibuat. Namun, setiap kali saya menjalankan kode saya, secara otomatis masuk ke bagian elseif dan menampilkan "Tidak ada nama file yang ditemukan ....EXITING"

Kesalahan apa yang saya lakukan dalam kode saya?

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 sumber
comment
jalankan kode Anda melalui shellcheck.net. Pastikan untuk menyertakan #!/bin/bash sebagai baris pertama (atau tentukan shell yang Anda gunakan, jika bukan bash). Semoga beruntung.   -  person shellter    schedule 28.08.2019
comment
$1 hingga $3 mengacu pada parameter posisi, bukan apa yang dibaca read. Periksa read --help : Anda seharusnya meneruskan nama variabel ke read yang akan diisi dengan data yang sedang dibaca.   -  person Aaron    schedule 28.08.2019
comment
Apakah saya melewatkan sesuatu, mengapa tidak: $ ls -1c File1 File2 File3 | head -1 Masalahnya juga adalah tanda -t. -t terakhir diubah. Pertanyaan awal adalah file terbaru *dibuat*` Yang berarti menggunakan -c untuk ctime. $ man ls   -  person jdw    schedule 28.08.2019


Jawaban (1)


Untuk membaca beberapa variabel, Anda harus menentukan nama variabel:

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

-r memastikan garis miring terbalik tidak ditafsirkan dalam masukan.

Sekarang, alih-alih $1 dst., Anda menggunakan f1 dan teman-teman:

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

Saya telah menggunakan [[ ]] khusus Bash daripada [ ] di sini karena lebih memaafkan dalam hal mengutip (dan melakukannya untuk kami).

Dan yang terakhir, penguraian ls adalah antipattern. Anda dapat membandingkan file secara langsung:

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

Bersama:

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