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
В любом случае спасибо за вашу помощь:)