Контакт, с если оператор

Если вы не связаны grep , вы можете использовать awk и разделить записи на :

awk 'BEGIN {RS=":"} /^\/opt\/gnome$/'
-121--42397-

Я не знаю, достаточно ли это для ответа, но

grep -w "/opt/gnome"

удовлетворит вашу потребность.

echo '/sbin:/usr/sbin:/opt/gnome:/var/opt/gnome' | grep -w "/opt/gnome" -o
/opt/gnome
echo '/opt/gnome:/sbin:/usr/sbin:/var/opt/gnome' | grep -w "/opt/gnome" -o
/opt/gnome

, но

echo '/opt/gnome:/sbin:/usr/sbin:/var/opt/gnome' | grep "/opt/gnome" -o
/opt/gnome
/opt/gnome
-121--42399-

Я столкнулся с той же проблемой после того, как мое ssh-соединение неожиданно закрылось сообщением Write Failed: breaked pipe , пока у меня был подключен сеанс экрана. Тем не менее, я не смог получить мой сеанс экрана для повторного подключения с помощью любой из команд выше. Обратите внимание, что я использую следующую версию:

~> screen --version
Screen version 4.00.03 (FAU) 23-Oct-06

Видимо, еще был экземпляр sshd , который удерживал меня от отсоединения и повторного подключения сеанса. После идентификации PID соответствующего экземпляра sshd и kill после его повторного подключения с помощью экрана -r .


Только для информации: Вы определенно найдете несколько sshd демонов, один будет соответствовать вашему текущему имени входа и другой, принадлежащий устаревшему экранному сеансу (действительно, может быть несколько других sshd , работающих, принадлежащих нескольким другим экранным сеансам).

0
13.04.2017, 15:36
2 ответа

Тест [-F «$ DIR»] истинствует, если существует и является файлом . Это не то, что вы хотите вообще. Как я предложил в вашем предыдущем вопросе, вы должны использовать $ # , чтобы проверить, был ли пройден аргумент. Тогда вы можете использовать -E , чтобы проверить, существует ли этот аргумент.

Следующая проблема состоит в том, что находятся также будут список . , текущий каталог. Вы можете использовать -Mindepth 1 , чтобы избежать этого с GNU . :

DIR="$1"

if [ $# -lt 1 ]
then
    echo "Please pass at least one argument" && exit   
fi
if [ -e "$DIR" ]
then
     echo -n "total directories:" ; find "$DIR" -mindepth 1 -type d | wc -l
     echo -n "total files:" ; find $DIR -type f | wc -l
else
      echo "Directory doesn't exist"
fi

Вы также можете конденсироваться выше (хотя эта версия не отличается дифференцированием каталога, которое не существует И тот, который является файлом, а не каталогом):

dir="$1"
[ $# -lt 1 ] && echo "Please pass at least one argument" && exit
[ -d "$dir" ] && printf "total directories: %s\ntotal files:%s\n" \
              $(find "$dir" -type d | wc -l) $(find "$dir" -type f | wc -l) ||
    printf "%s\n" "There is no directory named '$dir'."
2
28.01.2020, 02:28

Как у вас есть в своем последнем условном состоянии, вы проверяете, $ DIR относится к «обычному файлу». То есть не каталог. Таким образом, он всегда терпит неудачу (так как вы всегда даете каталоги, предположительно) и печати «Пожалуйста, передайте правильные аргументы».

Что касается каталога, считается «неверным», - нет. Если вы должны были запустить команду «Найти» вручную, так как она находится в сценарии, вы увидите, что он возвращает каталог в корневой основе его поиска, а также его подкаталоги. Таким образом, вы можете знать, что он считает данный каталог или получить ответ, который вы хотели, просто уменьшая количество после вызова.

Это кажется тем, что вы ищете. Потерпите меня; Я проверил, что это работает, но я не эксперт на Баш.

DIR="$1"

if [ ! -d "$DIR" ]  #If not a directory, 
then
    echo " please pass correct arguments"
    exit 1
fi

# We know for sure $DIR is present and a directory, so we know
# that it will show up in the find results for type d. Decrement.
echo -n "total directories:" $(($(find $DIR -type d | wc -l) - 1))
echo
echo -n "total files:" ; find $DIR -type f | wc -l
1
28.01.2020, 02:28

Теги

Похожие вопросы