Переменная из условного оператора

У меня есть несколько сценариев, которые я беру на себя, которые используют оболочку Bash, внутри условного оператора есть оператор find.

Что-то вроде этого:

if [ -z $(find / -type f -perm -002) ] ; then echo "no world writable found"

где в качестве еще я хотел бы отображать то, что было найдено вместо world write perms found.

Я могу сделать:

echo $(find / -type f -perm -002) has world write permissions

или установите переменную в $(find / -type f -perm -002).

Но было интересно, есть ли лучший способ сделать это. Есть ли другой способ получить содержимое оператора find в виде переменной?


person d3051    schedule 17.10.2014    source источник
comment
Что плохого в том, чтобы присвоить результат поиска переменной?   -  person ceving    schedule 17.10.2014
comment
result=$(find / -type f -perm -002) или local result=$(find / -type f -perm -002), если бы они содержались в функции, были бы идиоматическим способом.   -  person helpermethod    schedule 17.10.2014
comment
Обратите внимание, что в оригинале вам нужно заключить подстановку команды в кавычки, потому что, если она расширяется до более чем одного слова, [ будет жаловаться на слишком много операндов.   -  person chepner    schedule 17.10.2014
comment
Это довольно часто длинный список. Руководство подчеркнуло минимальные изменения в качестве предпочтения. Поэтому просто исследую возможность того, что может быть какое-то неизвестное мне сумасшедшее регулярное выражение, которое будет использовать то, что есть, для представления содержимого в команде поиска, не заставляя его снова запускаться.   -  person d3051    schedule 17.10.2014


Ответы (3)


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

RESULT=$(find / -type f -perm -002)
if [ -z "$RESULT" ]
then
    echo "no world writable found"
else
    echo "$RESULT has world write permissions"
fi
person Chris Maes    schedule 17.10.2014
comment
Посмотрев на это, это кажется самым элегантным способом. Я буду настаивать на этом в Mgmt. Спасибо! - person d3051; 17.10.2014

Вы можете использовать sed, чтобы вставить заголовок, если хотите.

REPORT=$(find /tmp -type f -perm -002 | sed '1s/^/Found world write permissions:\n/')
echo ${REPORT:-No world writable found.}

Обратите внимание: ваш пример кажется неправильным, потому что find может возвращать более одной строки.

А awk может делать и то и другое одновременно:

find /tmp -type f -perm -002 | 
awk -- '1{print "Found world write permissions:";print};END{if(NR==0)print "No world writable found."}'
person ceving    schedule 17.10.2014
comment
Это умно. Я узнал кое-что здесь. Спасибо за ваш ответ! - person d3051; 17.10.2014

Если вы не возражаете против отсутствия сообщения no world writable found, вы можете использовать один оператор find, и все:

find / -type f -perm -002 -printf '%p has world write permissions\n'

Если вам нужно сохранить возвращенные файлы для будущего использования, сохраните их в массиве (при условии, что Bash):

#!/bin/bash

files=()

while IFS= read -r -d '' f; do
    files+=( "$f" )
    # You may also print the message:
    printf '%s has world write permissions\n' "$f"
done < <(find / -type f -perm -002 -print0)

# At this point, you have all the found files
# You may print a message if no files were found:

if ((${#files[@]}==0)); then
    printf 'No world writable files found\n'
    exit 0
fi

# Here you can do some processing with the files found...
person gniourf_gniourf    schedule 17.10.2014
comment
Объяснит ли разбушевавшийся даунвотер свой поступок? - person gniourf_gniourf; 23.10.2014