Linux 使用ls-f过滤输出文件
我正在尝试编写一个bash脚本来检查文件是否有效。 这是我正在使用的代码Linux 使用ls-f过滤输出文件,linux,bash,Linux,Bash,我正在尝试编写一个bash脚本来检查文件是否有效。 这是我正在使用的代码 echo "Select your file" read $TEST_FILE for file in `ls $TEST_FILE`; do if [ -f $TEST_FILE ]; then echo "$TEST_FILE is a regular file" fi done 但我得到的结果是这样的 is a regular file is a regular file
echo "Select your file"
read $TEST_FILE
for file in `ls $TEST_FILE`; do
if [ -f $TEST_FILE ]; then
echo "$TEST_FILE is a regular file"
fi
done
但我得到的结果是这样的
is a regular file
is a regular file
is a regular file
is a regular file
is a regular file
它列出了目录中的所有文件,而我只指定了一个特定的文件。我希望它能够吐出一个结果,只为该1文件
我该怎么做
谢谢 如果您只想检查一个文件,下面应该可以:
test -f <the-file-path> && echo "regular file"
如果您只想检查一个文件,请使用以下选项:
test -f <the-file-path> && echo "regular file"
首先,您在
读取时错误地使用了变量-不要使用$
-您仅在引用变量的现有值时使用$
,而不是在赋值时使用;相反:
echo "Select your file"
read TEST_FILE
如果假设$TEST\u FILE
是一个单一的文本文件名,那么您根本不需要for
循环:
if [[ -f $TEST_FILE ]]; then
echo "$TEST_FILE is a regular file"
fi
如果假定$TEST
是一个文件名模式,请执行以下操作:
for f in $TEST_FILE; do
if [[ -f $f ]]; then
echo "$f is a regular file"
fi
done
请注意,我在测试中使用的是更健壮、更灵活的[…]
结构,而不是[…]
结构
事后思考
OP提到了ls
的-f
标志,这会导致(可能取决于文件系统)未排序的输出,其中还包括以
开头的条目
相比之下,带有glob(文件名模式)的for
循环总是扩展到已排序的条目(据我观察)。
此外,要使全局匹配以
开头的条目,必须设置dotglob
shell选项(shopt-s dotglob
)。首先,您在读取时错误地使用了变量-不要使用$
-在引用变量的现有值时只使用$
,不在赋值时;相反:
echo "Select your file"
read TEST_FILE
如果假设$TEST\u FILE
是一个单一的文本文件名,那么您根本不需要for
循环:
if [[ -f $TEST_FILE ]]; then
echo "$TEST_FILE is a regular file"
fi
如果假定$TEST
是一个文件名模式,请执行以下操作:
for f in $TEST_FILE; do
if [[ -f $f ]]; then
echo "$f is a regular file"
fi
done
请注意,我在测试中使用的是更健壮、更灵活的[…]
结构,而不是[…]
结构
事后思考
OP提到了ls
的-f
标志,这会导致(可能取决于文件系统)未排序的输出,其中还包括以
开头的条目
相比之下,带有glob(文件名模式)的for
循环总是扩展到已排序的条目(据我观察)。
另外,为了使glob匹配以
开头的条目,必须设置dotlob
shell选项(shopt-s dotlob
)。为什么要将该用于循环?最初,我想先列出目录中的所有文件。如果删除for循环,那么如何将ls-f放入If语句中?为什么要使用for
loop?最初,我想先列出目录中的所有文件。如果我删除for循环,那么如何将ls-f放入If语句中呢?感谢您在阅读后指出$。根据你为两者提供的代码,它不会发出回声。。当我插入要读取的绝对路径时,脚本刚刚结束。@user233699:不客气;请也看看我刚才补充的想法。如果我的答案解决了您的问题,请单击它旁边的复选标记;如果它至少包含有用的信息,请单击向上箭头向上投票。这将帮助其他人更快地找到有用的信息(并提高我的声誉)。要在这个好答案中添加“为什么”元素,请注意read$TEST_FILE
将展开TEST_FILE
,并使用该值作为要设置的变量的名称。由于未设置TEST_FILE
,因此read
没有参数,因此使用默认变量REPLY
。由于TEST_FILE
本身继续处于未设置状态,因此循环将迭代ls
的输出,这将是当前目录中的每个文件,占多行输出。感谢您在读取后指出$。根据你为两者提供的代码,它不会发出回声。。当我插入要读取的绝对路径时,脚本刚刚结束。@user233699:不客气;请也看看我刚才补充的想法。如果我的答案解决了您的问题,请单击它旁边的复选标记;如果它至少包含有用的信息,请单击向上箭头向上投票。这将帮助其他人更快地找到有用的信息(并提高我的声誉)。要在这个好答案中添加“为什么”元素,请注意read$TEST_FILE
将展开TEST_FILE
,并使用该值作为要设置的变量的名称。由于未设置TEST_FILE
,因此read
没有参数,因此使用默认变量REPLY
。由于TEST_FILE
本身继续处于未设置状态,因此循环将迭代ls
的输出,这将是当前目录中的每个文件,占output.Works的多行。非常感谢你!作品非常感谢你!