簡體   English   中英

在For Loop(Bash)中使用變量名稱

[英]Using variable Names in For Loop (Bash)

我有兩組目錄。 在第一個目錄中,我有8個文件,例如:

file1.txt file2.txt file3.txt ... file8.txt

在第二個名為output目錄中,我有多個子目錄。 我想寫一個for循環,該循環進入output內部的每個子目錄(因此它們是directory1directory2等...),並讀取一個名為database_file_#.txt的文件。 目前,我已在下面編寫了此循環,但一次僅適用於一個目錄。

for file in *; do 
name="${file%%.*}"
python script.py --parameter $file --out ../../output/directory1/${cts_name} 
--readin ../../output/directory1/database_file_1.txt 
done

對於第二個目錄,我執行以下操作:

 for file in *; do 
name="${file%%.*}"
python script.py --parameter $file --out ../../output/directory1/${cts_name} 
--readin ../../output/directory2/database_file_2.txt 
done

我不想繼續為輸出中的所有目錄重寫目錄號。 有沒有辦法可以使用變量呢?

for i in 1 2 3 4 5 6 7 8; do 
  for file in *; do 
    name="${file%%.*}"
    python script.py --parameter "$file" --out ../../output/directory"${i}/${cts_name}" \
        --readin "../../output/directory${i}/database_file_${i}.txt" 
  done
done

聽起來這里的關鍵變量是“#”,而不是“文件”。

建議:

for i in 1 2 3 4 5 6 7 8; do 
  filename=file$i.txt
  outdir=../../output/directory$i
  python script.py --parameter $filename --out $outdir/${cts_name} --readin $outdir/database_file_$i.txt 
done

PS:假設輸入文件和#之間存在1 :: 1的關系。

否則,如果每個#都有N個文件,則需要一個嵌套循環。

在任何情況下,請使其盡可能簡單( KISS )。

首次嘗試時,您可以嘗試以下操作(但請繼續閱讀):

for f in $(ls -R); do
  if [[ $f =~ database_file_+([0-9])\.txt ]]; then
    python script.py ... --readin "$f"
  fi
done

+([0-9])匹配一個或多個數字

感謝Charles Duffy的評論,此代碼段更加准確:

find . -type f -regex ".*/database_file_[0-9]+\.txt$" -exec python script.py ... --readin {} \;

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM