代码:
#!/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"
A
foo
bar
"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
参数是操作数而不是运算符。