Hoặc đối với những gì có vẻ như tràn lan quá mức cần thiết, nhưng thực sự là đơn giản ... Khá nhiều bao gồm tất cả các trường hợp của bạn, và không có chuỗi rỗng hoặc mối quan tâm đơn lẻ.
Trong trường hợp đối số đầu tiên là '-v', sau đó thực hiện điều kiện của bạn ps -ef
, còn lại trong tất cả các trường hợp khác thì sử dụng.
#!/bin/sh
case $1 in
'-v') if [ "$1" = -v ]; then
echo "`ps -ef | grep -v '\['`"
else
echo "`ps -ef | grep '\[' | grep root`"
fi;;
*) echo "usage: $0 [-v]"
exit 1;; #It is good practice to throw a code, hence allowing $? check
esac
Nếu ai đó không quan tâm đối số '-v' ở đâu, thì chỉ cần bỏ trường hợp vào trong một vòng lặp. Nó sẽ cho phép đi bộ tất cả các args và tìm '-v' ở bất cứ đâu (miễn là nó tồn tại). Điều này có nghĩa là thứ tự đối số dòng lệnh không quan trọng. Hãy cảnh báo trước, như đã trình bày, biến arg_match được thiết lập, do đó nó chỉ là một cờ. Nó cho phép nhiều lần xuất hiện đối số '-v'. Người ta có thể bỏ qua tất cả các lần xuất hiện khác của '-v' đủ dễ dàng.
#!/bin/sh
usage ()
{
echo "usage: $0 [-v]"
exit 1
}
unset arg_match
for arg in $*
do
case $arg in
'-v') if [ "$arg" = -v ]; then
echo "`ps -ef | grep -v '\['`"
else
echo "`ps -ef | grep '\[' | grep root`"
fi
arg_match=1;; # this is set, but could increment.
*) ;;
esac
done
if [ ! $arg_match ]
then
usage
fi
Tuy nhiên, cho phép nhiều lần xuất hiện của một đối số thuận tiện để sử dụng trong các tình huống như:
$ adduser -u:sam -s -f -u:bob -trace -verbose
Chúng tôi không quan tâm đến thứ tự của các đối số và thậm chí cho phép nhiều đối số -u. Vâng, nó là một vấn đề đơn giản cũng cho phép:
$ adduser -u sam -s -f -u bob -trace -verbose
echo "usage: $0 [-v]"
;$-
hiển thị các cờ tùy chọn trình bao hoạt động, không phải tên của tập lệnh hiện tại.