将命令行参数与字符串进行比较

JA3*_*A3N 30 unix bash

这是我的代码:

#!/bin/bash
if [ "$#" -ne 2 ] ; then
        echo "$0: exactly 2 arguments expected"
        exit 3
fi

if [$1 != "file" -a $1 != 'dir'] ; then
        echo "$0: first argument must be string "file" or "dir""
        exit 1
elif [-e $2 -a -r $2]; then
        if ["$1" = "file" -a -f $2] ; then
                echo YES
        elif ["$1" = "dir" -a -d $2] ; then
                echo YES
        else
                echo NO
        fi
        exit 0
else
        echo "$0: $2 is not a readable entry"
        exit 2
fi
Run Code Online (Sandbox Code Playgroud)

如果我运行./lab4 file filename1它将检查第一个参数是字符串"file"还是"dir"然后如果第一个参数是"file"并且filename1是文件,它将打印是.对于dir来说也是如此.

它不承认$1$2.代码将输出:

./lab04Q2: line 7: [file: command not found
./lab04Q2: line 10: [-e: command not found
Run Code Online (Sandbox Code Playgroud)

即使我在运行程序时输入了2个参数.

Ste*_*uan 53

在bash中尝试以下3行:

if [ "a" == "a" ]; then echo hi; fi
if ["a" == "a" ]; then echo hi; fi
if ["a" == "a"]; then echo hi; fi
Run Code Online (Sandbox Code Playgroud)

你会看到只有第一个有效,而另外两个没有.也就是说,你的缺乏空间是你的表达不起作用的原因.

上面的示例还建议您可以直接在bash提示符下测试bash语法.您可以在将它们合并到脚本中之前将其正确运行.


Sie*_*geX 23

问题来自于实际上[是命令的事实.实际上它是test命令的别名.为了使其正常运行,您需要在[as 之后添加一个空格:

if [ $1 != "file" -a $1 != 'dir' ] ;
Run Code Online (Sandbox Code Playgroud)

对所有[没有空格的实例执行此操作.

PS

由于你使用的bash是你的翻译,我强烈建议你使用[[ ]]而不是[ ]你的测试,因为前者比后者更有能力而没有缺点; 不需要空间就是其中之一

  • @JansonChung `[[ ]]` 允许更多类似 C 的语法,因此您实际上可以执行 `if [[$1 != "file" && $1 != "dir"]]; 然后……` (2认同)