1

В винде часто использую следующую конструкцию:
1) имею файл со списком хостов и параметров, например счетчиками производительности. которые надо время от времени запускать, число счетчиков разное ,но не больше 7, например.
<hostname1>|<counter name1>|<counter name2>|<counter name3>
<hostname2>|<counter name1>|<counter name2>
<hostname3>|<counter name1>|<counter name2>

В скрипте пишу следующую конструкцию:

for /f "delims=|;tokens=1,2,3,4,5,6,7" do (
выполняю действия с переменными %%i (первое вхождение) %%j (второе) и  т д.
)

При
том мануал по даной комманде в винде можно получить простой комбинацией: "help for" в cmd.exe

Вопросы:
1) Каким образом выполнить парсинг из шелла текстового файла с разделителями?
2) Какой командой можно получить мануал по такой команде? Пробовал "man for" - результат пустой, а в "man sh" по for описание короткое. Если есть мануал - прошу кинуть в меня им.

2

For — какбэ не команда, а оператор, поэтому man-страниц и нет. Ну а мануалка вот:
http://tldp.org/LDP/abs/html/loops.html

openSUSE Leap 15.1

3

gabix пишет:

For — какбэ не команда, а оператор, поэтому man-страниц и нет. Ну а мануалка вот:
http://tldp.org/LDP/abs/html/loops.html

логично ,что оператор. Почему-то виндозники по мену мануал отдельно вынесли. Ну да ладно. По той ссылке все подробно описано. Спасибо. Но разбора строки, которая берется из файла там нет. Возможно два в одном в cmd сделано для уменьшения числа команд и, как следствие, для упрщения самого командного интерпретатора. Стало быть задача сводится к другому:

Какими командами можно пропарсить строку в shell-е? Может есть какой-нибудь strstr его можно было бы в цикле проанализировать.

4

helgisbox пишет:

1) Каким образом выполнить парсинг из шелла текстового файла с разделителями?

вариантов много. Вот мой вариант:

#!/bin/bash

FILE_NAME="t"

OLD_IFS="$IFS"
IFS="|"

declare ARRAY

while read S
do
    echo "$S"
    ARRAY=( $S )
    for (( J=0; J<${#ARRAY[@]}; J++ ))
    do
        echo "$J - ${ARRAY[$J]}"
    done
done <"$FILE_NAME"

IFS="$OLD_IFS"
helgisbox пишет:

Какой командой можно получить мануал по такой команде? Пробовал "man for" - результат пустой, а в "man sh" по for описание короткое. Если есть мануал - прошу кинуть в меня им.

man bash

 Консоль:
$ help for
for: for NAME [in WORDS ... ] ; do COMMANDS; done
    Execute commands for each member in a list.
   
    The `for' loop executes a sequence of commands for each member in a
    list of items.  If `in WORDS ...;' is not present, then `in "$@"' is
    assumed.  For each element in WORDS, NAME is set to that element, and
    the COMMANDS are executed.
   
    Exit Status:
    Returns the status of the last command executed.

Карусель разнесло по цепочке за час
Всех известий — конец
Да, весна началась!
(всё к лицу подлецу, как родному отцу, не рассказывай, батя, и так всё пройдёт)

5

helgisbox, ещё info bash прочитайте, если не хотите быть школьником.

Карусель разнесло по цепочке за час
Всех известий — конец
Да, весна началась!
(всё к лицу подлецу, как родному отцу, не рассказывай, батя, и так всё пройдёт)

6

drBatty пишет:

Вот мой вариант

А какой смысл в строках:

OLD_IFS="$IFS"
IFS="$OLD_IFS"

?

7

beliy пишет:

А какой смысл в строках:

 Консоль:
$ echo "$IFS"|hexdump -C
00000000  20 09 0a 0a                                       | ...|
00000004

$IFS это список разделителей в bash'е, которые нужны для того, что-бы разрезать строку $S в этом месте кода:

ARRAY=( $S )

если вы знакомы с php, то эта строка эквивалентна http://php.net/manual/ru/function.explode.php

Ну и да, разделители нужны и для другого, потому я их сохранил. Иначе ваш код будет очень неожиданно работать, если разделитель у вас будет "|".

Карусель разнесло по цепочке за час
Всех известий — конец
Да, весна началась!
(всё к лицу подлецу, как родному отцу, не рассказывай, батя, и так всё пройдёт)