Как перебрать результаты команды grep и проверить условие для каждого значения внутри цикла?

Да, это эквивалентно, но, очевидно, только если вы скажете mknodна самом деле создать FIFO, а не блочное или символьное устройство (, что редко делается в наши дни, как devtmpfs/udev делает это за вас ).

mkfifo foobar
# same difference
mknod foobar p

В straceодинаково для обеих команд:

mknod("foobar", S_IFIFO|0666)           = 0

Таким образом, с точки зрения системных вызовов, mkfifoна самом деле является сокращением для mknod.

Таким образом, самое большое различие заключается в семантике. С помощью mkfifoвы можете создать кучу FIFO за один раз:

mkfifo a b c

С mknod, так как вы должны указать тип, он всегда принимает только один аргумент:

# wrong:
$ mknod a b c p
mknod: invalid major device number ‘c’
# right:
mknod a p
mknod b p
mknod c p

В общем, mknodможет быть сложно правильно использовать. Поэтому, если вы хотите работать с FIFO, придерживайтесь mkfifo.

0
24.08.2021, 19:45
1 ответ

Я отформатировал ваш вопрос, включая ваш псевдокод, но способ, которым вы пытаетесь это сделать, не сработает. Ваша переменная $namesне является массивом, а представляет собой одну длинную строку с включенными разрывами строк. Вот как вы можете перебирать такую ​​строку в будущем.

Это наш образец names.txtфайла, который мы будем использовать для имитации процесса

###                 names.txt                  ###
### our sample file to grep over as an example ###
##################################################
Abc xyz
Pqr def
Lmn ghi

со следующим кодом:


names=$(grep -v '^#' names.txt)

i=1;
while read n; do 
  echo "Name $i. $n"
  if [[ "$n" == "Pqr def" ]]; then
      echo "--- $n was found at line $i"
  fi    
  i=$(($i+1)); 
done <<< "$names"

Ваш вывод будет выглядеть так:

Name 1. Abc xyz
Name 2. Pqr def
--- Pqr def was found on line 2
Name 3. Lmn ghi
1
24.08.2021, 23:33

Теги

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