$#
我有一个与 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)"