forループ内のテキストファイルの行をスクリプトに渡す

forループ内のテキストファイルの行をスクリプトに渡す

以下は、Ubuntuで実行されているオブジェクトストレージアーキテクチャでファイルサイズを見つけるための実行スクリプトです。私が経験している問題は、スクリプトが一度に1つのアカウントを確認するように書かれていて、うまく動作することです。しかし、複数のアカウントを順次解析するように変更したい場合はどうすればよいですか?スクリプトの上部にある変数を置き換えるために、他のテキストファイルのパラメータリストを渡す方法はありますか?

たとえば、他のテキストファイルtest.txtに次の行が含まれているとします。

auto02 FfiBftkjgS8hnQn79Arj7PiHfvtsgn
qa04 s67aeYD6521pPgt7TknvGxKvF9WxNF

上記のファイルからユーザーとキーを取得してすべてのアカウントを繰り返すために、一部のループでこのスクリプトの上部にある変数に置き換えることができますか?

#!/bin/bash

# Variables to be set
auth=http://sslabapi/auth/v1.0 # Auth URL
user=qa04 # Username
key=s67aeYD6521pPgt7TknvGxKvF9WxNF # Password
size=500000 # Minimum file size in bytes

# Env variables set
ST_AUTH="$auth"
ST_USER="$user"
ST_KEY="$key"

# Env variables exported
export ST_AUTH
export ST_KEY
export ST_USER

# Timestamp function
timestamp() {
    date +"%Y-%m-%d %T"
}

# Main Loop
containerList="$(swift list)"
echo "++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++" >> bigFiles.txt
echo "$(timestamp): Account for $user" >> bigFiles.txt
echo "++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++" >> bigFiles.txt
echo "Starting check for files > $size bytes in the $user user account..."
for i in $containerList; do
    echo "*************************" >> bigFiles.txt
    echo "Container $i" >> bigFiles.txt
    echo "*************************" >> bigFiles.txt
    echo "Container $i"
    IFS=$'\n'
    olist=($(swift list -l $i))
    for a in ${olist[@]}; do
        osize=`echo "$a" | awk '{print $1}'`
        if [ $osize -gt "$size" ]; then
            echo "Found one: $a"
            echo "$a" >> bigFiles.txt
        fi
    done
done

以下は、提供された追加を含む私のスクリプトの編集版です。

#!/bin/bash

while read -r user key
do
# Variables to be set
auth=http://sslabapi/auth/v1.0 # Auth URL
#user=$user # Username
#key=$key # Password
size=500000 # Minimum file size in bytes

# Env variables set
ST_AUTH="$auth"
ST_USER="$user"
ST_KEY="$key"

# Env variables exported
export ST_AUTH
export ST_KEY
export ST_USER

# Timestamp function
timestamp() {
    date +"%Y-%m-%d %T"
}

# Main Loop
containerList="$(swift list)"
echo "++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++" >> bigFiles.txt
echo "$(timestamp): Account for $user" >> bigFiles.txt
echo "++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++" >> bigFiles.txt
echo "Starting check for files > $size bytes in the $user user account..."
for i in $containerList; do
    echo "*************************" >> bigFiles.txt
    echo "Container $i" >> bigFiles.txt
    echo "*************************" >> bigFiles.txt
    echo "Container $i"
    IFS=$'\n'
    olist=($(swift list -l $i))
    for a in ${olist[@]}; do
        osize=`echo "$a" | awk '{print $1}'`
        if [ $osize -gt "$size" ]; then
            echo "Found one: $a"
            echo "$a" >> bigFiles.txt
        fi
    done
done
echo "...finished check!"
done < test.txt

ベストアンサー1

あなたがしなければならないwhileことは、始めに単純なループを追加することだけです。

while IFS=' ' read -r user key
 do
  Your whole script
 done < test.txt

おすすめ記事