просмотр значений переменных в сценарии KSH

Для не оскорбления Вас, но если Вы знакомы с частью маршрутизации своей коммуникационной стопки TCP/IP на какой-либо машине Linux, необходимо также знать, что, результаты подключения двух сетевых интерфейсов к той же сети, непредсказуем в лучшем случае На вашем месте я или отключил бы беспроводную связь на своем ноутбуке или работал бы ifconfig eth0 down команда (принимающий eth0 Ваше проводное соединение Ethernet) отключать его. Linux мог бы обладать некоторым интеллектом, чтобы сделать тот же выбор для каждого пакета, но в случае сетевого отклонения в какой-то момент, может привести к некоторым неожиданным результатам. Мои 2 цента.

1
04.11.2013, 21:54
2 ответа

Во всей вероятности, что Вы хотите, set -x. Это активирует режим трассировки: оболочка печатает каждую команду прежде, чем выполнить его. Поместите это как вторую строку Вашего сценария, чуть ниже #! строка. Если Вы хотите выключить трассировки в части сценария, использовать set +x.

Для отображения значения переменной можно использовать echo "$somevariable", но это не всегда быть достаточно хорошим. Обязательно не опустите двойные кавычки: без двойных кавычек значение переменной интерпретируется как список подстановочных шаблонов имени файла вместо строки. Существует несколько значений переменной для который echo не работает. Под ksh я полагаю, что исчерпывающий список -e, -n, -ne и -en, все из которых интерпретируются как опции к echo. Для предотвращения этой интерпретации использовать print или printf вместо этого (две команды ниже эквивалентны):

print -r -- "$somevariable"
printf '%s\n' "$somevariable"

Если значение переменной будет содержать запаздывание пробельных или непечатаемых символов, то это не покажет на экране. Используйте %q Escape к printf вместо этого распечатать ненеоднозначное представление значения переменной.

printf '$%s is %q\n' somevariable "$somevariable"

Можно поместить это в функцию.

trace_variables () {
  typeset _trace_variables__var
  for _trace_variables__var; do
    typeset -n _trace_variables__ref="$_trace_variables__var"
    printf "%s = %q\\n" "$_trace_variables__var" "$_trace_variables__ref"
  done
}
…
trace_variables somevariable anothervariable
1
28.01.2020, 02:02

В ksh надлежащее использование подстановок переменных является $ {variable_name}. И да, можно повторить это к терминалу или использовать его в тестовой команде, т.е. если [$ {variable_name} - eq $ {mynumber}] и т.д.

При пропуске использования фигурных скобок оно все еще работает большую часть времени, но, Вы будете более подвержены деланию ошибок. Таким образом, мое предложение состоит в том, чтобы использовать их в любом случае.

-1
28.01.2020, 02:02
  • 1
    Не большой совет: не принимайте фигурные скобки за двойные кавычки. Ваш if условие перестанет работать, если $variable_name будет содержать разделенные пробелом слова. Фигурные скобки не требуются при выполнении простого расширения параметра. Посмотрите Parameter Expansion раздел руководства для всех ситуаций, где фигурные скобки требуются. –  glenn jackman 05.11.2013, 00:05
  • 2
    Фигурные скобки редко необходимы и нет ничего неправильно с исключением их 99,9% времени, они не необходимы. С другой стороны, двойные кавычки необходимы, как правило. Посмотрите $VAR по сравнению с $ {VAR} и заключить в кавычки или не заключить в кавычки. Помимо вводящего в заблуждение совета, Вы действительно не отвечаете на вопрос. –  Gilles 'SO- stop being evil' 05.11.2013, 00:06
  • 3
    , если Вы не используете фигурные скобки, Вы позволяете оболочке принять Ваше переменное расширение с символами на командной строке после переменной нет без известного разделителя. IT ВСЕГДА БОЛЕЕ БЕЗОПАСЕН ИСПОЛЬЗОВАТЬ ФИГУРНЫЕ СКОБКИ. Использование двойных кавычек, с другой стороны, до пользователя, зная природу значений, его переменные могут взять. Если Вы имеете дело с числовыми переменными и значениями цифр, в том же контексте Вы победили мою идею, каково использование двойных кавычек? Если Вы делаете строковую оценку, да они несколько полезны. –  MelBurslan 05.11.2013, 00:40
  • 4
    Если Вы обеспокоены ошибками, используйте фигурные скобки и протестируйте на законность с ${varname:?}. Это или глобальное set -u инициирует ошибку на переменных сброса. Это находит опечатки в именах переменной. –  Henk Langeveld 05.11.2013, 22:00
  • 5
    @Mel_Burslan Это полностью назад. Сразу очевидно в сценарии, необходимы ли фигурные скобки: это только зависит от синтаксиса сценария. Наоборот, никогда не очевидно, необходимы ли двойные кавычки: это зависит от значения переменной. история команд –  Gilles 'SO- stop being evil' 06.11.2013, 02:47

Теги

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