Hướng dẫn cho người mới bắt đầu để BASH - Điều kiện và biến

Giới thiệu

Chào mừng bạn đến phần thứ ba của "Hướng dẫn cho người mới bắt đầu". Nếu bạn đã bỏ lỡ hai bài viết trước thì có thể bạn sẽ muốn biết điều gì làm cho hướng dẫn này khác với các hướng dẫn kịch bản BASH khác.

Hướng dẫn này đang được viết bởi một người mới hoàn thành để BASH và như một người đọc bạn học như tôi học. Trong khi tôi là người mới làm quen với BASH, tôi đến từ một nền tảng phát triển phần mềm mặc dù hầu hết những thứ mà tôi đã viết đều dành cho nền tảng Windows.

Bạn có thể xem hai hướng dẫn đầu tiên bằng cách truy cập:

Nếu bạn chưa quen với kịch bản BASH, tôi khuyên bạn nên đọc hai hướng dẫn đầu tiên trước khi tiếp tục với hướng dẫn này.

Trong hướng dẫn này, tôi sẽ làm nổi bật cách sử dụng các câu lệnh có điều kiện để kiểm tra đầu vào của người dùng và kiểm soát cách một hàm script.

Cài đặt rsstail

Để làm theo hướng dẫn này, bạn sẽ cần phải cài đặt một ứng dụng dòng lệnh gọi là rsstail được sử dụng để đọc các nguồn cấp dữ liệu RSS .

Nếu bạn đang sử dụng kiểu phân phối dựa trên Debian / Ubuntu / Mint như sau:

sudo apt-get cài đặt rsstail

Đối với Fedora / CentOS, hãy gõ như sau:

yum cài đặt rsstail

Đối với openSUSE, hãy gõ như sau:

zypper cài đặt rsstail

Câu lệnh IF

Mở một thiết bị đầu cuối và tạo một tệp có tên rssget.sh bằng cách gõ như sau:

sudo nano rssget.sh

Trong trình chỉnh sửa nano, nhập văn bản sau:

#! / bin / bash
rsstail -u http://z.about.com/6/o/m/linux_p2.xml;

Lưu tệp bằng cách nhấn CTRL và O rồi thoát bằng cách nhấn CTRL và X.

Chạy tập lệnh bằng cách gõ như sau:

sh rssget.sh

Tập lệnh sẽ trả về một danh sách các tiêu đề từ nguồn cấp dữ liệu RSS linux.about.com.

Nó không phải là một kịch bản quá hữu ích bởi vì nó chỉ lấy các tiêu đề từ một nguồn cấp dữ liệu RSS nhưng nó không phải ghi nhớ đường dẫn đến nguồn cấp dữ liệu RSS của Linux.about.com.

Mở tập lệnh rssget.sh trong nano lần nữa và chỉnh sửa tệp để xem như sau:

#! / bin / bash

nếu [$ 1 = "tiết"]
sau đó
rsstail -d -l -u http://z.about.com/6/o/m/linux_p2.xml;
fi

Chạy lại tập lệnh bằng cách gõ như sau:

sh rssget.sh verbose

Thời gian này nguồn cấp dữ liệu RSS trở lại với tiêu đề, liên kết và mô tả.

Hãy phân tích kịch bản một cách chi tiết:

#! / Bin / bash xuất hiện trong mọi tập lệnh mà chúng tôi viết. Dòng tiếp theo về cơ bản nhìn vào tham số đầu vào đầu tiên được cung cấp bởi người dùng và so sánh nó với từ "verbose". Nếu tham số đầu vào và từ "verbose" khớp với các dòng giữa sau đófi được chạy.

Kịch bản trên rõ ràng là thiếu sót. Điều gì sẽ xảy ra nếu bạn không cung cấp thông số đầu vào? Câu trả lời là bạn nhận được một lỗi dọc theo các dòng của nhà điều hành bất ngờ.

Các lỗ hổng lớn khác là nếu bạn không cung cấp từ "tiết" thì không có gì xảy ra cả. Lý tưởng nhất là nếu bạn không cung cấp từ dài dòng, tập lệnh sẽ trả về một danh sách các tiêu đề.

Sử dụng lại nano để chỉnh sửa tệp rssget.sh và sửa đổi mã như sau:

#! / bin / bash

nếu [$ 1 = "tiết"]
sau đó
rsstail -d -l -u http://z.about.com/6/o/m/linux_p2.xml;
khác
rsstail -u http://z.about.com/6/o/m/linux_p2.xml;
fi

Lưu tệp và chạy nó bằng cách gõ như sau:

sh rssget.sh verbose

Danh sách tiêu đề, mô tả và liên kết sẽ xuất hiện. Bây giờ chạy lại nó như sau:

sh rssget.sh tiêu đề

Thời gian này chỉ là một danh sách các chức danh xuất hiện.

Phần phụ của kịch bản nằm trên dòng 4 và giới thiệu câu lệnh khác . Về cơ bản, kịch bản bây giờ nói nếu tham số đầu tiên là từ "verbose" có được mô tả, liên kết và tiêu đề cho nguồn cấp dữ liệu RSS nhưng nếu tham số đầu tiên là bất cứ điều gì khác chỉ cần có danh sách tiêu đề.

Kịch bản đã được cải thiện một chút nhưng vẫn còn thiếu sót. Nếu bạn không nhập tham số, bạn sẽ vẫn gặp lỗi. Ngay cả khi bạn cung cấp thông số, chỉ cần nói rằng bạn không muốn tiết lộ không có nghĩa là bạn chỉ muốn tiêu đề. Bạn có thể đã viết sai chính tả ví dụ hoặc bạn có thể đã gõ chim bồ câu mà tất nhiên là vô nghĩa.

Trước khi chúng tôi thử và xóa các vấn đề này, tôi muốn hiển thị cho bạn một lệnh nữa đi kèm với câu lệnh IF.

Chỉnh sửa tập lệnh rssget.sh của bạn để xem như sau:

#! / bin / bash

nếu [$ 1 = "tất cả"]
sau đó
rsstail -d -l -u http://z.about.com/6/o/m/linux_p2.xml;
elif [$ 1 = "mô tả"]
sau đó
rsstail -d -u http://z.about.com/6/o/m/linux_p2.xml;

khác
rsstail -u http://z.about.com/6/o/m/linux_p2.xml;
fi

Tôi quyết định loại bỏ từ dài dòng và thay thế nó bằng tất cả. Đó không phải là phần quan trọng. Kịch bản ở trên giới thiệu elif là một cách ngắn để nói ELSE IF.

Bây giờ kịch bản hoạt động như sau. Nếu bạn chạy sh rssget.sh thì bạn sẽ có được các mô tả, liên kết và tiêu đề. Nếu thay vào đó bạn chỉ cần chạy sh rssget.sh mô tả bạn sẽ chỉ nhận được tiêu đề và mô tả. Nếu bạn cung cấp bất kỳ từ nào khác, bạn sẽ nhận được một danh sách các chức danh.

Điều này giới thiệu một cách nhanh chóng đưa ra một danh sách các câu lệnh có điều kiện. Một cách khác để làm ELIF là sử dụng cái được gọi là câu lệnh IF lồng nhau.

Sau đây là ví dụ cho thấy cách câu lệnh IF lồng nhau hoạt động:

#! / bin / bash

nếu [$ 2 = "aboutdotcom"]
sau đó
nếu [$ 1 = "tất cả"]
sau đó
rsstail -d -l -u http://z.about.com/6/o/m/linux_p2.xml;
elif [$ 1 = "mô tả"]
sau đó
rsstail -d -u http://z.about.com/6/o/m/linux_p2.xml;

khác
rsstail -u http://z.about.com/6/o/m/linux_p2.xml;
fi
khác
nếu [$ 1 = "tất cả"]
sau đó
rsstail -d -l -u http://lxer.com/module/newswire/headlines.rss
elif [$ 1 = "mô tả"]
sau đó
rsstail -d -u http://lxer.com/module/newswire/headlines.rss
khác
rsstail -u http://z.about.com/6/o/m/linux_p2.xml;
fi
fi

Vui lòng nhập tất cả những gì bạn thích hoặc sao chép và dán vào tệp rssget.sh của bạn.

Đoạn mã trên giới thiệu thông số thứ 2 cho phép bạn chọn "about.com" hoặc "lxer.com" là nguồn cấp dữ liệu RSS.

Để chạy nó, bạn gõ như sau:

sh rssget.sh tất cả aboutdotcom

hoặc là

sh rssget.sh tất cả lxer

Tất nhiên, bạn có thể thay thế tất cả bằng mô tả hoặc tiêu đề để chỉ cung cấp mô tả hoặc chỉ tiêu đề.

Về cơ bản đoạn mã trên nói nếu tham số thứ hai là aboutdotcom thì hãy nhìn vào câu lệnh if thứ hai giống với câu lệnh trước nếu tham số thứ hai là lxer, sau đó xem lại câu lệnh if bên trong để quyết định có hiển thị tiêu đề, mô tả hay không hoặc mọi thứ.

Kịch bản đó được cung cấp hoàn toàn như một ví dụ về câu lệnh IF lồng nhau và có rất nhiều điều sai trái với kịch bản đó, nó sẽ mất một bài viết khác để giải thích tất cả chúng. Vấn đề chính là nó không thể mở rộng được.

Hãy tưởng tượng bạn muốn thêm một nguồn cấp dữ liệu RSS khác như Người dùng Linux hàng ngày hoặc Linux Hôm nay? Kịch bản sẽ trở nên rất lớn và nếu bạn quyết định rằng bạn muốn câu lệnh IF bên trong thay đổi bạn sẽ phải thay đổi nó ở nhiều nơi.

Trong khi có một thời gian và địa điểm cho một lồng nhau IF họ nên được sử dụng một cách tiết kiệm. Thường có cách để cấu trúc lại mã của bạn để bạn không cần NẾU lồng nhau. Tôi sẽ đi vào chủ đề này trong một bài viết trong tương lai.

Bây giờ hãy xem xét khắc phục sự cố của những người nhập tham số duff. Ví dụ trong kịch bản ở trên nếu người dùng nhập một cái gì đó khác với "aboutdotcom" làm thông số thứ 2 thì danh sách các bài báo xuất hiện từ nguồn cấp dữ liệu RSS từ LXER bất kể người dùng có nhập lxer hay không.

Ngoài ra, nếu người dùng không nhập "tất cả" hoặc "mô tả" làm thông số thứ nhất thì mặc định là danh sách các tiêu đề có thể hoặc không phải là nội dung người dùng dự định.

Hãy xem tập lệnh sau (hoặc sao chép và dán nó vào tệp rssget.sh của bạn.

#! / bin / bash

nếu [$ 2 = "aboutdotcom"] || [2 đô la = "lxer"]
sau đó
nếu [$ 1 = "tất cả"] || [$ 1 = "mô tả"] || [$ 1 = "tiêu đề"]
sau đó
nếu [$ 2 = "aboutdotcom"]
sau đó

nếu [$ 1 = "tất cả"]
sau đó
rsstail -d -l -u http://z.about.com/6/o/m/linux_p2.xml;
elif [$ 1 = "mô tả"]
sau đó
rsstail -d -u http://z.about.com/6/o/m/linux_p2.xml;

khác
rsstail -u http://z.about.com/6/o/m/linux_p2.xml;
fi
khác
nếu [$ 1 = "tất cả"]
sau đó
rsstail -d -l -u http://lxer.com/module/newswire/headlines.rss
elif [$ 1 = "mô tả"]
sau đó
rsstail -d -u http://lxer.com/module/newswire/headlines.rss
khác
rsstail -u http://z.about.com/6/o/m/linux_p2.xml;
fi
fi
fi
fi

Điều đầu tiên cần lưu ý là kịch bản hiện đang nhận được khá lớn và bạn có thể nhanh chóng thấy cách kiểm soát các câu lệnh IF lồng nhau ra khỏi tầm kiểm soát.

Bit quan trọng trong kịch bản lệnh này là câu lệnh IF || tuyên bố phần THEN trên dòng 2 và dòng 4.

|| là viết tắt của OR. Vì vậy, dòng nếu [$ 2 = "aboutdotcom"] || [$ 2 = "lxer"] kiểm tra xem tham số thứ 2 có bằng "aboutdotcom" hay "lxer" hay không. Nếu không thì câu lệnh IF hoàn tất vì không có câu lệnh nào khác cho IF ngoài cùng .

Tương tự trên dòng 4 dòng nếu [$ 1 = "tất cả"] || [$ 1 = "mô tả"] || [$ 1 = "title"] kiểm tra xem tham số 1 có bằng "all" hoặc "description" hay "title" hay không.

Bây giờ nếu người dùng chạy sh rssget.sh khoai tây pho mát không có gì được trả lại trong khi trước khi họ sẽ nhận được một danh sách các chức danh từ LXER.

Ngược lại || Là &&. Toán tử && là viết tắt của AND.

Tôi sẽ làm cho kịch bản trông giống như một cơn ác mộng nhưng nó làm cho tất cả các kiểm tra quan trọng để đảm bảo rằng người dùng đã cung cấp 2 thông số.

#! / bin / bash

nếu [$ # -eq 2]
sau đó

nếu [$ 2 = "aboutdotcom"] || [2 đô la = "lxer"]
sau đó
nếu [$ 1 = "tất cả"] || [$ 1 = "mô tả"] || [$ 1 = "tiêu đề"]
sau đó
nếu [$ 2 = "aboutdotcom"]
sau đó

nếu [$ 1 = "tất cả"]
sau đó
rsstail -d -l -u http://z.about.com/6/o/m/linux_p2.xml;
elif [$ 1 = "mô tả"]
sau đó
rsstail -d -u http://z.about.com/6/o/m/linux_p2.xml;

khác
rsstail -u http://z.about.com/6/o/m/linux_p2.xml;
fi
khác
nếu [$ 1 = "tất cả"]
sau đó
rsstail -d -l -u http://lxer.com/module/newswire/headlines.rss
elif [$ 1 = "mô tả"]
sau đó
rsstail -d -u http://lxer.com/module/newswire/headlines.rss
khác
rsstail -u http://z.about.com/6/o/m/linux_p2.xml;
fi
fi
fi
fi
fi

Bit duy nhất được thêm vào trong tập lệnh đó là một câu lệnh IF bên ngoài như sau: if [$ # -eq 2] . Nếu bạn đọc bài viết về các tham số đầu vào, bạn sẽ biết rằng $ # trả về số lượng các tham số đầu vào. The -eq là viết tắt của equals. Câu lệnh IF do đó kiểm tra rằng người dùng đã nhập 2 tham số và nếu họ không chỉ thoát ra mà không làm bất cứ điều gì. (Không đặc biệt thân thiện).

Tôi biết rằng hướng dẫn này đang nhận được khá lớn. Không có nhiều hơn để trang trải trong tuần này nhưng tôi muốn giúp dọn dẹp kịch bản trước khi chúng tôi kết thúc.

Lệnh cuối cùng mà bạn cần tìm hiểu về các câu lệnh có điều kiện là câu lệnh CASE.

#! / bin / bash


nếu [$ # -eq 2]
sau đó
trường hợp $ 2 trong
aboutdotcom)
trường hợp $ 1 trong
tất cả các)
rsstail -d -l -u z.about.com/6/o/m/linux_p2.xml
;;
sự miêu tả)
rsstail -d -u z.about.com/6/o/m/linux_p2.xml
;;
chức vụ)
rsstail -u z.about.com/6/o/m/linux.about.com/6/o/m/linux_p2.xml
;;
esac
;;
lxer)
trường hợp $ 1 trong
tất cả các)
rsstail -d -l -u http://lxer.com/module/newswire/headlines.rss
;;
sự miêu tả)
rsstail -d -u http://lxer.com/module/newswire/headlines.rss
;;
chức vụ)
rsstail -u http://lxer.com/module/newswire/headlines.rss
;;
esac
;;
esac
fi

Tuyên bố trường hợp là một cách viết đẹp hơn NẾU ELSE NẾU ELSE NẾU NẾU ELSE.

Ví dụ: logic này

NẾU trái cây = chuối
Thì đây
ELSE NẾU trái cây = cam
Thì đây
ELSE NẾU trái cây = nho
Thì đây
END IF

có thể được viết lại dưới dạng:

trường hợp trái cây trong
chuối)
làm cái này
;;
những quả cam)
làm cái này
;;
nho)
làm cái này
;;
esac

Về cơ bản mặt hàng đầu tiên sau vụ án là thứ bạn sẽ so sánh (tức là trái cây). Sau đó, mỗi mục trước dấu ngoặc là thứ bạn đang so sánh và nếu nó khớp với các dòng trước ;; sẽ được chạy. Một tuyên bố trường hợp được chấm dứt với esac ngược lại (trường hợp ngược lại).

Trong kịch bản lệnh rssget.sh, câu lệnh trường hợp loại bỏ một số tổ xấu xí mặc dù không thực sự cải thiện đủ.

Để thực sự cải thiện kịch bản, tôi cần giới thiệu bạn với các biến.

Nhìn vào đoạn mã sau:

#! / bin / bash

lxer = "lxer.com/module/newswire/headlines.rss"
aboutdotcom = "z.about.com/6/o/m/linux_p2.xml"
display = ""
url = ""

nếu [$ # -lt 2] || [$ # -gt 2]
sau đó
echo "usage: rssget.sh [tất cả | mô tả | tiêu đề] [aboutdotcom | lxer]";
lối thoát;
fi

trường hợp $ 1 trong
tất cả các)
display = "- d -l -u"
;;
sự miêu tả)
display = "- d -u"
;;
chức vụ)
display = "- u"
;;
esac

trường hợp $ 2 trong
aboutdotcom)
url = $ aboutdotcom;
;;
lxer)
url = $ lxer;
;;
esac
rsstail $ display $ url;

Một biến được định nghĩa bằng cách đặt tên cho nó và sau đó gán một giá trị cho nó. Trong ví dụ trên, sau đây là các phép gán biến:

lxer = "lxer.com/module/newswire/headlines.rss"
aboutdotcom = "z.about.com/6/o/m/linux_p2.xml"
display = ""
url = ""

Kịch bản có thể quản lý dễ dàng hơn bằng cách sử dụng các biến. Ví dụ, mỗi tham số được xử lý riêng biệt và do đó không có câu lệnh IF lồng nhau.

Biến hiển thị giờ được đặt tùy thuộc vào việc bạn chọn tất cả, mô tả hoặc tiêu đề và biến url được đặt thành giá trị của biến aboutdotcom hoặc giá trị của biến lxer tùy thuộc vào việc bạn đã chọn aboutdotcom hay lxer.

Lệnh rsstail bây giờ chỉ cần sử dụng giá trị của display và url để chạy đúng.

Trong khi các biến được thiết lập chỉ bằng cách đặt cho chúng một tên, để thực sự sử dụng chúng, bạn phải đặt một dấu $ ở phía trước chúng. Nói cách khác biến = giá trị đặt biến thành một giá trị trong khi biến $ có nghĩa là cung cấp cho tôi nội dung của biến.

Sau đây là kịch bản cuối cùng cho hướng dẫn này.

#! / bin / bash

lxer = "lxer.com/module/newswire/headlines.rss"
aboutdotcom = "z.about.com/6/o/m/linux_p2.xml"
dailylinuxuser = "http://feeds.feedburner.com/everydaylinuxuser/WLlg"
linuxtoday = "http://feedproxy.google.com/linuxtoday/linux"
usage = "usage: rssget.sh [tất cả | mô tả | tiêu đề] [lxer | aboutdotcom | dailylinuxuser | linuxtoday]"
display = ""
url = ""

nếu [$ # -lt 2] || [$ # -gt 2]
sau đó
echo $ usage;
lối thoát;
fi

trường hợp $ 1 trong
tất cả các)
display = "- d -l -u"
;;
sự miêu tả)
display = "- d -u"
;;
chức vụ)
display = "- u"
;;
*)
echo $ usage;
lối thoát;
;;
esac

trường hợp $ 2 trong
aboutdotcom)
url = $ aboutdotcom;
;;
lxer)
url = $ lxer;
;;
linuxtoday)
url = $ linuxtoday;
;;
dailylinuxuser)
url = $ dailylinuxuser;
;;
*)
echo $ usage;
lối thoát;
esac

rsstail $ display $ url;

Kịch bản trên giới thiệu nhiều nguồn cấp dữ liệu RSS hơn và có một biến sử dụng cho người dùng biết cách sử dụng tập lệnh nếu họ không nhập 2 biến hoặc họ nhập các tùy chọn không chính xác cho các biến.

Tóm lược

Đây là một bài báo sử thi và có thể đã đi quá sớm quá. Trong hướng dẫn tiếp theo, tôi sẽ cho bạn thấy tất cả các tùy chọn so sánh cho các câu lệnh IF và vẫn còn nhiều điều nữa để nói về các biến.

Ngoài ra còn có nhiều điều có thể được thực hiện để cải thiện kịch bản trên và điều này sẽ được đề cập trong các hướng dẫn trong tương lai khi chúng tôi khám phá các vòng lặp, grep và các biểu thức chính quy.

Xem phần Cách thực hiện (Cuộn xuống các mục để xem danh sách bài viết) của l inux.about.com để tìm các hướng dẫn hữu ích khác từ khởi động kép Windows và Ubuntu để thiết lập một máy ảo bằng cách sử dụng các hộp GNOME .