位置参数不起作用 - 无法访问 $1、$2 等

位置参数不起作用 - 无法访问 $1、$2 等

我正在努力掌握位置参数。似乎什么都不起作用,然后我决定用 echo 做一些小事情来看看它是否真的起作用,但事实并非如此。有人能解释一下为什么吗? (我将在这里省略 shebang 行和评论,直入主题)

if [[ -e $1 ]]; then
    echo $#
    echo $1
fi

当我输入脚本名称并后跟一个或多个参数时,它不会返回任何内容。然而,下面的内容正如预期的那样返回了一切。我真的很不知所措。

if [[ -e $0 ]]; then
    echo $#
    echo $1
fi

为什么除了 $0 之外的参数无法识别?

答案1

Bash 的手册页:

CONDITIONAL EXPRESSIONS
    Conditional expressions are used by the [[ compound command
    and the test and [ builtin commands to test file attributes
    and perform string and arithmetic comparisons.

       -e file
              True if file exists.

因此,如果您传递一个与现有文件不匹配的字符串作为第一个参数,则将[[ -e $1 ]]为 false。

然而,由于$0通常包含 shell 或脚本的名称,因此[[ -e $0 ]]更有可能是真实的。

(但并非在所有情况下。交互式 shell 可以作为登录 shell 启动,并带有前导破折号$0(例如-/bin/bash),并且类似的内容/bin/sh -c '...' foo bar也设置$0foo,您可以在其中放置任何您想要的内容。)


您可能想要的测试是-n

   string
   -n string
          True if the length of string is non-zero.

所以,[[ -n $1 ]]或者只是[[ $1 ]]

相关内容