ファイルから変数に行を読み込む

ファイルから変数に行を読み込む

時間と労力を節約するために大規模なプロセスを自動化しようとしていますが、おそらく必要以上に難しくしているようです。これまで私がやっていることは次のとおりです。

#!/bin/bash
LISTFILE="/tmp/filename"
for FILE in $LISTFILE
    do curl -XDELETE ADDRESS:PORT/VALUE/VALUE/$FILE
done

ただし、$ FILE値を返すのではなく、/ tmpおよび/ filenameでエラーが発生します。私がしなければならないのは、ファイルを繰り返し、各行に対して1回ずつコマンドを実行し、$ FILE値を埋めることです。

どんなアドバイスも本当にありがとうございます。

答え1

この場合、for値が$FILEの値になる繰り返しを一度だけ行うだけです$LISTFILE

ファイルの行を繰り返すには、次のようにします。

while read -r FILE; do
    curl -XDELETE "ADDRESS:PORT/VALUE/VALUE/$FILE"
done < /tmp/filename

これは、ファイルの各行に別々のファイルがリストされていると仮定します。

答え2

このfor行は:

for FILE in $LISTFILE

「その中のすべての行について」を意味するわけではありません$LISTFILE。これは「変数の各項目について」を意味します$LISTFILE$LISTFILEファイルパスのみが含まれているため、そのパスが$FILE保存されます。

for「各行」に対してコマンドを繰り返すようにしてください。コンテンツ$LISTFILE'、次のようにコードを変更する必要があります。

#!/bin/bash
LISTFILE="/tmp/filename"
while read FILE
   do echo $FILE
done < $LISTFILE

これはwhile、ループを使用してread「入力」を1行ずつ読み取るコマンドを使用します。私たちの入力はファイルの内容であり、最後に指定します(この部分:)< $LISTFILE

答え3

シェルループを使用してテキストファイルの行を処理するほとんどの場合は、または、または(または他の利用可能なテキスト処理ツール)をfor使用することをお勧めします。より速く、簡単で、望ましくない副作用(例:使用前にIFS設定)はありません。awkcutsedperlread

たとえば、

awk '{print "curl -XDELETE '\''ADDRESS:PORT/VALUE/VALUE/"$1"'\''"}' \
 /tmp/filename | 
 sh

(正しい出力が生成されているかどうかを確認するには、sh、bash、dashなどでパイプなしで最初に実行します。)

これにより、目的の操作が行われ、スペース、グローバルワイルドカード、アンパサンド、セミコロンなどのファイル名を収容できるようにURLの周囲に単一引用符が付けられます。ファイル名に一重引用符または改行を含むファイルを除くすべてのファイルに適用されます。後者は改行で区切られた入力ファイルでは変更できませんが、前者はステートメントの前に次を挿入することで変更できますprint

gsub(/'\''/,"'"'\\\\''"'");

私は最近、それが何をしているのかについての説明をここに書きました:https://unix.stackexchange.com/a/293818/7696

awk '{ gsub(/'\''/,"'"'\\\\''"'");
       print "curl -XDELETE '\''ADDRESS:PORT/VALUE/VALUE/"$1"'\''"}' \
 /tmp/filename | 
 sh

ファイル名に迷惑な文字がないと確信している場合は、はるかに簡単です。

awk '{ print "curl -XDELETE ADDRESS:PORT/VALUE/VALUE/"$1 }' /tmp/filename | sh

関連情報