如何检查给予“读取”命令的字段数量?

如何检查给予“读取”命令的字段数量?

$#我有一个与 shell 脚本相关的简单问题。

因此,我可以$#在命令行中使用它来检查用户给出的 shell 脚本参数的数量。

例子:

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

我可以使用任何命令来read执行命令吗?

例如:

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

我可以使用其他命令来返回 2 吗?这样我就可以检查用户的输入变量?例如:

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

答案1

检查是否已收到值的最佳方法varTWO是检查是否varTWO为空,如下所示:

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

答案2

特殊 Shell 变量$#返回给予此 shell 调用的位置参数的数量。

如果您希望传递给脚本的参数恰好是 2 个:

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

#check if args are correct here...

答案3

简短的回答是你不能。你需要告诉read它应该有多少个参数,它只会读取你告诉它的数量。如果你只给它一个变量名,它就会读取一切到该变量中。如果您为其指定多个,例如 3,它将把直到第一个空格(或制表符、换行符或您在 中设置的任何其他内容$IFS)的所有内容读入第一个变量,将下一个空格之前的所有内容读入第二个变量,并将该行的其余部分读入第三个变量。举例说明:

$ 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

因此,read它将读取您提供的尽可能多的变量。如果您可以使用可变长度的输入,则需要测试每个变量以找出传递了多少个变量,如@Jobim 的回答,或者也可以使用数组。

详见help read

选项:

-a 数组将读取的字分配给数组变量 ARRAY 的连续索引,从零开始

这意味着您可以将输入值存储在数组中,然后使用以下命令获取数组的长度${#ArrayName[@]}

#!/usr/bin/env bash

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

相关内容