Bash

帶有萬用字元的 Linux Bash 腳本問題

  • April 8, 2015

我對我想像的應該是一個簡單的 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

任何人都知道為什麼這些會有所不同?

它是反引號引號。它們告訴 shell 執行命令的輸出。

例如

`echo ls`

將執行ls

在您的情況下,您已要求 bash 執行 sql 文件。這顯然不是您想要的,因為 bash 無法做到這一點,因此 sql 對 bash 沒有意義。

此外,即使使用此修復程序,腳本也不會執行您描述的操作。其他人(Janis)也給出了解決該問題的答案,但是他們沒有解釋為什麼您的腳本會這樣做。

要*“遍歷一堆 [* .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

引用自:https://unix.stackexchange.com/questions/195012