Làm thế nào để phát hiện nếu đầu vào là từ đối số, tệp hoặc thiết bị đầu cuối


8

Trong bash, có một cách để biết nếu một tập lệnh đã cho đã được gọi với:

$ myscript.sh myfile

hoặc là:

$ myscript.sh < myfile

Bên trong một số kịch bản tôi luôn luôn đã truy cập các nội dung của myfilebằng $1, nhưng bây giờ tôi muốn thay đổi hành vi như trường hợp khác nhau.

EDIT: Tôi cũng muốn trường hợp thứ ba khi được gọi mà không có bất kỳ chuyển hướng nào:

$ myscript.sh

Câu trả lời:


13

EDIT : đã thay đổi -tthành -t 0, phát hiện chính xác đầu vào từ thiết bị đầu cuối hoặc tệp.

Tôi nghĩ rằng chìa khóa ở đây là biết liệu đầu vào của bạn đến từ một thiết bị đầu cuối hoặc từ một tập tin. Có một bài kiểm tra cho điều này ( man test, xem -t).

Giả sử bạn đang chạy tập lệnh bash:

if [ -t 0 ]; then
    echo "Input from terminal"
    if [ $# -eq 0 ]; then
        echo "No input files specified on command line.  Error." >&2
    else
        echo "Input file given on command line.  It is $1"
    fi
else
    echo "Input coming from stdin"
fi

Bạn có thể xử lý các tình huống khác nhau bằng cách thay thế mã thực tế cho các câu lệnh echo ở trên.

Cập nhật, kịch bản kiểm tra quickie:

#!/bin/bash
[ -t 0 ] && echo "t is true" || echo "t is false"

Đang chạy:

$ test.sh testfile
t is true
$ test.sh < testfile
t is false
$

-t luôn luôn đánh giá đúng khi chạy tập lệnh từ dòng lệnh với < myfile:(
mschonaker

@mschonaker - Sử dụng -t 0cho kết quả chính xác. Cập nhật câu trả lời.
unpythonic

@MarkMann Làm gì 0? Sự khác biệt là gì? Nó không có trong tài liệu.
Ivan V.

1
@IvanV. - Số không là mô tả tập tin để kiểm tra. Đầu vào tiêu chuẩn được liên kết với 0, đầu ra tiêu chuẩn với 1và lỗi tiêu chuẩn với 2. Nếu tôi muốn kiểm tra xem đầu ra của tôi có đến một thiết bị đầu cuối không thì tôi sẽ sử dụng[ -t 1 ]
unpythonic

@MarkMann Cảm ơn, tôi nghĩ rằng nó có thể là như vậy, hoặc một loại kiểm tra Boolean.
Ivan V.

6

Nói chung, các biểu thức $1, $2v.v. mở rộng thành đối số 1, 2, v.v. được đưa ra trên dòng lệnh script.

Vì vậy, khi bạn gọi một kịch bản là:

myscript.sh myfile

sau đó $1trong kịch bản mở rộng để myfile(và $2, $3vv tất cả là chuỗi rỗng).

Khi bạn gọi một tập lệnh là:

myscript < myfile

việc chuyển hướng STDIN từ myfileđược thực hiện bởi shell cha, do đó tập lệnh thực sự được gọi mà không có đối số và $1mở rộng thành chuỗi rỗng.


Làm cách nào để phát hiện nếu được gọi không có đối số trong dòng lệnh (trường hợp thứ ba)? Xin lỗi nếu bạn trả lời trước khi chỉnh sửa của tôi. Cảm ơn.
mschonaker
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.