Linux cp с переменными

Я хотел бы скопировать файл, который указан переменной в Linux bash файл.

Вот как это не работает:

molecules = (1butene E2butene)
for molecule in ${molecules[*]}
do
    ### some stuff (works)
    formchk $molecule.chk $molecule.fchk
    ### cp doesn't work
    cp $molecule.com ${molecule}_scan.com
done

есть идеи?

РЕДАКТИРОВАТЬ: это также не работает, когда я удаляю пробелы вокруг "=". cp не выдает ошибки, но я не получаю второй файл с именем молекуле_scan.com

3 ответа

Основная проблема, которую я вижу, - это пробелы вокруг = в вашем назначении:

molecules=(1butene E2butene)
for molecule in "${molecules[@]}"
do
  ### some stuff (works)
  formchk "$molecule.chk" "$molecule.fchk"
  ### cp doesn't work
  cp "$molecule.com" "${molecule}_scan.com"
done

Другие вещи, которые я изменил, должны использовать @ вместо *, чтобы развернуть массив в список слов для цикла. Я также добавил кавычки вокруг всех расширений переменных, которые, хотя и не нужны в данном конкретном случае, являются хорошей привычкой.

Уберите пробелы в назначении:

molecules=(1butene E2butene)

Оболочка отделяет слова от пробелов, и присваивания должны читаться name=value,

Обратите внимание, что в вашем конкретном случае вам не нужны нестандартные массивы оболочки. Просто пиши

molecules="1butene E2butene"
for molecule in $molecules
do
  ### some stuff (works)
  formchk $molecule.chk $molecule.fchk
  ### cp doesn't work
  cp $molecule.com ${molecule}_scan.com
done

Если вы не можете понять, почему что-то в сценарии не работает должным образом, вы можете отследить выполнение, добавив строку с set -x до остальной части сценария.

Кажется, что это была проблема с подчеркиванием, это работает:

cp $molecule.com ${molecule}\_scan.com

В любом случае спасибо за вашу помощь:)

Другие вопросы по тегам