Linux

如何將輸出文件的每一行作為參數傳遞給同一個 bash 腳本中的 for 循環?

  • May 26, 2021

我正在嘗試編寫一個 bash 腳本來獲取 S3 儲存桶中子文件夾的總大小。

我的桶路徑s3://path1/path2/subfolders

在 path2 文件夾中,我有許多子文件夾,例如

2019_06
2019_07
2019_08
2019_09
2019_10
2019_11
2019_12

我需要在 bash 腳本中獲取每個子文件夾的大小。

我寫了一個腳本

#!/bin/bash

FILES=$(mktemp)

aws s3 ls "s3://path1/path2/"  >> "$FILES"

cat $FILES
echo
for file in $FILES
do    
 if [ ! -e "$file" ]      
 then 
   s3cmd du -r  s3://path1/path2/$file
   echo "$file"; echo
   continue               
 fi 

 echo
done

cat $tmpfile 的輸出如下

2019_06
2019_07
2019_08
2019_09
2019_10
2019_11
2019_12

但我得到錯誤。在將變數傳遞到 for 循環時。理想情況下,我的目標是當 for 循環在內部執行時每次迭代 do …..命令應該像

s3cmd du -r s3://path1/path2/2019_06

s3cmd du -r s3://path1/path2/2019_07

s3cmd du -r s3://path1/path2/2019_08

ETC…

這樣我就可以獲得文件夾的總大小

請幫忙!

更新 我已按照建議編輯了程式碼

#!/bin/bash

FILES=$(mktemp)

aws s3 ls "s3://path1/path2/"  >> "$FILES"

for file in `cat $FILES`
do
 if [ -n "$file" ]
 echo $file
done

首先,如果要檢查文件是否存在,不需要驚嘆號,!因為[ -e FILE ]會返回True if FILE exists.

但問題是您的 bash 腳本無法檢查是否2019_06存在,因為這些文件位於 S3 中。$FILES 中的行只是字元串。

您可以檢查使用[ -n STRING ]哪種方式True if the length of "STRING" is non-zero

for file in `cat $FILES`
do    
  if [ -n "$file" ]
  then 
     echo $file
     s3cmd du -r  s3://path1/path2/$file
  fi
done
aws s3 ls "s3://path1/path2/" | while read file
do    
   # do something with $file
done

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