Phân tích cú pháp một tham số với các tùy chọn trong khi thực thi tập lệnh shell


-1

Tôi có 5 tùy chọn trong tập lệnh như Lấy địa chỉ IP, Bộ nhớ trống, Sử dụng CPU, Tên máy chủ và Tên người dùng.

Tôi muốn làm một kịch bản để có được tất cả đầu ra hoặc bất cứ ai.

Ví dụ :

Nếu tôi thực hiện

system_info.sh -i ip -fm free -c cpu -h host -u user

hoặc là

system_info.sh -all all

sau đó nó sẽ cung cấp cho tất cả các đầu ra.

Nếu giả sử tôi chỉ muốn một đầu ra, cần chạy cùng một kịch bản như

system_info.sh -fm free
system_info.sh -fm free -i ip

Tôi có ý tưởng nhưng tôi không biết cách đặt các tùy chọn này và xác thực trong tập lệnh.

Vui lòng gợi ý cho tôi cách đặt các tùy chọn này


Câu trả lời:


5

Tôi chưa bao giờ làm điều này trước đây nhưng nhìn thấy điều này và tôi đã học được điều gì đó. Bạn sẽ cần phải sử dụng bash getoptschức năng như vậy. Điều này sẽ chỉ cho bạn đi đúng hướng:

while getopts i:f:c:h:u: option
do
 case "${option}"
 in
 i) ip=${OPTARG};;
 f) state=${OPTARG};;
 c) cpu=${OPTARG};;
 h) host=$OPTARG;;
 u) user=$OPTARG;;
 esac
done

Đây là một vòng lặp while sử dụng getoptshàm và cái gọi là optstring, trong trường hợp này i:f:c:h:u:, để lặp qua các đối số. Vòng lặp while đi qua optstring, trong đó có các cờ có thể được sử dụng để truyền các đối số và gán giá trị đối số được cung cấp cho cờ đó cho biến option. Sau đó, câu lệnh case gán giá trị của biến optioncho biến toàn cục có thể được sử dụng sau khi tất cả các đối số đã được đọc.

Các dấu hai chấm optstringcó nghĩa là các giá trị được yêu cầu cho các cờ tương ứng. Trong ví dụ trên, tất cả các cờ được theo sau bởi dấu hai chấm : i:f:c:h:u:.

Điều này có nghĩa, tất cả các cờ cần một giá trị. Ví dụ, nếu ivà các ucờ không được mong đợi có giá trị, thì chuỗi sẽ là i:f:c:h:u.

Ví dụ :i:f:c:h:u:, một dấu hai chấm ở đầu chuỗi , có một ý nghĩa hoàn toàn khác. Nó cho phép bạn xử lý các cờ không được biểu thị trong chuỗi opt. Trong trường hợp đó, giá trị của biến "tùy chọn" được đặt thành "?" và giá trị của "OPTARG" được đặt thành cờ không mong muốn. Cho phép bạn hiển thị một thông báo lỗi phù hợp thông báo cho người dùng về lỗi.

Các đối số không có trước cờ được bỏ qua bởi các getopts. Nếu các cờ được chỉ định trong chuỗi quang không được cung cấp khi tập lệnh được gọi, không có gì xảy ra, trừ khi bạn đặc biệt xử lý trường hợp này trong mã của mình.

Bất kỳ đối số không được xử lý bởi getopsvẫn có thể được chụp bằng thường xuyên $1, $2vv biến.

Ví dụ đơn giản:

#!/bin/bash

while getopts "i:f:c:h:u:" opt
do
        case $opt in
                i)
                        echo "ip"
                        ;;
                f)
                        echo "free"
                        ;;
                c)
                        echo "cpu"
                        ;;
                h)
                        echo "host"
                        ;;
                u)
                        echo "user"
                        ;;
                *)
                        echo "Nothing to do"
                        ;;
        esac
done

Sử dụng:

./h.sh -i ip -f free -c cpu -h host -u user

Kết quả:

ip
free
cpu
host
user

Nguồn:

https://www.lifewire.com/pass-argument-to-bash-script-2200571

http://aplawrence.com/Unix/getopts.html

http://mywiki.wooledge.org/BashFAQ/035#getopts

http://mywiki.wooledge.org/ComplexOptionParsing


Nếu bạn biết nó sẽ hoạt động thì hãy chia sẻ vui lòng
Người mới bắt đầu

@ user476625 Bạn đang yêu cầu mã mẫu?
George Udosen

Vâng, những gì bạn từng chia sẻ đã đọc liên kết đó
Người mới bắt đầu

Cảm ơn trước, vẫn cố gắng nhưng tôi không thể có được. nếu bạn đã làm ơn hãy chia sẻ
Người mới bắt đầu

2
@ user476625 Nếu câu trả lời này không giải quyết được câu hỏi của bạn, vui lòng chỉnh sửa và làm rõ chính xác những gì bạn cần và những gì sai với getopts, ngừng spam với các bình luận!
tráng miệng
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.