Расширение параметров

Я пробую следующий код в оболочке для расширения параметров

#!/bin/sh
count
echo ${count:-60}
echo ${count:=120}
echo $count
echo ${count:+80}
x = 'The host name is google'
echo ${#x}

Выход

./test_varexp.sh: line 2: count: command not found
60
120
120
80
./test_varexp.sh: line 7: x: command not found
0

С приведенным выше кодом и выводом в контексте у меня есть следующие вопросы:

  1. Расширение параметра с помощью символа '=' должно установить значение count равным 120, что также рассматривается как происходящее, когда мы печатаем значение count, но в следующей строке оно перезаписывается, когда я использую то же самое с "+", которое следует только проверить на наличие. Может кто-нибудь объяснить эту аномалию? или Может кто-нибудь объяснить, существует ли счетчик на самом деле или нет?

  2. Расширение параметра для ${#x} вообще не работает. Может ли кто-нибудь сказать мне, есть ли синтаксическая ошибка?

Я пробую приведенный выше код

[root@dtltrhel5u8 shellscripts]# uname -a
Linux dtltrhel5u8 2.6.18-308.el5 #1 SMP Fri Jan 27 17:17:51 EST 2012 x86_64 x86_64 x86_64 GNU/Linux

person ChandraSPola    schedule 02.08.2015    source источник


Ответы (2)


Вы путаете здесь ряд вопросов. Оболочка будет размечать ваш ввод пробелом (или, как правило, IFS, но с соблюдением любых кавычек) и искать назначения и команды в этом порядке. Если первый токен содержит =, то это назначение, за которым могут следовать дальнейшие назначения или команда. Если нет, то это команда, а все остальные параметры являются аргументами команды. (Раньше было время, когда присваивания также могли следовать за командой, и есть способы заставить современные оболочки вести себя так, для обратной совместимости; но давайте просто проигнорируем этот побочный след.)

Итак, count - это команда, которой явно не существует. Возможно, вы имели в виду count=, чтобы определить переменную без значения (это отличается от оставления ее неустановленной).

Расширение ${count:+80} возвращает значение 80, если переменная установлена ​​и не пуста; это именно то, что вы получаете. Если бы переменная была пуста или не задана, вместо нее будет подставлена ​​пустая строка.

Если вы хотите присвоить значение x, опять же, знак равенства и значение должны быть частью первого токена; так

x='The host name is google'

Как только назначение сработает, длина строки больше не будет равна нулю.

person tripleee    schedule 02.08.2015
comment
${#x} не является bash расширением. Все расширения параметров в вопросе определены POSIX. - person chepner; 03.08.2015
comment
@chepner Верно; удалил этот отрывок - person tripleee; 04.08.2015

Ваш первый вопрос легко объясняется в документации http://www.gnu.org/software/bash/manual/html_node/Shell-Parameter-Expansion.html

В частности, ${count:+80} ничего не возвращает, если count не установлен, и 80, если он установлен. Значение count по-прежнему равно 120.

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

x='The host name is google'
echo ${#x}

печатает 23.

person arcticmac    schedule 02.08.2015
comment
Всем спасибо за разъяснения :) - person ChandraSPola; 06.08.2015