Очень короткий, если, еще, фантастический сценарий. Я что-то упустил где-то. Пожалуйста, помогите - PullRequest
1 голос
/ 18 января 2012

Simple Bash +1 пожалуйста

Привет.Я знаю, что мне не хватает чего-то простого в этом сценарии.Но что это?выход?фи? Когда я использую Name -online , я получаю эхо "Bool Changed offline2" из самого последнего раздела.Онлайн код не должен конфликтовать с Offline.Помогите, я занимаюсь этим часами.

if [ "$1" == "-online" ]; then
        if [ "$Check" == "com.company.package1" ]; then
            plutil -key settingsOfflineMode -value 0 -type bool /the/dir/ect/ory/com.company.package1 &> /dev/null
            echo "Bool Changed online1"
            exit
        fi
    else
        if [ "$Check" == "com.company.package2" ]; then
            plutil -key settingsOfflineMode -value 0 -type bool /the/dir/ect/ory/com.company.package2 &> /dev/null  ////EDITED TO com.company.package2
            echo "Bool Changed online2"
            exit        
        fi
    fi


if [ "$1" == "-offline" ]; then
        if [ "$Check" == "com.company.package1" ]; then
            plutil -key settingsOfflineMode -value 0 -type bool /the/dir/ect/ory/com.company.package1 &> /dev/null
            echo "Bool Changed offline1"
            exit
        fi
    else
        if [ "$Check" == "com.company.package2" ]; then
            plutil -key settingsOfflineMode -value 0 -type bool /the/dir/ect/ory/com.company.package2 &> /dev/null  //EDITED TO com.company.package2
            echo "Bool Changed offline2"
            exit        
        fi
    fi

Ответы [ 6 ]

4 голосов
/ 19 января 2012

Предполагая, что $Check установлено в "com.company.package2" (что, к сожалению, вы не показываете), это то, что делает ваш скрипт:

  • Первый if истина, потому что аргумент команды - "-online".
  • Второй if ложен ("package2"! = "package1")
  • Первый else пропускается, так какпервый if был истинным
  • "-offline" if является ложным, поэтому его путь else взят
  • Последний if истинен ("package2"!= "package2"), поэтому сообщение выводится

else if не совпадает с elif

Поскольку вы закрываете внутренние операторы if с помощью fi,else вычисляется для внешних операторов if.

Вы, вероятно, хотите:

#!/bin/bash

Check=com.company.package2

if [[ $1 == "-online" ]]; then
        if [[ $Check == "com.company.package1" ]]; then
            plutil -key settingsOfflineMode -value 0 -type bool /the/dir/ect/ory/com.company.package1 &> /dev/null
            echo "Bool Changed online1"
            exit
        elif [[ $Check == "com.company.package2" ]]; then
            plutil -key settingsOfflineMode -value 0 -type bool /the/dir/ect/ory/com.company.package2 &> /dev/null  ////EDITED TO com.company.package2
            echo "Bool Changed online2"
            exit
        fi
elif [[ $1 == "-offline" ]]; then
        if [[ $Check == "com.company.package1" ]]; then
            plutil -key settingsOfflineMode -value 0 -type bool /the/dir/ect/ory/com.company.package1 &> /dev/null
            echo "Bool Changed offline1"
            exit
        elif [[ $Check == "com.company.package2" ]]; then
            plutil -key settingsOfflineMode -value 0 -type bool /the/dir/ect/ory/com.company.package2 &> /dev/null  //EDITED TO com.company.package2
            echo "Bool Changed offline2"
            exit
        fi
fi
0 голосов
/ 19 января 2012

Я очистил ваш код:

  • Я использую = вместо == для строк равных. Более новые версии Bash будут использовать одну из них. Однако в более ранней версии тесты == и ]] проходили только *1007*, а иногда просто не выполняли то, что вы ожидаете.
  • Объедините ваши операторы if с синтаксисом , либо [ ... ] && [ ... ], либо с синтаксисом [ ... -a ... ]. Это упростит вашу логику. [[ ... && ... ]].
  • Используйте elif вместо того, чтобы помещать предложение if в предложение else. Опять же, это упрощает ваш синтаксис.
  • Удалены выходы. Вся логическая структура теперь выполняет только одно из четырех условий. Нет необходимости для выхода в этом контенте.
  • Где установлен $Check? Это переменная, установленная вне вашей программы? Если это так, убедитесь, что он был экспортирован , чтобы он был определен в под-оболочках и сценариях оболочки.

После того, как я внес изменения, скрипт, похоже, заработал. Мне пришлось установить $Check перед запуском скрипта, и мне пришлось отключить команду plutil, так как у меня ее нет в моей системе, но логика работает.

Главное, что вы можете сделать, это установить set -xv при запуске сценария оболочки. Это включает отладку. -x распечатывает командную строку после развертывания и показывает, что было установлено. -v показывает, что командная строка выполняется как написано.

Например:

$ set -v
$ ls f*
ls f*
foo.txt foobar.txt
$ set -x
ls f*
ls foo.txt foobar.txt
foo.txt foobar.txt

Чтобы отключить отладку, просто сделайте set +xv. Фактически, вы можете сделать set -xv и set +xv в разделах длинного сценария оболочки, где у вас возникают проблемы. Таким образом, вы не перегружены отладочной информацией.

Вот ваша программа:

#! /bin/bash

#set -xv

if [[ "$1" == "-online" ]]; then
    if [[ "$Check" == "com.company.package1" ]]; then
        plutil -key settingsOfflineMode -value 0 -type bool /the/dir/ect/ory/com.company.package1 &> /dev/null
        echo "Bool Changed online1"
    elif [[ "$Check" == "com.company.package2" ]]; then
        plutil -key settingsOfflineMode -value 0 -type bool /the/dir/ect/ory/com.company.package2 &> /dev/null  ////EDITED TO com.company.package2
        echo "Bool Changed online2"
    fi
elif [[ "$1" == "-offline" ]]; then
    if [[ "$Check" == "com.company.package1" ]]; then
        plutil -key settingsOfflineMode -value 0 -type bool /the/dir/ect/ory/com.company.package1 &> /dev/null
        echo "Bool Changed offline1"
    elif [[ "$Check" == "com.company.package2" ]]; then
        plutil -key settingsOfflineMode -value 0 -type bool /the/dir/ect/ory/com.company.package2 &> /dev/null  //EDITED TO com.company.package2
        echo "Bool Changed offline2"
    fi
fi
0 голосов
/ 19 января 2012

Кажется, что $Check равно com.company.package2.

Вы переходите к первому оператору if, потому что ваш аргумент "-online", тогда $ Check не равен com.company.package1, поэтому вы выходите из него, если ничего не делаете ...

Приходит второй оператор if, который проверяет -offline, который не является истинным утверждением в вашем случае, тогда вы переходите в else ...

Наконец $Check равно com.company.package2, и вы выводите команду эха ...

0 голосов
/ 19 января 2012

замените else на elif:

if [ "$1" == "-online" ]; then
    if [ "$Check" == "com.company.package1" ]; then
        echo "Bool Changed online1"
        exit
    elif [ "$Check" == "com.company.package2" ]; then
        echo "Bool Changed online2"
        exit
    fi
fi

if [ "$1" == "-offline" ]; then
    if [ "$Check" == "com.company.package1" ]; then
        echo "Bool Changed offline1"
        exit
    elif [ "$Check" == "com.company.package2" ]; then
        echo "Bool Changed offline2"
        exit
    fi
fi

echo "Combination [Check=$Check / param1=$1] did not match any case"

РЕДАКТИРОВАТЬ: ой, я только что понял, @ v01pe означает то же самое: - /

0 голосов
/ 18 января 2012

остальные должны быть во внутреннем, если, верно? Я думаю, что это проблема! вместо этого используйте elif

if [ "$Check" == "com.company.package1" ]; then
    ...
elif [ "$Check" == "com.company.package2" ]; then
    ...
fi
0 голосов
/ 18 января 2012

Может ли это быть ';' сразу после ваших условий if?

if [ "$1" == "-online" ]**;** then
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...