2010-03-01 36 views
33

Tôi không chắc chắn cách thực hiện if với nhiều thử nghiệm trong trình bao. Tôi đang gặp rắc rối viết kịch bản này:Sử dụng nếu elif fi trong tập lệnh shell

echo "You have provided the following arguments $arg1 $arg2 $arg3" 
if [ "$arg1" = "$arg2" && "$arg1" != "$arg3" ] 
then 
    echo "Two of the provided args are equal." 
    exit 3 
elif [ $arg1 = $arg2 && $arg1 = $arg3 ] 
then 
    echo "All of the specified args are equal" 
    exit 0 
else 
    echo "All of the specified args are different" 
    exit 4 
fi 

Vấn đề là tôi nhận được lỗi này mỗi khi:

./compare.sh: [: thiếu `]' command not found

+5

Khá nhiều nhà bình luận đã đề xuất bạn sử dụng [[chứ không phải [nhưng điều đó làm cho tập lệnh của bạn trở nên cụ thể hơn. Bạn sẽ có ít vấn đề về bảo trì và tính di động hơn nếu bạn có thể dính vào cú pháp shell (sh) cũ của Bourne. –

Trả lời

25

sh được giải thích && như một nhà điều hành vỏ. Thay đổi nó để -a, đó là [ ‘s kết hợp điều hành:

[ "$arg1" = "$arg2" -a "$arg1" != "$arg3" ] 

Ngoài ra, bạn nên thường xuyên trích dẫn các biến, bởi vì [ bị bối rối khi bạn rời khỏi tranh cãi.

5

Thay đổi "[" thành "[[" và "]" thành "]]".

+1

Tốt hơn, thay đổi '[' thành 'test' –

7

Sử dụng dấu ngoặc kép ...

if [[ expression ]]

+1

Để lưu ý, đây là một giải pháp vì '[[' xây dựng được xây dựng trong trình bao trong khi '[' là một tên khác cho lệnh 'test' và do đó phải chịu cú pháp của nó - xem 'man test' –

+4

Về mặt kỹ thuật,' ['là một nội trang hệ vỏ, nhưng' [['là một từ khóa shell. Đó là sự khác biệt. –

+1

Vì vậy, hãy xem kết quả của các lệnh bash 'type [', 'type [[', 'help [' và 'help [['. – Apostle

2

Tôi có một mẫu từ mã của bạn. Hãy thử điều này:

echo "*Select Option:*" 
echo "1 - script1" 
echo "2 - script2" 
echo "3 - script3 " 
read option 
echo "You have selected" $option"." 
if [ $option="1" ] 
then 
    echo "1" 
elif [ $option="2" ] 
then 
    echo "2" 
    exit 0 
elif [ $option="3" ] 
then 
    echo "3" 
    exit 0 
else 
    echo "Please try again from given options only." 
fi 

Điều này sẽ hiệu quả. :)

+0

Gawd trông có vẻ kỳ quặc đối với tôi. Tại sao không có 'sau đó' sau' else'? Nó có thể thực sự không được kỳ quặc, nhưng đó là cách nó trông, so với không gian C. – Rolf

+0

là cần thiết sau khi $ tùy chọn và trước = để chạy nó tốt, khác mỗi lần 1 – PiyusG

23

Josh Lee câu trả lời làm việc, nhưng bạn có thể sử dụng "& &" nhà điều hành để có thể đọc tốt hơn như thế này:

echo "You have provided the following arguments $arg1 $arg2 $arg3" 
if [ "$arg1" = "$arg2" ] && [ "$arg1" != "$arg3" ] 
then 
    echo "Two of the provided args are equal." 
    exit 3 
elif [ $arg1 = $arg2 ] && [ $arg1 = $arg3 ] 
then 
    echo "All of the specified args are equal" 
    exit 0 
else 
    echo "All of the specified args are different" 
    exit 4 
fi 
1

này đang làm việc cho tôi,

# cat checking.sh 
#!/bin/bash 
echo "You have provided the following arguments $arg1 $arg2 $arg3" 
if [ "$arg1" = "$arg2" ] && [ "$arg1" != "$arg3" ] 
then 
    echo "Two of the provided args are equal." 
    exit 3 
elif [ $arg1 == $arg2 ] && [ $arg1 = $arg3 ] 
then 
    echo "All of the specified args are equal" 
    exit 0 
else 
    echo "All of the specified args are different" 
    exit 4 
fi 

# ./checking.sh 
You have provided the following arguments 
All of the specified args are equal 

Bạn có thể thêm "set -x" trong tập lệnh để gỡ rối các lỗi,

Cảm ơn.

Các vấn đề liên quan