значение $ {# PIDS} в сценарии оболочки - PullRequest
0 голосов
/ 04 октября 2011

Я пытаюсь понять сценарий оболочки. Следующий скрипт - это лишь малая часть большого скрипта

#!/bin/sh
for i in `pgrep -f libflashplayer.so`
do
  PIDS=$PIDS$i","
done
echo ${#PIDS}
PIDS=`echo ${PIDS:0:${#PIDS}-1}`

Мне не ясно, с чем это связано

echo ${#PIDS}
PIDS=`echo ${PIDS:0:${#PIDS}-1}`

в приведенном выше сценарии означает?

** ОБНОВЛЕНИЕ **

После понимания ответов ниже здесь ввод

#npviewer. 2768 deel   11u   REG                7,0 19218930   262562 /tmp/FlashXX2j3xhT (deleted)
#npviewer. 2768 deel   12u   REG                7,0 32352982   262837 /tmp/FlashXX6R4nAq (deleted)
#npviewer. 2768 deel   17u   REG                7,0 27289825   262824 /tmp/FlashXXuVBqbu (deleted)
#npviewer. 2768 deel   18u   REG                7,0 21632133   262825 /tmp/FlashXXneoS8s (deleted)

и этот ввод дан в следующем скрипте

for i in `lsof -np $PIDS | grep deleted | grep /tmp/Fl*`
do
     PID=`echo $i | cut -d " " -f 2`
     FD=`echo $i | cut -d " " -f 6`
     FD=`echo ${FD:0:${#FD}-1}`
     echo $FD
done

вывод

11u
12u
17u
18

согласно моему пониманию, результат должен быть

11
12
17
18

Так почему же это не так?

Ответы [ 2 ]

3 голосов
/ 04 октября 2011

Поиск в справочном руководстве Bash по запросу "$ {#":

${#parameter}

Длина в символах расширенного значения параметр подставляется. Если параметр равен * или @, значение замещено число позиционных параметров. Если параметр является имя массива подписывается * или @, подставляется значение количество элементов в массиве.

2 голосов
/ 04 октября 2011

Подсчитывает количество символов в строке PIDS, а затем обрезает последнюю запятую в конце строки.

# cat a.sh
#!/bin/bash

PIDS="1,2,3,4,5,"

echo "${PIDS}"
echo ${#PIDS}
echo "${PIDS:0:${#PIDS}-1}"
# ./a.sh
1,2,3,4,5,
10
1,2,3,4,5

В ответ на ваше обновление ваш вывод мне кажется странным.Разве вы не должны отображать токен 4 вместо 6 во втором «срезе»?Если, возможно, я неправильно понимаю ваши входные данные.Вот что я получил:

# cat a.dat
#npviewer. 2768 deel   11u   REG                7,0 19218930   262562 /tmp/FlashXX2j3xhT (deleted) 
#npviewer. 2768 deel   12u   REG                7,0 32352982   262837 /tmp/FlashXX6R4nAq (deleted) 
#npviewer. 2768 deel   17u   REG                7,0 27289825   262824 /tmp/FlashXXuVBqbu (deleted) 
#npviewer. 2768 deel   18u   REG                7,0 21632133   262825 /tmp/FlashXXneoS8s (deleted) 
# cat a.sh
#!/bin/bash

while read i; do
  PID=`echo $i | cut -d " " -f 2`
  FD=`echo $i | cut -d " " -f 4`  
  FD=`echo ${FD:0:${#FD}-1}`
  echo $FD
done < a.dat

# ./a.sh
11
12
17
18

Хорошо, теперь я получаю именно то, о чем вы спрашиваете, и поскольку я раньше работал на Solaris, а сейчас на Linux, я получаю разные результаты.Так что, я думаю, точный синтаксис может варьироваться в зависимости от того, на какой оболочке / платформе вы находитесь.

Но я все же работал на моем Linux-устройстве под управлением Firefox.Разница в том, что в моей конфигурации, независимо от того, сколько окон ИЛИ вкладок я открываю, он все равно попадает под один и тот же идентификатор процесса (я использую Xubuntu с Firefox 3.6).Игнорируя это, мы все равно можем делать то, что вы пытаетесь сделать, выполняя процессы по одному и извлекая файловые дескрипторы для каждой итерации.См. Пример ниже:

user@host:~$ cat a
for p in `pgrep -f libflashplayer.so`
do
  for f in `lsof -p $p | grep tmp/Fl | cut -d " " -f 6 | while read fd; do echo ${fd%[a-z]}; done`
  do
    echo "cp /proc/${p}/fd/${f} ${HOME}/${p}_${f}.flvdone"
  done
done

user@host:~$ ./a
cp /proc/17492/fd/16 /home/user/17492_16.flvdone
cp /proc/17492/fd/19 /home/user/17492_19.flvdone
cp /proc/17492/fd/20 /home/user/17492_20.flvdone

Обратите внимание, что я не включил выражение "delete" grep, потому что оно не сразу удаляет файл в моей конфигурации.Посмотрите, можете ли вы изменить этот скрипт, чтобы он делал то, что вы пытаетесь сделать.Я не мог заставить часть $ {PIDS: 0: $ {# PIDS} -1} работать на моей машине, поэтому я переключаю команды подстроки, чтобы использовать вместо них оператор "%".Так получилось.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...