ip a | grep -Eq ': eth0:.*state UP' || _do_your_thing
Vì vậy, ở đây chúng tôi greplà ipcông cụ phổ biến stdoutcho một dòng chứa cả giao diện quan tâm của chúng tôi và cụm từ "trạng thái LÊN" (cảm ơn @Lekensteyn vì đã chỉ ra sự cần thiết phải cụ thể hơn một chút so với chỉ UP). Chúng tôi sử dụng đối số adưới dạng ngắn gọn addressvà đủ để có được danh sách tất cả các card mạng được cấu hình trong hệ thống.
Một lợi thế khi sử dụng ipcó thể là nó thực sự có sẵn ở mọi nơi - ví dụ như cách tôi thường định cấu hình các thiết bị mạng Android của mình.
Chúng :colonsđược sử dụng để tránh các phần trùng khớp - theo cách này, chúng tôi đảm bảo một trận đấu eth0trái ngược với điều khác có thể someothereth0hoặc eth007.
Cảm ơn @RaphaelAhrens đã thúc đẩy tôi hướng đến sự đúng đắn và giải thích giải pháp của tôi.
CHỈNH SỬA:
Để xử lý các yêu cầu hiện tại bạn có thể:
ip a | sed -rn '/: '"$if"':.*state UP/{N;N;s/.*inet (\S*).*/\1/p}'
Ở trên sẽ chỉ in một địa chỉ IP CIDR nếu mục tiêu của bạn $iflà LÊN, cắm và có một địa chỉ. Đối với ipv6, giải pháp rất đơn giản chỉ với sửa đổi nhỏ.
Nếu bạn không thích, sedbạn có thể đạt được kết quả tương tự với người khác |pipe ... grepvà thêm -Atùy chọn ngữ cảnh vào lần đầu tiên grep- nhưng tôi thích sed.
cat /sys/class/net/ | grep eth0sẽ cung cấp cho bạn dữ liệu dễ phân tích. Bạn cũng có thể làmsudo ethtool eth0 | grep Link