Câu hỏi Làm cách nào để kiểm tra số trường được cung cấp cho lệnh `read`?


Tôi có một câu hỏi nhanh liên quan đến $# trong các kịch bản lệnh shell.

Vì vậy, tôi có thể sử dụng $# tại dòng lệnh để kiểm tra số lượng đối số tập lệnh shell do người dùng đưa ra.

Thí dụ:

#  ./shellScript varONE varTWO
#  $#
>  2  <--  so output 2 here reflects varONE and varTWO

Có bất kỳ lệnh nào tôi có thể sử dụng cho read chỉ huy?

Ví dụ:

#!/bin/bash
read -p "please input value" var1 var2
echo $#  <--  however here will return 0 even user input two values at command line

Có lệnh nào khác tôi có thể sử dụng ở đây để trả về 2 để tôi có thể thực hiện kiểm tra biến đầu vào của người dùng không? Như:

[ $# -lt 2 ] && echo "failed"

4
2018-04-21 18:05


gốc


Có bất kỳ câu trả lời nào hữu ích không? - jobin


Các câu trả lời:


Cách tốt nhất để kiểm tra xem bạn có nhận được một giá trị trong varTWO là kiểm tra xem varTWO trống như sau:

read varONE varTWO
if [[ $varTWO = '' ]]; then
    echo "failed"
fi

4
2018-04-21 18:14



WOW, CẢM ƠN BẠN RẤT NHIỀU!!!! - user195661
không phải là lần kiểm tra đầu tiên nếu lỗi thời? (làm thế nào có thể varone được '' nếu varTWO không?) - Rinzwind
@Rinzwind: varONE có thể là '' khi không có đối số nào được cung cấp và varTWO có thể là '' khi chỉ có một đối số được cung cấp. - jobin
@Rinzwind: Ồ vâng, không chắc tôi đang nghĩ gì khi tôi viết kịch bản này: / - jobin


Biến Shell đặc biệt $# trả về số lượng các đối số vị trí được đưa ra cho việc gọi trình bao này.

nếu bạn muốn các đối số được truyền cho kịch bản chính xác là 2:

if [ $# -ne 2 ]; then
    echo "failed" 
fi

#check if args are correct here...

0
2018-04-21 18:41



Làm thế nào để trả lời câu hỏi này? - jobin
kiểm tra xem số lượng đối số, không cần kiểm tra xem chúng có bị vô hiệu hay không. chuyển đối số là vị trí, vì vậy nếu bạn có 2 là nhất thiết phải hợp lệ. - girardengo


Câu trả lời ngắn gọn là bạn không thể. Bạn cần phải nói read bao nhiêu đối số nó sẽ mong đợi, nó sẽ chỉ đọc nhiều như bạn nói với nó. Nếu bạn chỉ cho một tên biến, nó sẽ đọc mọi điều vào biến đó. Nếu bạn cho nó nhiều hơn một, ví dụ 3, nó sẽ đọc tất cả mọi thứ cho đến khi không gian đầu tiên (hoặc tab, hoặc newline hoặc bất cứ điều gì khác mà bạn đã đặt $IFS) vào ngày 1, mọi thứ tiếp theo vào phần thứ hai và phần còn lại của dòng vào phần thứ ba. Để minh họa:

$ cat file
one two three four five
$ while read line; do echo "$line"; done < file
one two three four five
$ while read first second rest; do echo "First: $first, Second:$second Rest:$rest"; done < file
First: one, Second:two Rest:three four five

Vì thế, read sẽ đọc nhiều biến số như bạn đưa ra. Nếu bạn có thể có độ dài đầu vào biến đổi, bạn sẽ cần phải kiểm tra từng đầu vào để tìm ra số lượng đã được chuyển như được giải thích trong @ Jobim's câu trả lờihoặc bạn có thể sử dụng mảng.

Như đã giải thích trong help read:

Tùy chọn:

-một mảng gán các từ được đọc cho các chỉ mục tuần tự của mảng               biến ARRAY, bắt đầu từ số không

Điều này có nghĩa rằng bạn có thể lưu trữ các giá trị đầu vào trong một mảng và sau đó nhận được chiều dài của mảng với ${#ArrayName[@]}:

#!/usr/bin/env bash

read -a values -p "please input values: " 
echo "You gave ${#values[@]} value(s)"

0
2018-04-23 01:03