在以下bash 语句中,-a和-n选项执行了哪些功能if?
if [ -n "$1" -a -n "$2" -a -n "$3" ]; then
REFNAME=$(basename $3)
else
Run Code Online (Sandbox Code Playgroud)
是-a和-n所谓的初选?
是否-a file意味着"如果文件存在则为真."?
Cor*_*ein 96
-a将两个表达式链接在一起"和"或"&&"表达式中.不推荐使用此选项.
-n 检查字符串的长度是否为非零.
您可以将测试表达式转换为以下伪代码:
if ( ($1 has nonzero length) and
($2 has nonzero length) and
($3 has nonzero length) )
Run Code Online (Sandbox Code Playgroud)
该表达式中没有检查文件是否存在,只检查是否已将参数提供给脚本.
这些参数-a和-n可以在联机帮助页中找到test
man test
Run Code Online (Sandbox Code Playgroud)
操作员[ ... ]通常用作简写,test ...并且可能在您的系统上具有相同的功能.
Sor*_*gal 33
开关-a和-n是不是严格意义上的一部分,bash if在该声明if命令不会处理这些开关.
我把它们称为"开关",但是bash你链接到的文档引用了与"primaries"相同的东西(可能是因为这是讨论布尔表达式部分时常用的术语).
在sh脚本中if是一个命令,它以命令作为参数,执行它并测试其返回码.如果返回代码是0以下代码块,then则执行直至关闭fi或(如果提供)以下内容else.如果返回代码不是,0并且提供了else语句,else则执行以下代码块直到结束fi.
您可以通过传递if命令true或命令来查看此效果,这些命令或命令false是无效0且0分别返回和返回的简单命令.
if true ; then echo true was true ; else echo true was false ; fi
if false ; then echo false was true ; else echo false was false ; fi
Run Code Online (Sandbox Code Playgroud)
在示例代码你提供你传递到命令if就是[,其有时也被称为test.这个命令接受你询问的开关.在bash该test命令将是一个内置的命令; 尝试type [学习它的类型.对于内置命令help将显示用法,因此也可以运行help [以查看文档.您的系统可能还有a /bin/[和a /bin/test,如果man test您可以看到这些手册.虽然内置的行为test可能与手册页中记录的行为不同,这可能比您将从中获得的简单描述更加冗长help [,但它可能会[相当准确地描述内置命令的行为..
知道您正在运行的命令是test我们可以查阅help test或man test阅读其用法.这将显示-n测试以下参数,如果它不是空字符串,则计算结果为true.
在test你的文档中你也会看到一个开关-e.此开关测试以下参数,如果该参数是存在的文件或目录,则计算结果为true.更有用的是,-f如果存在以下参数并且是常规文件(与目录或块设备相反,或者其他),则开关计算结果为true.
您混淆的根源可能是两种形式-a:一元和二元.当-a在一元上下文中使用时,即使用一个后面的参数但没有前面的参数,它将其参数视为文件并测试其存在,就像-e切换一样.但是,当-a在二进制上下文中使用时,即在它之前有一个参数,在它之后有一个参数,它将其参数视为其他条件并充当布尔AND运算符.
为了便于携带,重要的是要注意,一元-a是非标准的扩展,在POSIX中找不到.它是可用的bash和ksh,但是,这样使用可能是普遍的.
cd /tmp
if [ -a test-file ] ; then
echo 1: test-file exists
else
echo 1: test-file missing
fi
touch test-file
if [ -a test-file ] ; then
echo 2: test-file exists
else
echo 2: test-file missing
fi
var=somerthing
if [ -n "$var" -a -a test-file ] ; then
echo variable var is not empty and test-file exists
fi
rm -f test-file
Run Code Online (Sandbox Code Playgroud)