我正在嘗試find使用陣列的條目作為變數名稱和搜索字串將結果分配給動態變數。
databases=(ABC DEF GHI JKL)
for i in "${databases[@]}"
do
schema_$i=$(find '/hana/shared/backup_service/backup_shr/Schema' -type d -iname ${i} -mtime 0)
done
結果應該是 0 到 4 個看起來像這樣的變數(取決于找到了多少檔案夾):
schema_ABC=/hana/shared/backup_service/backup_shr/Schema/ABC
但是,當我嘗試這個時,我得到“沒有這樣的檔案或目錄”作為錯誤。
./find_schema.sh: line 4: schema_ABC=/hana/shared/backup_service/backup_shr/Schema/ABC: No such file or directory
./find_schema.sh: line 4: schema_DEF=/hana/shared/backup_service/backup_shr/Schema/DEF: No such file or directory
./find_schema.sh: line 4: schema_GHI=: command not found
./find_schema.sh: line 4: schema_JKL=/hana/shared/backup_service/backup_shr/Schema/JKL: No such file or directory
檔案夾結構如下所示:
Server:/hana/shared/backup_service/backup_shr/Schema # ll
total 0
drwxr-xr-x 2 root root 0 Sep 29 2020 Test
drwxr-xr-x 2 root root 0 Jan 24 21:15 ABC
drwxr-xr-x 2 root root 0 Jan 24 21:30 DEF
drwxr-xr-x 2 root root 0 Jan 12 22:00 GHI
drwxr-xr-x 2 root root 0 Jan 24 21:45 JKL
我相信我沒有正確宣告該變數,但我無法弄清楚出了什么問題。
uj5u.com熱心網友回復:
考慮:
schema_$i=$(cmd)
當 bash 決議該行時,它首先檢查變數分配。由于$不是變數名中的有效字符,因此它看不到任何變數賦值。然后它將字串擴展為schema_$i字串schema_ABC(或任何當前值$i)。然后它執行cmd以獲取一些輸出,然后它嘗試執行命令schema_ABC=foo,但找不到與該名稱匹配的命令。直觀地說,您正在嘗試bash評估字串schema_ABC=foo,在這種情況下,您需要使用eval "schema_$i=$(find ...)". 但你真的不想掉進那個兔子洞。
相反,您可以使用關聯陣列并執行以下操作:
declare -A schema
databases=(ABC DEF GHI JKL)
for i in "${databases[@]}"
do
schema[$i]=$(...)
done
uj5u.com熱心網友回復:
宣告動態變數名稱的一種方法是使用declare:
#!/bin/bash
databases=(ABC DEF GHI JKL)
for i in "${databases[@]}"
do
declare "schema_$i"="$(find '/hana/shared/backup_service/backup_shr/Schema' -type d -iname "$i" -mtime 0)"
done
備注: find 命令好像不對;它只會列出名稱為“$i”的目錄
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/422223.html
標籤:
上一篇:Bash中的變數
