UNIX - 为什么$#包含命令(因此总是> = 1)?

use*_*234 1 unix bash arguments

由于$#似乎没有在搜索引擎上正常运行,因此很难在此搜索答案.我很好奇为什么argv通常包含命令名称本身,而$#不是.

为了更清楚,如果我有一个名为testing.sh的脚本

#!/bin/bash
echo $#
Run Code Online (Sandbox Code Playgroud)

./testing.sh返回0而不是1.为什么?

che*_*ner 5

bash遵循POSIX规范$#:

扩展为位置参数的十进制数.命令名(参数0)不应计入'#'给出的数字,因为它是一个特殊参数,而不是位置参数.

shell的参数接口与C语言完全不同.在bash方面,你可以定义

argv=( "$0" "$@")
argc=${#argv[@]}
Run Code Online (Sandbox Code Playgroud)

因为shell(明智地)将命令名与命令的参数分开.