2017-02-09 3 views
-1

Я очень новичок в Linux. Шесть недель, если быть точным. Во всяком случае, я работаю над заданием, с которым я, похоже, не собираюсь. Я, чтобы создать сценарий, который при вводе:Linux Scripts и If elif else statements

sh filename.sh "username" 

в командной строке, то она возвращает или отображает информацию из каталогов /etc/passwd и /etc/group. Я сделал бесчисленное множество заявлений if/elif/else безрезультатно. Здесь я и сейчас. Если кто-то может обеспечить некоторый уровень направления здесь, он будет очень признателен. Я просто не вижу, где я ошибаюсь.

#! /bin/bash 

VAR1="$(grep bob /etc/passwd && grep bob /etc/group)" 
VAR2="$(grep henry /etc/passwd && grep henry /etc/group)" 

if [$VAR1]; then 
    echo "$VAR1" 
elif [$VAR2]; then 
    echo "$VAR2" 
else 
    echo "The user entered is invalid" 
fi 
exit 0 
+0

Попробуйте http://shellcheck.net/, прежде чем попросить помощи человека. См. Также раздел [Переполнение стека 'bash' wiki] (/ tags/bash/info) # или список очень распространенных вопросов. – tripleee

+0

Я искал два дня на такой вопрос. Я подозреваю, что мой поиск не задал правильный вопрос. Можете ли вы рассказать мне, как лучше всего сузить все результаты, которые я получаю при поиске? Или заголовок/заголовок, который показывает тему, о которой вы говорите? Я собираюсь посмотреть на shellcheck.net и wiki whhhh в надежде найти его. Спасибо за твою помощь!. –

+1

@ F.Garvin - я просто искал «bash if else statement» и получил этот результат: http://stackoverflow.com/questions/16034749/bash-script-if-elif-else-statement-issues - что получается быть правильным. Что вы искали? – codeforester

ответ

2

Попробуйте это:

#!/bin/bash 

VAR1="$(grep bob /etc/passwd && grep bob /etc/group)" 
VAR2="$(grep henry /etc/passwd && grep henry /etc/group)" 

if [ "$VAR1" ]; then 
    echo "$VAR1" 
elif [ "$VAR2" ]; then 
    echo "$VAR2" 
else 
    echo "The user entered is invalid" 
fi 

Изменение:

  • Разноса внутри условных (обязательно между кронштейном и аргументами)
  • Цитированием в условных (защищает от слова расщепления)
  • exit 0 в конце не требуется
  • Первая строка: как правило, не расстояние не используется после ! (хотя и не ошибка)
+0

Захват вывода 'grep' переменной, чтобы вы могли сравнить его с пустой строкой, является антипаттерном. 'if grep '^ henry'/etc/passwd && grep '^ henry'/etc/groups; то ... 'будет печатать любое совпадение и возвращать код выхода в' if' для управления потоком за один раз. (Используйте 'grep -q', если вы не хотите, чтобы матчи были напечатаны. Обратите внимание на отсутствие' ['и см. Также https://stackoverflow.com/questions/36371221/bash-if-statement-too-many-arguments если это сбивает вас с толку.) – tripleee

+0

Когда я добавляю пространство в состояние, оно отображается правильно. Однако, независимо от введенного имени пользователя, он отображает тот же вывод, который связан с VAR1. Я прочитал информацию на страницах, которые вы предоставили, и попробовал эти альтернативы, но это не сработало. Позвольте мне посмотреть, могу ли я опубликовать снимок экрана. –

+0

@ F.Garvin. '' ['$ VAR1"] 'test возвращает' 0' (true), если 'VAR1' расширяется до непустой строки. Если ваш блок 'if' всегда возвращает одно и то же, это потому, что эта переменная никогда не расширяется до пустой строки. Есть ли в VAR1, что вы ожидаете? – Fred