如何解释以下脚本?

如何解释以下脚本?

代码:

#!/bin/csh

if ( A$1 == A ) then
    echo ""
    echo "LIST <name>"
    echo ""
    exit
endif

..............

好的,这是我得到的一个更大脚本的示例。脚本以这段代码开始,与后面的任何代码无关。

脚本用法如下:LIST 'name',其中LIST是脚本命令,'name'是用户引入的某个常量。

到目前为止我所知道的是,如果我像这样运行脚本:

LIST 'name'

该脚本将使用常量完成它的工作,但如果我不这样'name' 运行:'name'

LIST

它将显示:

LIST <name>

比如关于如何使用该命令的简短描述。这个描述来自if里面的echo。

我需要了解的是这一行的作用:

if ( A$1 == A ) then

谢谢!

答案1

这确保$1不是空字符串。如果$1是空字符串,那么if条件是:

( A == A )

评估为真。这是确保没有语法错误的解决方法。如果你只是这样做:

if ( $1 == "" )

$1为空字符串时,该表达式将( == "" )导致语法错误。

至少在bsd-csh, tcsh,( $1 == "" )作品中。对于 Original csh,您应该使用:

if ( "A$1" == "A" )

请注意,您应该始终用双引号引用变量,请参阅解释这里。在 中csh,如果变量$a包含换行符,则"$a"不起作用,您需要$a:q.

答案2

此行检查是否$1为空。$1是用户在命令行上运行脚本时传递给脚本的第一个参数。如果$1为空,则不会在字母后附加任何内容A,因此A == A为真。

答案3

我相信if循环是用来测试参数是否传递给脚本的一种方法。虽然从技术上讲这是循环的目的if,但我认为更合适的说法是它用于检查是否为$1空。例如,我复制了脚本并将其调用为:

script "some_argument"

正如预期的那样,它不会进入if循环。现在,如果我在没有任何参数的情况下调用它,

script

我得到的输出为,LIST <name>

因此,我echo在 if 循环之前添加了一条语句来检查传递给脚本的参数。因此,如果我在没有任何参数的情况下调用脚本,它将进入if循环内部。

另外,A$1 == A只是测试 $1 是否为空。即使您有类似的内容,somethingvalid$1 == somethingvalid并将脚本调用为script,它仍然会进入if循环并打印输出。

答案4

Gnouc 提出了一个重要的观点,但没有强调它:每当您引用 shell 变量(例如,)或位置参数(例如,)时,您应该将其用双引号括起来(例如,),除非您有充分的理由不这样做你非常确定你知道自己在做什么。没有特殊字符(例如, 、 或 )的常量字符串不需要加引号,但这也没什么坏处。引用的字符串可以连接和组合;例如,等价于,等价于, 因此。$identifier$futur$digit$1"$1"Afoobar"foo""bar""foobar"A"$1""A""$1""A$1"

  • 引号保留空字符串的存在。正如 Gnouc 所解释的,如果你的脚本说

    if ( $1 == "" )
    

    并且你不带参数地调用它,

    LIST
    

    或者使用显式的空字符串参数,

    LIST ""
    

    那么该if语句将被“扩展”为

    if ( == "" )
    

    这会导致语法错误。

  • 引号保留带有空格或特殊字符的字符串的完整性。如果您使用包含空格的参数调用脚本,

    LIST "foo bar"
    

    那么if语句 ( if ( A$1 == A )) 将展开为

    if ( Afoo bar == A )
    

    这会导致语法错误。如果您使用包含带引号的通配符的参数调用脚本,则会出现类似的结果:

    LIST "foo*"
    

但没有人解释为什么剧本不只是说

if ( "$1" == "" )

在以前的版本中csh,如果您使用以下命令调用脚本争论,

LIST ==

那么该if语句将扩展为

if ( "==" == "" )

这也导致了语法错误。人们在编写if语句时会保护位置参数(以及适当时的 shell 变量/环境变量),例如A$1"A$1",以防止参数(操作数)看起来像运营商 (特别是/+-*)并导致解析器感到困惑。这似乎已被修复(至少在csh/的某些版本中tcsh)。我刚刚在我的(Cygwin)版本中尝试过这个tcsh

$ if ( == == "" ) echo 是
if:表达式语法。
$ if ( == == == ) echo 是
if:表达式语法。
$ if ( "==" == "" ) echo 是
                                <---(无输出)
$ if ( "==" == "==" ) echo 是
是的
$ if ( / == / ) echo 是
除以 0。
$ if ( "/" == "/" ) echo 是
是的

所以,

  • 引号可以告诉if命令,tcsh参数是操作数而不是运算符。

相关内容