我正在尝试检查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
答案 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" ]
。