Как передать несколько переменных в цикл for в качестве аргумента в скрипте bash?

У меня была такая же проблема в Ubuntu 16.04. Диалог исчез после того, как я сделал это:

  • удален ssh -askpass(sudo apt remove ssh-askpass); и
  • закомментировал crontab, использующий ssh ​​(1)(crontab -e).

Одного из этих действий достаточно, чтобы удалить диалоговое окно.

Когда хост, к которому мой cronjob пытался подключиться (, обычно через аутентификацию по ключу без пароля ), находился на обслуживании, начали появляться диалоги x11 -ssh -askpass .

По моему мнению, хотя x11 -ssh -askpass является законной программой,лучше не позволять программам X11 мешать аутентификации и шифрованию.

1
04.05.2020, 11:51
4 ответа
#!/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
0
28.04.2021, 23:16

Вот как бы я это написал:

#!/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

Он считывает две переменные из heredoc, который предоставляется в конце.

1
28.04.2021, 23:16

Помещать несколько значений в одну переменную, использовать ее без кавычек и полагаться на разбиение слов для повторного разделения значений — не лучшая практика. Используйте массивы. Вы можете извлекать значения из двух или более массивов «параллельно», используя один и тот же индекс; это должно решить вашу проблему.

Подготовьте два массива одинакового размера и выполните цикл следующим образом:

#!/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 )

Переменные не заключены в кавычки, на этом этапе происходит разбиение на слова (и генерация имени файла ).

0
28.04.2021, 23:16

Часто вам может понадобиться делать вещи 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

0
28.04.2021, 23:16

Теги

Похожие вопросы