2008-10-08 27 views

Trả lời

11

bash

sửa chữa ngắn nhất:

if [[ "$var1" = "mtu "* ]] 

Bash của [[ ]] không nhận được glob-mở rộng, không giống như [ ] (mà phải, vì những lý do lịch sử).


bash --posix

Ồ, tôi gửi quá nhanh. Bourne vỏ, không Bash ...

if [ "${var1:0:4}" == "mtu " ] 

${var1:0:4} có nghĩa là bốn nhân vật đầu tiên của $var1.


/bin/sh

Ah, xin lỗi. Giả lập POSIX của Bash không đi đủ xa; một vỏ Bourne gốc thực sự không có ${var1:0:4}. Bạn sẽ cần một cái gì đó giống như giải pháp của mstrobl.

if [ "$(echo "$var1" | cut -c0-4)" == "mtu " ] 
+0

'$ {var1: 0: 4}' - bạn đã nhận cú pháp đó từ đâu? Nó chắc chắn không phải POSIX. –

+1

Phiên bản cắt của tôi cho biết rằng các vị trí được đánh số bắt đầu từ 1. '' cut -c 1-4'' hoặc '' cut -c -4'' trả lại giá trị chính xác tại đây. – jotr

18

Sử dụng công cụ Unix. Chương trình cut sẽ vui vẻ rút ngắn chuỗi.

if [ "$(echo $var1 | cut -c 4)" = "mtu " ]; 

... nên làm những gì bạn muốn.

+1

có, nhưng kinda nặng –

+0

Tôi tin rằng vì bạn đang so sánh hai chuỗi ở đây nên là "=" hoặc "==", không phải "-eq". – William

+0

'' cắt -c 4'' cắt bỏ ký tự thứ tư: '' cắt -c -4'' cắt bốn ký tự đầu tiên. – jotr

0

Hoặc, như một ví dụ về các nhà điều hành = ~:

if [[ "$var1" =~ "mtu *" ]] 
+0

Loại vỏ nào vậy? – ADEpt

+0

Bash 3.1 và lớn hơn có [[a = ~. *]]. Nhưng * bên trong dấu ngoặc kép là sai cho 3.2 và lớn hơn mà không có shopt -s compat31. – ephemient

+0

Nó không phải là POSIX. –

6

Bạn có thể gọi expr để phù hợp với dây chống lại biểu thức thông thường từ bên trong kịch bản Bourne Shell. Dưới đây dường như làm việc:

#!/bin/sh 

var1="mtu eth0" 

if [ "`expr \"$var1\" : \"mtu .*\"`" != "0" ];then 
    echo "match" 
fi 
3

Tôi muốn làm như sau:

# Removes anything but first word from "var1" 
if [ "${var1%% *}" = "mtu" ] ; then ... fi 

Hoặc:

# Tries to remove the first word if it is "mtu", checks if we removed anything 
if [ "${var1#mtu }" != "$var1" ] ; then ... fi 
1

Tôi thích sử dụng các báo cáo trường hợp để so sánh chuỗi.

Một ví dụ nhỏ là

case "$input" 
in 
    "$variable1") echo "matched the first value" 
    ;; 
    "$variable2") echo "matched the second value" 
    ;; 
    *[a-z]*) echo "input has letters" 
    ;; 
    '')  echo "input is null!" 
    ;; 
    *[0-9]*) echo "matched numbers (but I don't have letters, otherwise the letter test would have been hit first!)" 
    ;; 
    *) echo "Some wacky stuff in the input!" 
esac 

Tôi đã làm những việc điên rồ như

case "$(cat file)" 
in 
    "$(cat other_file)") echo "file and other_file are the same" 
     ;; 
    *) echo "file and other_file are different" 
esac 

Và đó làm việc cũng vậy, với một số hạn chế, chẳng hạn như các tập tin không thể có nhiều hơn một cặp vợ chồng megabyte và trình bao chỉ đơn giản là không thấy null, vì vậy nếu một tệp có đầy null và cái kia không có, (và không có gì khác), kiểm tra này sẽ không thấy bất kỳ sự khác biệt nào giữa hai.

Tôi không sử dụng tệp so sánh làm ví dụ nghiêm trọng, chỉ là ví dụ về cách tuyên bố trường hợp có khả năng thực hiện chuỗi đối sánh linh hoạt hơn nhiều so với thử nghiệm hoặc expr hoặc các biểu thức vỏ tương tự khác.

1

Trong Bourne shell, nếu tôi muốn kiểm tra xem một chuỗi chứa một chuỗi:

if [ `echo ${String} | grep -c ${Substr} ` -eq 1 ] ; then 

Kèm theo echo ${String} | grep -c ${Substr} với hai ` backticks:

Để kiểm tra xem chuỗi con là ở đầu hoặc ở kết thúc:

if [ `echo ${String} | grep -c "^${Substr}"` -eq 1 ] ; then 
... 
if [ `echo ${String} | grep -c "${Substr}$"` -eq 1 ] ; then 
Các vấn đề liên quan