私はLinuxを初めて使用し、bashスクリプトを書いています。スクリプトには2つの変数(内部に変数の内容を含む)があります。同じ for ループでこれらの 2 つの変数を渡し、いくつかの操作を実行しようとしています。
ただし、同じforループで2つの変数を渡すとエラーが発生します。 以下のコードで。便宜上、2つのパラメータを渡しますが、実際には異なります。コマンドからこれらの変数の出力を取得します。
以下は私のコードです。
FILES="2019_06/
2019_07/"
FILESIZE="100
200"
for file in `cat $FILES`; for filesize in `cat $FILESIZE`
do
do
if [ -n "$file" ] && if [ -n "$filesize" ]
then
echo $file
curl -i -XPOST "http://localhost:8086/write?db=S3check&precision=s" --data-binary 'ecmwftrack,bucketpath=ecmwf-archive/'$file' size=$filesize'
fi
done
done
誰もがforループで2つのパラメータを同時に渡すのに役立ちますか?
パラメータはforループのように渡す必要があります。
FILES=2019_06 FILESIZE=100
FILES=2019_07 FILESIZE=200
以下はエラーメッセージです。
助けてください!
以下は私の結果です
下は私のカールクーマンです
echo curl -i -XPOST "http://localhost:xxxx/write?db=S3check&precision=s" --data-binary 'ecmwftrack,bucketpath=ecmwf-archive/'$files' size='$filesizes''
#!/bin/bash -x
# You said variables get their values from commands, so here
# are stand-ins for those commands:
command_to_get_files(){
aws s3 ls "s3://ui-dl-weather-ecmwf-ireland/ecmwf-archive/"| awk '{print $2}' >>"$FILES"
}
command_to_get_filesizes(){
for file in `cat $FILES`
do
if [ -n "$file" ]
then
# echo $file
s3cmd du -r s3://ui-dl-weather-ecmwf-ireland/ecmwf-archive/$file | awk '{print $1}'>>"$FILESIZE"
fi
done
}
# I assume the values returned from the commands are whitespace delimited
# Therefore it is easy to use command substitution and transform the output
# of the commands into arrays:
files=( $(command_to_get_files) )
filesizes=( $(command_to_get_filesizes) )
答え1
これが私が書いたものです:
#!/bin/bash
while read file filesize; do
if [[ -n "$file" && -n "$filesize" ]]; then
# This printf is a stand-in for what your really want to do
printf "FILES=%s FILESIZE=%s\n" "$file" "$filesize"
# I commented out the curl invocation because I don't understand it
#curl -i -XPOST "http://localhost:8086/write?db=S3check&precision=s" --data-binary "ecmwftrack,bucketpath=ecmwf-archive/$file" size="$filesize"
fi
done <<'EOF'
2019_06 100
2019_07 200
EOF
最後に区切られた文書から2つの変数を読み取ります。
答え2
#!/bin/bash
# You said variables get their values from commands, so here
# are stand-ins for those commands:
command_to_get_files(){
echo "2019_06/
2019_07/"
}
command_to_get_filesizes(){
echo "100
200"
}
# I assume the values returned from the commands are whitespace delimited
# Therefore it is easy to use command substitution and transform the output
# of the commands into arrays:
files=( $(command_to_get_files) )
filesizes=( $(command_to_get_filesizes) )
# Repeat this pattern for how ever many parameters you have
# Hat tip to Kamil for idea of using arrays and C-style for loop
for ((i=0; i<"${#files[@]}"; i++)) do
# This printf is a stand-in for what your really want to do
#printf "FILES=%s FILESIZE=%s\n" "${files[$i]%?}" "${filesizes[$i]}"
echo curl -i -XPOST "http://localhost:8086/write?db=S3check&precision=s" --data-binary "ecmwftrack,bucketpath=ecmwf-archive/${files[$i]%?} size=${filesizes[$i]}"
done
パーセント疑問符は、望ましくないようなものを%?
削除します。/
というファイルに入れてmyscript.sh
実行します。
$ chmod +x myscript.sh
$ ./myscript.sh
FILES=2019_06 FILESIZE=100
FILES=2019_07 FILESIZE=200
アップデート:出力はprintf
次のように置き換えられますecho curl ...
。
$ ./myscript.sh
curl -i -XPOST http://localhost:8086/write?db=S3check&precision=s --data-binary ecmwftrack,bucketpath=ecmwf-archive/2019_06 size=100
curl -i -XPOST http://localhost:8086/write?db=S3check&precision=s --data-binary ecmwftrack,bucketpath=ecmwf-archive/2019_07 size=200
答え3
1つの変数に複数の値を入れ、引用符なしで使用し、トークン化に依存して値を再分割するのは良い習慣ではありません。配列を使用してください。同じインデックスを使用して、複数の配列から「並列」の値を取得できます。これにより問題が解決します。
同じサイズの配列を2つ用意し、次のように繰り返します。
#!/bin/bash
file=( "2019_06/" "2019_07/" )
filesize=( "100" "200" )
for ((i=0; i<"${#file[@]}"; i++)) do
echo "${file[i]}" "size=${filesize[i]}"
done
echo …
必要な(および調整された)ブロックと交換しますif … curl …
。
スクリプトがデータを受け取る変数であり、それを変更できず、トークン化に依存する必要があるFILES
場合は、FILESIZE
変数から配列を作成します。
file=( $FILES )
filesize=( $FILESIZE )
変数は参照されず、噴射(およびファイル名の生成)この段階で発生します。
答え4
S3操作を並列に実行したい場合がよくあります。
FILES="2019_06/
2019_07/"
FILESIZE="100
200"
doit() {
s3cmd du -r s3://ui-dl-weather-ecmwf-ireland/ecmwf-archive/"$1" |
awk '{print $1}'>>"$2"
}
export -f doit
parallel doit {1} {2} ::: $FILES :::+ $FILESISZE