如何在shell中使用多个决策语句?

时间:2017-10-17 13:01:23

标签: shell unix

我正在尝试检查shell脚本中是否存在多个文件,但我不确定它是如何工作的。

我试过了

#!/bin/bash
path=/home/test
        cd $path
        if [ -f "a.txt"] || [ -f "b.txt" ] || [ -f "c.txt" ] || [-f "d.txt"]
        then
                echo "one of the file exist"
        else
                echo "non of the file exist"
        fi

我正在

line 4: [: missing ']'

我看到人们使用双括号但这只适用于bash而不是POSIX

3 个答案:

答案 0 :(得分:2)

如果您停止尝试使用拼写[,这一点就更明显了。只需写下:

if test -f "a.txt" || test -f "b.txt" || test -f "c.txt" || test -f "d.txt"; then ...

或,(这是过时的用法,不应该使用。感谢@chepner指出这一点),你可以这样做:

if test -f a.txt -o -f b.txt -o -f c.txt -o -f d.txt; then ...

另外,如果你愿意相信shell的变幻莫测(也就是说,即使标准指定set -f将导致shell禁用路径名扩展,我也不会相信每个shell都是表现得如预期的那样),你可以这样做:

set +f; if ! test [abcd].txt = '[abcd].txt' 2> /dev/null; then ...

答案 1 :(得分:1)

您必须在引号和右括号之间以及左括号和参数之间键入空格。正确的语法是:

if [ -f "a.txt" ] || [ -f "b.txt" ] || [ -f "c.txt" ] || [ -f "d.txt" ]

if [ -f "a.txt"] || [ -f "b.txt" ] || [ -f "c.txt" ] || [-f "d.txt"]

答案 2 :(得分:1)

问题是在[ -f "a.txt"]中,结束方括号被视为字符串的一部分,即[ -f "a.txt]",因此您需要在结束方括号前添加空格:[ -f "a.txt" ]

与左括号相同。 [-f "d.txt"]将被解析为"[-f" "d.txt]",因此您必须在开头之后和结束方括号之前添加空格:[ -f "d.txt" ]