2017-01-12 8 views
-1

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

Вот как это делает не работы:

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 

любые идеи?

EDIT: он также не работает, когда я удаляю пробелы arround "=". ф не проливает ошибки, но я не получаю второй файл, который называется molecule_scan.com

+4

Используйте https://www.shellcheck.net, чтобы исправить проблемы синтаксиса в ваш скрипт – Inian

+1

@ user7408924, пожалуйста, убедитесь, что вы можете воспроизвести проблему с минимальным примером, который вы опубликовали в вопросе. Если вы видите какие-либо конкретные ошибки, добавьте их в свой вопрос. –

+0

Есть ли у вашего скрипта какие-либо возможности для окончания строки DOS? См. Http://stackoverflow.com/tags/bash/info в разделе «Перед тем, как задавать проблемный код» – chepner

ответ

0

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

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 перед остальной частью сценария.

+0

спасибо за ваш ответ. все еще не работает:/может ли это быть чем-то с правами на чтение/запись? – user7408924

+0

@ user7408924 Пожалуйста, укажите, что именно это не работает, например. сообщение об ошибке. Может ли быть, что нет файла '$ молекула.com' для копирования? Каков результат/эффект запуска 'formchk'? – Jens

+0

Я ожидаю, что у каждой молекулы будет два файла. 1butene.com и 1butene_scan.com. Однако, я не получаю второй файл. там определенно есть файл 1butene.com и нет ошибки с set -x; formchk просто преобразует другой файл. Я помещаю его в качестве примера, чтобы показать, что цикл работает в принципе – user7408924

4

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

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 

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

+0

спасибо за ваш ответ. см. комментарий в op – user7408924

-2

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

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

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

+0

Если ваша оболочка действительно Bash, и вы используете стандартную утилиту 'cp' в Linux, добавление' \ 'не должно иметь никакого значения. – mklement0

+2

Это, конечно же, не проблема. Есть то, о чем вы нам не говорите. Вы забыли фигурные скобки? Потому что 'cp $ molule.com $ molule_scan.com' фактически приводит к запуску' cp 1butene.com .com'. У вас есть файл '.com'? – Jens

+0

Нет фигур и там есть файл 1butene.com – user7408924