Лучший способ работать единственный за циклом вместо два для циклов

Я делаю это с: установщик VMware-u плеер VMware. - Debian 7 - 64 бита Затем я мог установить рабочую станцию VMware 9 в тесте без любой проблемы.

4
03.09.2016, 04:40
3 ответа

После нескольких миллионов загрузок и тестирования. Я нашел его. Вопрос:

В сценарии я «вырезал» имя файла из символа («&»).

 nameCap=${nameCap%%&*}

Что происходит, так это то, что Главная папка и подпапки создавались с Пробелом и концом папки, например, «Имя папки». То же самое происходило и с подпапками. Я просто добавить, чтобы удалить последний символ папки я создаю.:

 nameCap="${nameCap%?}"
-121--244841-

Вы можете проверить позицию команды в последовательности истории с помощью команды history . Затем можно выполнить ! < number _ in _ the _ sequence > . Надеюсь, это поможет.

-121--21458-

Если я правильно понимаю, вы хотите выполнить команду ipcrm shm < ids > для всех сегментов общей памяти пользовательского боба. Затем выполните команду ipcrm -s < ids > для всех массивов Semaphore пользовательского боба.

Для этого используйте следующие команды (не нужно закольцовывать сценарий):

Для части «Сегменты общей памяти»:

ipcrm shm $(ipcs -m | awk '$3=="bob" {printf "%s ",$2}')

Для части «Массив семафора»:

ipcrm -s $(ipcs -s | awk '$3=="bob" {printf "%s ",$2}')

Объяснение:

Из ipcs manpage:

   -m     shared memory segments
   -s     semaphore arrays

Часть awk печатает идентификаторы только в 3-и поля

6
27.01.2020, 20:52

Как предложил SLM на ваш другой вопрос , Я предлагаю сделать это с , а петля, а не на для цикла :

looking_at=
ipcs | while read key id owner other
do
      # Keep track of which section we’re in.
      if [ "$id" = "Shared" ]               # $id is the second field; i.e., $2.
      then
            looking_at=shm
      elif [ "$id" = "Semaphore" ]
      then
            looking_at=sem
      elif [ "$id" = "Message" ]
      then
            break
      fi
      if [ "$owner" = "bob" ]
      then
            if [ "$looking_at" = "shm" ]
            then
                  ipcrm shm "$id"
            elif [ "$looking_at" = "sem" ]
            then
                  ipcrm -s "$id"
            fi
      fi
done

Это считывает вывод команды IPCS в одну строку за раз, Вырывая первые три поля в виде клавиши , ID , и владелец . Как говорит комментарий, Мы используем Selection_at переменную для отслеживания того, какой раздел мы находимся. Затем, на каждой строке, которая содержит BOB в третьем поле, Мы используем Slection_at , чтобы определить, какой параметр IPCRM для использования.

-2
27.01.2020, 20:52

, Возможно...

ipcs | sed -n '
    s/[^ ]*  *//
    /^Messages/q
    /^Semaphores/cshift
    /  *bob .*/!d;s///
    / /!s/./ipcrm $1 &/p
'| sh -s -- shm \-s

, Который удаляет строки, которые не содержат последовательность боб , поскольку третье пространство разграничило поле или , которые не имеют в их вторых полевых сообщениях/Семафорах.

Это вставляет последовательность ipcrm 1$ <поле 2> для тех строк, которые остаются. Это выходит из входа при соответствии сообщения , и это заменяет Семафоры сдвиг w/ соответствия .

вывод sed интерпретируется процессом оболочки с двумя positionals shm/-s. Таким образом, когда sed говорит сдвиг , что оболочка прекращает выполнять команду ipcrm отметка курса корабля и начинает работать -s в месте shms.

я предполагаю, хотели ли вы чистое решение для оболочки, это приближается:

set -f; IFS='
'; for l in $(ipcs); 
do IFS=\ ;set -- $l
case "$1:$2:${3#bob}" in
(-*:Sh*) a=shm;; 
(-*:Se*) a=-s;; 
(-*:Me*) break 2;;
(*:*:) ipcrm "$a" "$2";;
esac; done
2
27.01.2020, 20:52

Теги

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