Saya ingin memeriksa keberadaan beberapa direktori, katakanlah dir1
,, dir2
dan dir3
, di direktori kerja.
Saya punya yang berikut ini
if [ -d "$PWD/dir1" ] && [ -d "$PWD/dir2" ] && [ -d "$PWD/dir3" ]; then
echo True
else
echo False
fi
Tapi saya curiga ada cara yang lebih elegan untuk melakukan ini. Jangan berasumsi bahwa ada pola dalam nama direktori.
Tujuannya adalah untuk memeriksa keberadaan beberapa direktori dan tidak adanya direktori lain.
Saya menggunakan Bash, tetapi kode portabel lebih disukai.
shell-script
shell
files
directory
control-flow
Keanggunan
sumber
sumber
$PWD
, omong-omong.[ -d "$PWD/dir1"]
setara dengan[ -d "dir1" ]
.Jawaban:
Jika Anda sudah mengharapkannya menjadi direktori dan hanya memeriksa apakah semuanya ada, Anda bisa menggunakan kode keluar dari
ls
utilitas untuk menentukan apakah satu atau lebih "kesalahan terjadi" :Saya mengarahkan output dan stderr ke
/dev/null
untuk membuatnya menghilang, karena kita hanya peduli dengan kode keluarls
, bukan outputnya. Apa pun yang ditulis untuk/dev/null
menghilang - tidak ditulis ke terminal Anda.sumber
1
stdout,2
stderr dan saya tahu apa itu redirect. Saya tidak mengerti pentingnya/dev/null
, dan saya tidak tahu bagaimana menguraikan perintah.&>filename
pengalihan stdout dan stderr kefilename
. Jadi tidak bisakah perintah disederhanakan (setidaknya bagi saya itu lebih sederhana)ls "$PWD/dir1" "$PWD/dir2" "$PWD/dir2" &>/dev/null && echo All there
?-d
opsi (a) jadils
hanya perlu membuat stat direktori, dan tidak membacanya, dan (b) sehingga perintah akan berhasil bahkan jika pengguna tidak memiliki akses baca ke direktori. (2) Saya tidak melihat alasan untuk menggunakan"$PWD/"
kecuali untuk menjaga terhadap direktori yang namanya dimulai dengan-
(dan, tentu saja, ada cara yang lebih baik untuk melakukan itu).Saya akan mengulang:
The
break
menyebabkan loop untuk sirkuit pendek, seperti rantai Anda&&
sumber
Sebuah loop mungkin lebih elegan:
Ini Bash. Yang lebih portabel adalah Sh. Di sana Anda dapat menggunakan array posisi:
Kemudian untuk mengulanginya gunakan
"$@"
.sumber
Kenapa tidak adil:
sumber
But I suspect there is a more elegant way of doing this
-a
: "-a
dan-o
binary primary (...) operator telah dianggap usang": pubs.opengroup.org/onlinepubs/9699919799test
(alias[
) tiga kali ini memanggil sekali,Sesuai pertanyaan, dua fungsi shell portabel yang menguji keberadaan dan tidak adanya beberapa direktori:
Contoh:
sumber
Berdasarkan jawaban glenn jackman , kita dapat menguji tidak adanya nama lain seperti ini:
Saya dulu[ -e "$dir" ]
menguji apakah"$dir"
ada; yaitu, jikadir5
ada tetapi merupakan file, hasilnya adalahFalse
. Jika Anda hanya ingin menguji apakah nama-nama dalam grup kedua adalah direktori, gunakan[ -d "$dir" ]
, seperti pada loop pertama.Karena kita berbicara tentang memeriksa keberadaan hal-hal di direktori kerja saat ini, mungkin tidak perlu untuk menentukan
$PWD/
nama-nama; kerjakan sajasumber