У меня есть скрипт, который проверяет, есть ли здесь домашний каталог пользователей, это бит, с которым я застрял
j=`su $p -c df -h | grep $p`
кто-нибудь может помочь мне здесь? DF-H не будет работать, но DF будет работать ...
У меня есть скрипт, который проверяет, есть ли здесь домашний каталог пользователей, это бит, с которым я застрял
j=`su $p -c df -h | grep $p`
кто-нибудь может помочь мне здесь? DF-H не будет работать, но DF будет работать ...
Вы это усложняете.
Здесь я предполагаю, что $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
самом деле описывает, что означает значение этой переменной.