Отладка BASH ЕСЛИ Условия

Я получаю сообщение об ошибке, когда пытаюсь выполнить задание.

#!/bin/bash
## Assignment 2

echo Please enter a User Name:
read u
if [ $u!="root"]; then
        echo Searching for Username!
        grep $u /etc/passwd|sed 's/$u/hidden/gi'
elif [ $u!="toor"]; then
        echo Root is NOT allowed.
else
        echo Toor is definetely NOT allowed.
fi

Выход:

Please enter a User Name:
user1
./assign2.sh: line 6: [bthiessen: command not found
./assign2.sh: line 9: [bthiessen: command not found
Toor is definetely NOT allowed.

Что не так с моими заявлениями if?

4 ответа

Решение

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

#!/bin/bash

echo Please enter a User Name:
read u
if [[ $u != "root" ]]; then
        echo Searching for Username!
        grep "$u" /etc/passwd | sed "s/$u/hidden/gi"
elif [[ $u != "toor" ]]; then
        echo Root is NOT allowed.
else
        echo Toor is definetely NOT allowed.
fi

проблемы найдены:

  • [ $u!="root"] нужно пространство вокруг !=
  • если вы используете переменные в sed, вам нужно " цитаты, не просто '

примечание:

[[ это ключевое слово bash, похожее на (но более мощное, чем) [ команда. См. http://mywiki.wooledge.org/BashFAQ/031 и http://mywiki.wooledge.org/BashGuide/TestsAndConditionals. Если вы не пишете для POSIX sh, мы рекомендуем [[

Узнайте разницу между ' а также " и `. Смотрите http://mywiki.wooledge.org/Quotes и http://wiki.bash-hackers.org/syntax/words

Пробелы здесь учитываются:

if [[ $u!="root" ]]; then

А также:

elif [[ $u!="toor" ]]; then

Также предпочитаю [[ над [,

Для отладки скриптов bash вы также можете использовать bash -x а также set -x:

bash -x script.sh запускает существующий скрипт с отладочными сообщениями, он выводит строки перед их выполнением.

С set -x Вы можете включить это поведение непосредственно в своем скрипте, например, в первой строке после шебанга. (Это вроде как echo on в сценариях Windows.) set +x отключает эту опцию

Это даже возможно, хотя вряд ли полезно, set -x в интерактивных оболочках.

Все это хорошо объясняется в Руководстве по Bash для начинающих, в разделе " Отладка сценариев Bash".

if [ $u!="root"]; then
elif [ $u!="toor"]; then

Там должны быть пробелы внутри квадратных скобок и вокруг != оператор. Пробел обязателен. Это также хорошая практика, чтобы цитировать "$u" в случае, если имя пользователя имеет пробелы или не заполнено.

if [ "$u" != "root" ]; then
elif [ "$u" != "toor" ]; then

Есть и другие проблемы с вашим сценарием, которые, я полагаю, должны быть оставлены на ваше усмотрение.

Другие вопросы по тегам