Отладка 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
Есть и другие проблемы с вашим сценарием, которые, я полагаю, должны быть оставлены на ваше усмотрение.