2012-06-06 2 views
1

У меня есть следующиеBash значение в массиве

#!/bin/bash 
aprograms=`pgrep a` 
echo $aprograms 

, который выводит:

[email protected]:~$ bash test.sh 
2 6 7 8 12 13 16 17 20 27 ... 

Я хочу контролировать, если имеется значение в $ aprograms. I судимое следующее (который я не знаю, если его даже обоснованный подход):

if [ $value in $aprograms ];then 
    echo "found" 

Но не работает. Есть ли правильный способ контролировать, есть ли значение внутри $ aprograms?

ответ

1

вы могли бы использовать в Bash parameter expansion.

shopt -s extglob 
var="2 6 7 8 12 13 16 17 20 27" 
if [ "${var/17?()/}" != "$var" ] ; then echo "match"; fi 
+0

Это также обнаружило бы '17' в строке' 1177' – Arsen7

+0

пробелов около 17. – tuxuday

+1

Тогда оно не обнаружило бы '17', если это будет последнее или первое значение в этой строке. :) Но мне нравится направление, в котором идет ваш ответ. – Arsen7

1
#!/bin/bash 

function foo() { 
    echo 2 6 7 8 12 13 16 17 20 27 
} 

function search_value() { 
    for i in $2; do { 
    if [ $i -eq $1 ]; then { 
     echo "found" 
    } fi 
    } done 
} 

search_value 13 "$(foo)" 

Просто измените foo с входной программе:

search_value 13 "$(pgrep a)"  
+0

Следует помнить, что это решение работает только для строки, содержащей целые значения. 'search_value a" a b c "' выдаст ошибку. – Arsen7

+0

Это правда, когда я читал пример вопроса. Я догадался, что он работает с целыми числами. Некоторые переменные '' 'around и использование' == 'как оператора вместо' -eq' должны работать даже для строк. –

+0

Да, я тоже был немного шокирован тем, что, по-видимому, bash невосприимчив к инъекции __semicolon__, когда я пытался его обслуживать например 'search_value 12 '1; делать; конец ; ls; "' :) – Arsen7

0
-eq 

равно

if [ "$a" -eq "$b" ] 
+0

[источник] (http://tldp.org/LDP/abs/html/comparison-ops.html) –

+0

Но вопрос был в том, чтобы найти элемент в чем-то, что выглядит как массив, а не о сравнивая значения. – Arsen7

+0

Посмотрите, поможет ли это, [результаты bash grep в массив] (http://stackoverflow.com/questions/8205777/bash-grep-results-into-array) –

1
if [[ " $aprograms " =~ \ $value\ ]] ; then 
    echo "found" 
fi 

Кроме того, с grep

if pgrep a | grep -q -w "$value" ; then 
    echo "found: 
fi 
0

Так как pgrep выходы PIDs один на линии, вы можете использовать grep, чтобы найти тот, который вы ищете.

#!/bin/bash 
aprograms=$(pgrep a) 
echo "$aprograms" 
if grep -Fxqs "$value" <<< "$aprograms" 
then 
    echo "found" 
fi 

Всегда указывайте переменные, когда они расширены, чтобы сохранить пробелы.

Опция -F для grep использует шаблон как фиксированную строку вместо регулярного выражения. Опция -x соответствует всей строке, поэтому меньшие строки или цифры не соответствуют частям более крупных. Параметры -q и -s подавляют выход и выход ошибки. Если в вашей версии grep нет этих данных, используйте:

if grep -Fx "$value" <<< "$aprograms" > /dev/null >&2 
Смежные вопросы