我正在尝试编写一个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个文件吐出一个结果..
我该怎么做?
谢谢!
答案 0 :(得分:4)
首先,您使用read
错误地使用了变量 - 请勿使用$
- 当引用变量的现有值时,您只使用$
,而不是分配一个值;代替:
echo "Select your file"
read TEST_FILE
如果假设$TEST_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提到了-f
的{{1}}标记,其结果(可能取决于文件系统)未排序输出,包含以{开头的条目{1}}
相比之下,带有glob(文件名模式)的ls
循环总是扩展为排序条目(据我所见)。
另外,要使globs与以.
开头的条目匹配,必须设置for
shell选项(.
)。
答案 1 :(得分:1)
如果您只想检查一个文件,则下面应该有效:
test -f <the-file-path> && echo "regular file"
如果要检查目录中的常规文件,请按照以下步骤操作:
echo "Select your file"
read TEST_FILE
for fil in `ls $TEST_FILE`; do
if [ -f $TEST_FILE/$fil ]; then
echo "$TEST_FILE/$fil is a regular file"
fi
done