#bash #shell #windows-10
#bash #оболочка #windows-10
Вопрос:
Вот сценарий, о котором я говорю
#!/bin/bash
_sv="77777777777777777a"
if [ -n "${!_sv}" ]; then
echo "the value is there"
${echo} "${!sv}"
elif [ -n "${!1}" ]; then
echo "${!1}"
else
echo "False"
fi
Когда я запускаю его с sh test.sh или как bash test.sh в GNU bash
в Windows10 (с использованием Cmder) это выдает ошибку плохой замены
dir_1/test.sh: line 2: 77777777777777777a: bad substitution
Но один и тот же скрипт выполняется без каких-либо ошибок в оболочке терминала macOS и в Windows10, тогда и только тогда, когда переменная является чисто буквенной или числовой.
ВАЖНО: если значение _sv является буквенно-цифровым, это выдает ошибку неправильной замены.
Пожалуйста, помогите!
Комментарии:
1. 77777777777777777a — недопустимое имя переменной, имена переменных не могут содержать цифру в качестве первого символа.
Ответ №1:
Это ожидаемое поведение. Вы получаете эту ошибку, потому что ваше имя, которое вы пытаетесь расширить, не является допустимым именем переменной.
Эта проверка была введена в Bash 4.4 commit a0c0a00fc419b7:
@@ -5926,6 6661,16 @@ parameter_brace_expand_indir (name, var_is_special, quoted, quoted_dollar_atp, c
if (t == 0)
return (WORD_DESC *)NULL;
if (valid_brace_expansion_word (t, SPECIAL_VAR (t, 0)) == 0)
{
report_error (_("%s: bad substitution"), t);
free (t);
w = alloc_word_desc ();
w->word = amp;expand_param_error;
w->flags = 0;
return (w);
}
w = parameter_brace_expand_word (t, SPECIAL_VAR(t, 0), quoted, 0, 0);
free (t);
Предыдущие версии вместо этого расширяли это до пустой строки. Это включает в себя Bash 3.2 от macOS.
Комментарии:
1. Выше приведено правильное объяснение, почему возникает ошибка. Способ, которым я преодолел ошибку, заключался в том, что я включил в нее проверку if, которая проверяет, начинается ли она с number.