時間と労力を節約するために大規模なプロセスを自動化しようとしていますが、おそらく必要以上に難しくしているようです。これまで私がやっていることは次のとおりです。
#!/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設定)はありません。awk
cut
sed
perl
read
たとえば、
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