Для не оскорбления Вас, но если Вы знакомы с частью маршрутизации своей коммуникационной стопки TCP/IP на какой-либо машине Linux, необходимо также знать, что, результаты подключения двух сетевых интерфейсов к той же сети, непредсказуем в лучшем случае На вашем месте я или отключил бы беспроводную связь на своем ноутбуке или работал бы ifconfig eth0 down
команда (принимающий eth0 Ваше проводное соединение Ethernet) отключать его. Linux мог бы обладать некоторым интеллектом, чтобы сделать тот же выбор для каждого пакета, но в случае сетевого отклонения в какой-то момент, может привести к некоторым неожиданным результатам. Мои 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
В ksh надлежащее использование подстановок переменных является $ {variable_name}. И да, можно повторить это к терминалу или использовать его в тестовой команде, т.е. если [$ {variable_name} - eq $ {mynumber}] и т.д.
При пропуске использования фигурных скобок оно все еще работает большую часть времени, но, Вы будете более подвержены деланию ошибок. Таким образом, мое предложение состоит в том, чтобы использовать их в любом случае.
if
условие перестанет работать, если $variable_name будет содержать разделенные пробелом слова. Фигурные скобки не требуются при выполнении простого расширения параметра. Посмотрите Parameter Expansion
раздел руководства для всех ситуаций, где фигурные скобки требуются.
– glenn jackman
05.11.2013, 00:05
${varname:?}
. Это или глобальное set -u
инициирует ошибку на переменных сброса. Это находит опечатки в именах переменной.
– Henk Langeveld
05.11.2013, 22:00