Bash

試圖進入變數的路徑;沒有權限

  • March 21, 2022

我在一個目錄中有 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

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