Не удалось объединить 2 переменные

Мне нужно объединить 2 строковые переменные в bash на моей машине Centos 6

for f in *.tar.gz; do basename ${f%.tar.gz} echo $basename dbaddress='mysql/*.sql' path="${basename}${dbaddress}" echo $path tar -zxvf $f $path done 

Сценарий должен извлекать все .sql-файлы в каталоге basename / mysql /. Но вывод моего кода выглядит следующим образом:

 basename mysql/*.sql tar: mysql/*.sql: Not found in archive tar: Exiting with failure status due to previous errors 

Как вы видите, $ basename не добавляется к $ dbaddress. Я что-то упускаю?

  • Получить полный путь из сценария Bash
  • в bash, читать после того, как труба не устанавливает значения
  • Итерация через аргументы командной строки в Bash
  • Как увеличить количество предыдущего командного текста bash будет прокручиваться до?
  • Как использовать переменную плюс glob ($ var *) в bash
  • Переместить курсорные клавиши в режиме bash vi на <nop> (отключить курсоры)
  • bash -c и неинтерактивная оболочка
  • Что означает PROG = $ {0 ## * /} в сценарии bash?
  • 3 Solutions collect form web for “Не удалось объединить 2 переменные”

    Вы ссылаетесь на переменную basename$basename ), но никогда не присваиваете ее чему-либо, что означает, что она читает bash как пустую строку. Возможно, вам придется попробовать basename=${f%.tar.gz} .

    Вы можете попробовать это, чтобы объединить две переменные:

     var1="Hello" var2="$var1 world!" 

    Но в вашем коде вы не объявляете переменную basename !

    Попробуйте basename=${f%.tar.gz} .

    Чтобы отладить такие проблемы, поместите set -x перед циклом в ваш скрипт, и вы увидите, что выполняет каждая команда ( set +x чтобы отключить это).

    Вы увидите, что на самом деле вы выполняете basename ${f%.tar.gz} , предположительно, в файле basename.tar.gz который просто basename но не сохраняет его для какой-либо переменной. Затем вы echo $basename и echo $basename переменной пусто, поэтому вы видите пустую строку на выходе.

    Linux и Unix - лучшая ОС в мире.