Различаются ли два стиля циклов for что они могут выражать?

Вот что я бы сделал:
sed -E 's / [A-Za-z _] / / г; с /. {1,} $ //; s / ^ {1,} ([0-9]) / \ 1 / '

Пример:

echo "A_b0.5_c0.654_d0.157_e1.6.out" | sed -E 's/[A-Za-z_]/ /g;s/. {1,}$//;s/^ {1,}([0-9])/\1/'
0.5  0.654  0.157  1.6

Кто-то с более высокими навыками sed может произвести лучший один.

1
24.04.2016, 19:14
3 ответа

Первый

for (( expr1 ; expr2 ; expr3 )) ; do commands ; done

, возможно, более общий, чем второй

for name [ [in [words ...] ] ; ] do commands; done

, потому что

  • переменные, используемые в выражениях, могут использоваться как индексы массива (и получать выбор из списка слов, используемых в второй),
  • , но вторая форма использует неизменный список слов для пошагового выполнения (но первая форма использует выражение для завершения цикла, что означает, что завершение цикла не предопределено заранее в той же степени).
2
27.01.2020, 23:12

Вторая форма всегда конечно, первый тривиально можно превратить в бесконечный цикл:

for ((;;)); do echo $SHELL; done
4
27.01.2020, 23:12

Это:

for (( expr1 ; expr2 ; expr3 )) ; do commands ; done

Циклы над целыми числами, поскольку он вынужден делать это из-за того, что внутри (( )) каждая часть (деленная на ;) является "Арифметическим выражением".

Он похож на c for loop, имеет начало, конец и "действие шага", определенные в одной строке, он более компактен.

Второй работает со списком слов, которые могут быть числами, строками или массивами:

for a in 1 2 3 4 5; do echo "$a"; done
for a in one two three four five; do echo "$a"; done
for a in "${one[@]}" ; do echo "$a"; done

Одна из оговорок заключается в том, что список слов подвержен shell split, что не является проблемой в первой конструкции.

2
27.01.2020, 23:12

Теги

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