Оболочка: непрямое расширение выдает плохую замену, я Windows, но не Mac

#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.