Tôi muốn kết hợp nhiều điều kiện trong một shell if statement và phủ nhận kết hợp. Tôi có mã làm việc sau đây cho một sự kết hợp đơn giản của các điều kiện:
if [ -f file1 ] && [ -f file2 ] && [ -f file3 ] ; then
# do stuff with the files
fi
Điều này hoạt động tốt. Nếu tôi muốn phủ nhận nó, tôi có thể sử dụng mã làm việc sau:
if ! ( [ -f file1 ] && [ -f file2 ] && [ -f file3 ] ) ; then
echo "Error: You done goofed."
exit 1
fi
# do stuff with the files
Điều này cũng hoạt động như mong đợi. Tuy nhiên, điều đó xảy ra với tôi rằng tôi không biết dấu ngoặc đơn đang thực sự làm gì ở đó. Tôi muốn sử dụng chúng chỉ để nhóm, nhưng nó thực sự sinh ra một subshell? (Làm thế nào tôi có thể nói?) Nếu vậy, có cách nào để nhóm các điều kiện mà không sinh ra một subshell?
if [[ ! -f file1 ]] && [[ ! -f file2 ]]; then
if [ ! 1 -eq 2 ] && [ ! 2 -eq 3 ]; then echo yep; fi
và nó hoạt động. Tôi chỉ luôn viết các bài kiểm tra với niềng răng đôi như một vấn đề của thói quen. Ngoài ra, để đảm bảo là không bash
, tôi đã thử nghiệm thêm if /bin/test ! 1 -eq 2 && /bin/test ! 2 -eq 3 ; then echo yep; fi
và nó cũng hoạt động theo cách đó.
[ ! -e file/. ] && [ -r file ]
sẽ bỏ thư mục. phủ nhận nó như bạn muốn. Tất nhiên, đó là những gì -d
làm.
if ! [ -f file1 ] || ! [ -f file 2 ] || ! [ -f file3 ] ; then
nhưng tôi muốn một câu trả lời tổng quát hơn.