-1

У меня есть скрипт, который проверяет, есть ли здесь домашний каталог пользователей, это бит, с которым я застрял

j=`su $p -c df -h | grep $p`

кто-нибудь может помочь мне здесь? DF-H не будет работать, но DF будет работать ...

1 ответ1

0

Вы это усложняете.

Здесь я предполагаю, что $p содержит имя пользователя, которого вы в данный момент интересуете (поскольку вы передаете его в su), и что вы просто заинтересованы в ответе да / нет относительно того, существует ли домашний каталог.

Мы можем воспользоваться тем, что в bash ~username расширяется до пути к домашнему каталогу для username . Это сделано в этом ответе (у вопроса есть другие ответы, указывающие также на другие потенциальные решения):

eval echo ~$USER

Затем мы можем воспользоваться тем фактом, что test -d проверяет, существует ли имя файловой системы "существует и является ли каталогом", и использовать подстановку подстановки вместе с eval чтобы передать ему расширенное значение для ~username :

test -d $( eval echo ~"$p" ) && echo yes

Это выполнит echo yes если и только если (потому что оно следует за && , которое требует, чтобы предыдущая команда возвратила статус успеха) (1) существует домашний каталог для пользователя с именем $p (обратите внимание, что это не зависит на нем есть какое-либо конкретное местоположение в файловой системе), и (2) это каталог. Цитирование гарантирует, что это не сломается, если имя пользователя содержит пробелы (что допустимо, но редко встречается в Unix-подобных системах).

Просто замените echo yes на все, что вы хотите. У меня такое ощущение, что вы просто хотите, чтобы $j был не-emtpy, если домашний каталог существует, и в этом случае вы можете сделать что-то похожее (этот фрагмент будет формировать тело цикла):

unset j
test -d $( eval echo ~"$p" ) && j=1
if test -n "$j"; then
    echo Home directory found for "$p"
else
    echo Home directory NOT found for "$p"
fi

(последняя строка, очевидно, будет заменена любой конкретной логикой, которую вы имеете в виду)

Если вы действительно нуждаетесь в выводе df , вам не составит труда адаптировать приведенный выше скрипт для его предоставления. Пока я оставляю это как упражнение читателю.

О, и попробуйте использовать более описательные имена переменных. Это очень поможет в следующий раз, когда вам нужно будет внести какие-либо коррективы в этот скрипт. Например, $p будет намного лучше, чем $user , потому что $user самом деле описывает, что означает значение этой переменной.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .