Saya mencoba untuk menulis skrip yang sangat sederhana di Ubuntu yang memungkinkan saya untuk memberikannya nama file atau direktori, dan dapat melakukan sesuatu yang spesifik ketika itu file, dan sesuatu yang lain ketika itu adalah direktori. Masalah yang saya alami adalah ketika nama direktori, atau mungkin file juga, memiliki spasi atau karakter lain yang dapat dihapus dalam nama.
Ini kode dasar saya di bawah, dan beberapa tes.
#!/bin/bash
PASSED=$1
if [ -d "${PASSED}" ] ; then
echo "$PASSED is a directory";
else
if [ -f "${PASSED}" ]; then
echo "${PASSED} is a file";
else
echo "${PASSED} is not valid";
exit 1
fi
fi
Dan inilah hasilnya:
andy@server~ $ ./scripts/testmove.sh /home/andy/
/home/andy/ is a directory
andy@server~ $ ./scripts/testmove.sh /home/andy/blah.txt
/home/andy/blah.txt is a file
andy@server~ $ ./scripts/testmove.sh /home/andy/blah\ with\ a\ space.txt
/home/andy/blah with a space.txt is not valid
andy@server~ $ ./scripts/testmove.sh /home/andy\ with\ a\ space/
/home/andy with a space/ is not valid
Semua jalur itu valid, dan ada.
if
-else
Konstruksi di Bash juga mendukungelif
. Hanya FYI.Jawaban:
Itu seharusnya bekerja. Saya tidak yakin mengapa itu gagal. Anda mengutip variabel Anda dengan benar. Apa yang terjadi jika Anda menggunakan skrip ini dengan ganda
[[
]]
?Kurung kotak ganda adalah ekstensi bash ke
[ ]
. Itu tidak memerlukan variabel untuk dikutip, bahkan jika mereka mengandung spasi.Juga patut dicoba:
-e
untuk menguji apakah ada jalur tanpa menguji jenis file apa itu.sumber
Setidaknya tulis kode tanpa pohon lebat:
Ketika saya meletakkannya di file "xx.sh" dan membuat file "xx sh", dan menjalankannya, saya mendapatkan:
Karena Anda mengalami masalah, Anda harus men-debug skrip dengan menambahkan:
Ini akan menunjukkan kepada Anda apa yang
ls
dipikirkan tentang nama-nama yang Anda lewati skrip.sumber
Menggunakan perintah "file" mungkin berguna untuk ini:
Contoh keluaran:
FYI: jawaban di atas berfungsi tetapi Anda dapat menggunakan -s untuk membantu dalam situasi aneh dengan memeriksa file yang valid terlebih dahulu:
sumber
-s
memeriksa file tidak kosong, file dengan ukuran tidak nol)? Dan Anda tidak akan mencetak diagnosis untuk blok spesial, karakter spesial, FIFO, dll? Symlinks mungkin memutuskan apa yang ada di ujung tautan; symlink yang rusak lebih bermasalah.--brief
benderafile
. Itu hanya keluarandirectory
ketika itu.Menggunakan
-f
dan-d
mengaktifkan/bin/test
:sumber
test
Biasanya shell adalah built-in, meskipun biasanya juga ada executable seperti/bin/test
, dan juga/bin/[
.)Solusi yang lebih elegan
sumber
if [ -f "$x" ]
.sumber
Ini harus bekerja:
sumber
sumber
Satu liner
hasilnya benar (0) (dir) atau benar (0) (file) atau salah (1) (tidak ada)
sumber
touch bob
denganmkdir bob
, saya mendapatkan output:dir
danfile
pada dua baris.