Kiểm tra xem tập lệnh bash có chính xác hai đối số là thư mục không


8

Tôi đang viết một tập lệnh bash so sánh hai thư mục, nhưng tôi không chắc cách kiểm tra các điều kiện

Ví dụ: nếu người dùng nhập 1 arg thay vì 2 (chúng tôi cần 2 vì chúng tôi đang so sánh hai thư mục), thì nó sẽ báo lỗi. Nếu cả hai đối số là hợp lệ, so sánh các thư mục và đầu ra với một tệp.


1
Chào mừng đến với trang web! Vui lòng dành chút thời gian và đọc qua trung tâm trợ giúp của chúng tôi để hiểu cách trang web hoạt động. Bây giờ bạn đã hỏi 6 câu hỏi và chưa chấp nhận một câu trả lời, không có câu trả lời nào bạn nhận được trả lời câu hỏi của bạn?
terdon

Câu trả lời:


8

Xử lý đối số

Xử lý các đối số được truyền qua dòng lệnh của tập lệnh đơn giản như sau. Nói rằng chúng tôi đã có kịch bản này:

$ cat cmd.bash 
#!/bin/bash

echo "arg1: $1"
echo "arg2: $2"

Bây giờ chạy không có đối số:

$ ./cmd.bash 
arg1: 
arg2: 

Với 1 đối số:

$ ./cmd.bash hi
arg1: hi
arg2: 

Với 2 đối số:

$ ./cmd.bash hi bye
arg1: hi
arg2: bye

Kiểm tra các đối số

Sau đó, bạn có thể kiểm tra xem các đối số, 1 & 2, có phải là thư mục hợp lệ hay không, sau đó bảo lãnh hoặc tiếp tục khi cần thiết. Vì vậy, chúng tôi giới thiệu 2 kiểm tra để xem 2 đối số có phải là thư mục hay không, nếu không thì thoát.

$ cat cmd.bash
#!/bin/bash

[ -d "$1" ] || exit
[ -d "$2" ] || exit
[ $# == 2 ] || exit

echo "arg1: $1"
echo "arg2: $2"

Thí dụ

Nói rằng chúng tôi có những thư mục này.

$ mkdir d1 d2

$ ls -l
total 12
-rwxrwxr-x. 1 saml saml   89 Oct 14 23:13 cmd.bash
drwxrwxr-x. 2 saml saml 4096 Oct 14 23:14 d1
drwxrwxr-x. 2 saml saml 4096 Oct 14 23:14 d2

Nếu chúng ta được cung cấp bất cứ thứ gì ngoài 2 thư mục, tập lệnh sẽ thoát ra.

$ ./cmd.bash hi bye

Nếu chúng tôi đưa ra 2 thư mục:

$ ./cmd.bash d1 d2
arg1: d1
arg2: d2

Nếu chúng tôi đưa ra nhiều hơn 2 đối số:

$ ./cmd.bash d1 d2 d3

Tôi sẽ để lại sự so sánh của 2 thư mục với bạn. Để học Bash, tôi sẽ hướng dẫn bạn đến liên kết dưới đây để có một cuốn sách trực tuyến miễn phí về Bash.

Người giới thiệu


cảm ơn bạn đã giải thích, nhưng nếu bạn nhập một đối số thứ 3, nó vẫn in arg 1 và arg 2. Tôi muốn viết một kịch bản mạnh mẽ để kiểm tra tất cả các kịch bản có thể xảy ra ...
asura

@asura - xem cập nhật, thêm kiểm tra số lượng đối số.
slm

@asura - nếu những người bạn đã nhận được giải quyết vấn đề của bạn, hãy nhớ dành một chút thời gian và nhấp vào dấu kiểm bên cạnh họ để những người khác biết Q của bạn đã được giải quyết.
slm

Tôi đã thêm [$ # == 2] || thoát ra và nó dường như không hoạt động. Nó có nghĩa là gì? Nếu # của arg là 2, thoát? Ngoài ra tôi cần kiểm tra nhiều thứ hơn và tôi chỉ có thể tưởng tượng bằng cách sử dụng nhiều "nếu" để làm điều này ... ví dụ: 1, nếu arg không chính xác là 2 -> đưa ra lỗi và thoát. 2, nếu 2 arg nhưng một hoặc cả hai không hợp lệ -> lỗi và thoát. 3, Nếu cả hai, thoát. 4, nếu 2 arg hợp lệ -> so sánh nội dung của các thư mục và xuất ra một tệp.
asura

1
@asura - cũng xin vui lòng không thay đổi giữa dòng của Q. Nếu bạn có một mục tiêu khác trong đầu, thì đó phải là Q. Như bạn đã trả lời, tôi đã chỉ cho bạn 1 cách để thực hiện (cách của người mới). Có nhiều phương pháp hiệu quả hơn nhưng được đưa ra Q thô sơ của bạn Tôi đã chỉ cho bạn một A.
slm

7

Số lượng đối số là trong tham số$# .

if [ $# -ne 2 ]; then
  echo 1>&2 "Usage: $0 DIRECTORY1 DIRECTORY2"
  exit 3
fi

Nếu bạn muốn thực thi rằng các đối số là cả hai thư mục (trái ngược với các loại tệp khác), hãy kiểm tra chúng với -d.

Tiện ích diffso sánh hai tập tin. Với tùy chọn -r, nó so sánh các thư mục đệ quy.

diff -ru -- "$1" "$2"
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.