Linux Bash 脚本与通配符的问题

Linux Bash 脚本与通配符的问题

我对我想象的简单 bash 命令有疑问

我基本上只是想循环遍历一堆文件并获取名称

`ls ./*.sql`               # list all files ending with .sql

if [ $? != 0 ]             # make sure such files exist
then
    echo "no such file"
else 
    echo "files exist"
fi

当我跑步时

"ls ./*.sql"

我得到了我所期望的

./file01.sql    ./file02.sql

但是当我运行 bash 脚本时我得到

./file01.sql: line 1: some random error
./file01.sql: line 2: some random error
./file01.sql: line 3: some random error
./file02.sql: line 1: some random error
./file02.sql: line 2: some random error
./file02.sql: line 3: some random error

任何人都知道为什么这些会有所不同?

答案1

这是后面的引号。它们告诉 shell 运行命令的输出。

例如

`echo ls`

会跑ls

在您的情况下,您已要求 bash 运行 sql 文件。这显然不是你想要的,因为bash不能做到这一点,sql对bash来说没有意义。

此外,即使进行此修复,脚本也不会执行您所描述的操作。其他人(Janis)也给出了解决这个问题的答案,但是他们没有解释为什么你的脚本做了它所做的事情。

答案2

“循环遍历一堆[.sql] 文件并获取它们的名称”你只需这样做:

for f in *.sql
do
    do_whatever_with_file "$f"
done

如果您只想列出文件:

ls *.sql

如果要测试是否*.sql存在文件,例如:

if  ls *.sql >/dev/null 2>&1
then echo sql files existing
else echo no sql files
fi

相关内容