試圖進入變數的路徑;沒有權限
我在一個目錄中有 20 個感興趣的文件。它們可以分為 5 組,每組由文件名中從 626 到 630 的數字標識。例如,可能(假設)有一個名為
the-quick-brown-fox-jumps-over-627-lazy-dogs_1_bbduk.fq
.我想遍歷每個組並將文件的路徑臨時儲存為文本變數(與
for
循環中的其他命令一起使用)。這就是我現在所擁有的:for i in {626..630};do fw1=$(/scratch/[username]/data/*"$i"-*_1_bbduk.fq) fw2=$(/scratch/[username]/data/*"$i"_*_1_bbduk.fq) rv1=$(/scratch/[username]/data/*"$i"-*_2_bbduk.fq) rv2=$(/scratch/[username]/data/*"$i"_*_2_bbduk.fq) done
問題:我得到了正確的路徑(每個路徑只有一個選項),但它顯示“權限被拒絕”,我以後似乎無法將該變數用作文本。看起來 bash 正在嘗試執行它,這不是我想要的。
我嘗試在 ( 例如 , 周圍添加單引號
fw1='$(/scratch/[username]/data/*"$i"-*_1_bbduk.fq)'
,但這會刪除萬用字元。我考慮過雙引號 ( " " ),但我不確定如何在不弄亂 “$i” 變數的情況下使用它們。我’已經嘗試使用echo
(例如,fw1=echo $(/scratch/[username]/data/*"$i"-*_1_bbduk.fq)
但這仍然存在’權限被拒絕’問題。
Jim 正確地確定了您的程式碼的問題,但是(IMO)更好的解決方案更接近您已有的解決方案:
fw1=(/scratch/*使用者名*/data/*"$i"-*_1_bbduk.fq)
(注意: no
$
)將為您提供與 glob 匹配的文件名數組。有點尷尬${#fw1[@]}
會告訴你數組中有多少元素。例如,如果該數字是4
,那麼您可以使用${fw1[0]}
、${fw1[1]}
和${fw1[2]}
來${fw1[3]}
訪問這四個元素。但是 plain$fw1
會給你${fw1[0]}
,所以,如果你 110% 確定每個模式都會有一個匹配的文件,你可以只使用簡短的形式。*或者,*你可以說
fw1=$(echo /scratch/*使用者名*/data/*"$i"-*_1_bbduk.fq)
再一次,你很親密。(但如果有可能會有多個文件匹配該模式,則數組解決方案會更好。)
Bash 正在嘗試執行文件名,因為您將每個文件都包含在
$( ... )
如果這不是您想要的,請使用:
for i in {626..630}; do fw1=/scratch/[username]/data/*"$i"-*_1_bbduk.fq fw2=/scratch/[username]/data/*"$i"_*_1_bbduk.fq rv1=/scratch/[username]/data/*"$i"-*_2_bbduk.fq rv2=/scratch/[username]/data/*"$i"_*_2_bbduk.fq done
編輯:
根據您的評論,此程式碼可能是您想要的:
for i in {626..630}; do fw1="$(compgen -G /scratch/[username]/data/*"$i"-*_1_bbduk.fq)" fw2="$(compgen -G /scratch/[username]/data/*"$i"_*_1_bbduk.fq)" rv1="$(compgen -G /scratch/[username]/data/*"$i"-*_2_bbduk.fq)" rv2="$(compgen -G /scratch/[username]/data/*"$i"_*_2_bbduk.fq)" done