【发布时间】:2011-05-24 07:47:48
【问题描述】:
如何找到传递给 Bash 脚本的参数数量?
这是我目前拥有的:
#!/bin/bash
i=0
for var in "$@"
do
i=i+1
done
还有其他(更好的)方法吗?
【问题讨论】:
-
如果存在任何参数,该代码将简单地将文字字符串
i+1存储在变量i中。
如何找到传递给 Bash 脚本的参数数量?
这是我目前拥有的:
#!/bin/bash
i=0
for var in "$@"
do
i=i+1
done
还有其他(更好的)方法吗?
【问题讨论】:
i+1 存储在变量 i 中。
下面是简单的-
cat countvariable.sh
echo "$@" | awk '{print NF}'
输出:
#./countvariable.sh 1 2 3 4 5 6
6
#./countvariable.sh 1 2 3 4 5 6 apple orange
8
【讨论】:
echo "$@" | awk '{print NF}'
添加原始引用:
您可以从特殊参数$# 中获取参数的数量。值 0 表示“无参数”。 $# 是只读的。
当与 shift 一起用于参数处理时,每次执行 Bash Builtin shift 时都会递减特殊参数 $#。
参见3.4.2 Special Parameters部分中的Bash Reference Manual:
"shell对几个参数有特殊处理。这些参数只能被引用"
并在本节中为关键字$#“扩展为十进制位置参数的数量。”
【讨论】:
该值包含在变量$#中
【讨论】:
$#
#!/bin/bash
echo "The number of arguments is: $#"
a=${@}
echo "The total length of all arguments is: ${#a}: "
count=0
for var in "$@"
do
echo "The length of argument '$var' is: ${#var}"
(( count++ ))
(( accum += ${#var} ))
done
echo "The counted number of arguments is: $count"
echo "The accumulated length of all arguments is: $accum"
【讨论】:
bc 或其他东西(ksh93 和 zsh 也可以进行十进制数学运算)。您的代码包含一些变量的美元符号,但不包含其他变量。您应该对是否使用它们保持一致。在(()) 内部,它们不是必需的。但是,它们位于 echo 语句中。
参数个数是$#
在此页面上搜索以了解更多信息: http://tldp.org/LDP/abs/html/internalvariables.html#ARGLIST
【讨论】:
argc 不同,如果没有传递给脚本的参数,$# 将是 0,如果有一个参数,则 1 等等。
shift参数远离它的数组,$#也会被减1。它总是代表$@的长度,这很方便。