Linux 使用ls-f过滤输出文件

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

我正在尝试编写一个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
 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的多行。非常感谢你!作品非常感谢你!