Вам нужно сделать это
for i in {1..6}; do
ip_var="IP_$i"
id_var="ID_$i"
wget... "http://${!ip_var}/..." -O "/home/administrator/Logs/${!id_var}/..."
done
Здесь используется «переменная косвенность», как описано в руководстве:https://www.gnu.org/software/bash/manual/bashref.html#Shell-Parameter-Expansion
Однако пронумерованные переменные неуклюжи. Вместо этого используйте массивы:
ip=( "xx.xx.xx.xx" "xx.xx.xx.xx"... "xx.xx.xx.xx" )
id=( "yyyyy" "yyyyy"... "yyyyy" )
for ((i=0; i < ${#ip[@]}; i++)); do
wget... "http://${ip[i]}/..." -O "/home/administrator/Logs/${id[i]}/..."
done
С помощью >> file
файл открывается на стандартном выходе в режиме добавления. Таким образом, любой вывод идет в конец файла.
grep
пишет 12\n
. Ваш файл заранее содержал foo\n
. Таким образом, вы получаете foo\n12\n
. Чтобы получить foo12\n
, вам нужно вывести не в конце, а в последнем байте перед концом, чтобы перезаписать \n
на 12\n
.
В некоторых оболочках для этого есть операторы.
Сzsh
:
zmodload zsh/system
if sysseek -u 1 -w end -1; then
grep -c WORD /home/user/data
else
syserror -p "Can't seek to just before the end: "
fi 1<> file
Сksh93
:
grep -c WORD /home/user/data 1<> file >#((EOF - 1))
<>
— оператор перенаправления, открывающий файлы в режиме чтения+записи. Здесь нам не нужна часть read , но мы используем <>
, поскольку в отличие от >
она не усекает файлы.
В любом случае, это не режим добавления . Вы увидите разницу, если какой-то другой процесс также записывает в файл или усекает его одновременно (вряд ли это будет проблемой в вашем случае ).
Другой подход может состоять в том, чтобы обрезать файл, чтобы удалить конечный \n
, а затем открыть файл в режиме добавления .
С GNUtruncate
:
truncate -s -1 file && grep -c WORD /home/user/data >> file