Тест для сбрасываемой переменной Bash, с помощью функции

Копирование здесь вообще не должно использоваться. Попробуйте вместо этого заполнить значение ячейки. Кроме того, вы не объявили переменную text, поэтому вы получаете объект требуемая ошибка. Ваш код должен читать:

Dim text As String
text = HTML_Content.getElementsByTagName("p")(0).innerText
Sheets(1).Range("L4").Value = text
28
задан codeforester 14 April 2018 в 02:23
поделиться

3 ответа

Я не совсем понял, что вам нужно. Я пытаюсь ответить вам, несмотря на это.

Т.е. мне нужно выйти, если тест не пройден.

Код:

${varName:?    "${varName} is not defined"}

вернет ненулевой код выхода, если нет переменной с именем "varName" , Код выхода последней команды сохраняется в $? .

О вашем коде:

val=${1:?    "${1}    must be defined, preferably in $basedir"}

Возможно, он не выполняет то, что вам нужно. В случае, если $ 1 не определено, «$ {1}» будет заменено ничем. Возможно, вы захотите использовать одинарные кавычки, которые буквально записывают $ {1} без подстановки.

val=${1:?    '${1}    must be defined, preferably in $basedir'
1
ответ дан 28 November 2019 в 02:39
поделиться

То, что вы ищете, - это косвенное обращение.

assertNotEmpty() {
    : "${!1:? "$1 is empty, aborting."}"
}

Это приводит к прерыванию сценария с сообщением об ошибке, если вы сделаете что-то вроде этого:

$ foo=""
$ assertNotEmpty foo
bash: !1:  foo is empty, aborting.

Если вы просто хотите проверьте , является ли foo пустым, вместо прерывания скрипта используйте это вместо функции:

[[ $foo ]]

Например:

until read -p "What is your name? " name && [[ $name ]]; do
    echo "You didn't enter your name.  Please, try again." >&2
done

Также обратите внимание на очень важное различие между пустым и неустановленным параметром. Будьте осторожны, чтобы не перепутать эти термины! Пустой параметр - это параметр, который установлен, но просто установлен в пустую строку. Неустановленный параметр - это параметр, которого вообще не существует.

Все предыдущие примеры проверяли наличие пустых параметров. Если вы хотите протестировать неустановленные параметры и считать все установленные параметры в порядке, то пусто или нет, используйте это:

[[ ! $foo && ${foo-_} ]]

Используйте его в такой функции:

assertIsSet() {
    [[ ! ${!1} && ${!1-_} ]] && {
        echo "$1 is not set, aborting." >&2
        exit 1
    }
}

Которая прерывает скрипт только тогда, когда имя параметра, которое вы передаете, обозначает параметр, который не установлен:

$ ( foo="blah"; assertIsSet foo; echo "Still running." )
Still running.
$ ( foo=""; assertIsSet foo; echo "Still running." )
Still running.
$ ( unset foo; assertIsSet foo; echo "Still running." )
foo is not set, aborting.
19
ответ дан 28 November 2019 в 02:39
поделиться

Благодаря ответу лхуната я попал на часть страницы Bash man , которую я пропустил сотни раз:

    When  not performing substring  expansion, bash tests for a parameter that
    is unset  or null; omitting the colon results in a test only for a parame‐
    ter that is unset.

Это побудило меня создать следующую таблицу истинности:


                | unset |   set    | set and  | meaning
                |       | but null | not null |
    ============+=======+==========+==========+=============================
     ${var-_}   |   T   |     F    |    T     | not null or not set
    ------------+-------+----------+----------+-----------------------------
     ${var:-_}  |   T   |     T    |    T     | always true, use for subst.
    ------------+-------+----------+----------+-----------------------------
     $var       |   F   |     F    |    T     | var is set and not null
    ------------+-------+----------+----------+-----------------------------
     ${!var[@]} |   F   |     T    |    T     | var is set

Эта таблица вводит спецификацию в последней строке. На странице Bash man написано: «Если имя не является массивом, расширяется до 0, если имя установлено, и до нуля в противном случае». Для целей этой таблицы истинности она ведет себя одинаково, даже если это массив.

46
ответ дан 28 November 2019 в 02:39
поделиться
Другие вопросы по тегам:

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