2014-09-17 3 views
0

Два вопроса о проблемах Я пишу скрипт BASH, который использует переменные. Я не могу для жизни понять это, и это УБИЛО меня.Ошибка в сценарии оболочки BASH - Использование переменных в качестве ссылок

1) У меня есть следующий код.

pdir=/media/The_Enforcer/ICA_Doug/Participants/RS1 
cd ${pdir} 

for subject in * ; do 
    subdir=${pdir}/${subject} ; 
    cd ${subdir} ; 
    subj= echo ${subject} | head -c-9 
    3dAFNItoNIFTI -prefix ICA/cleanRS_NII_${subj} RSFC_LFF_rall_${subj}+orig ; 
    cd ${pdir} ; 
done 

$ {subject} - это идентификатор субъекта, который является ########. Например: 1R101U1A.результаты. В основном мой код cd меня в этот каталог, в котором находится файл RSFC_LFF_rall_1R101U1A + orig, который я хочу обработать с помощью строки кода, которая начинается с 3dAFNItoNIFTI. Очевидно, я не могу использовать переменную $ {subject} в этой строке кода, потому что она попытается найти файл RSFC_LFF_rall_1R101U1A.results + orig, которого не существует. Поэтому, чтобы исправить это, я создал новую переменную под названием $ {subj}, которая через эхо-конвейер в основном отсекает последние 9 букв $ {subject}, которые, по сути, удаляют результаты. Когда я делаю это и эхо $ {subj}, он дает мне 1R101U1A, который именно то, что я хочу.

Однако строка кода, которая начинается с ошибками 3dAFNItoNIFTI со следующим:

FATAL ERROR: Can't open dataset 'RSFC_LFF_rall_+orig' 

Я попытался объявляя $ {Subj} переменную типа, пятью различными способами (в том числе с использованием голову, хвост, вырезать, и colons), и я все еще получаю эту ошибку. Что я делаю неправильно?

2) При попытке определить $ {Subj} во многих отношениях я также попробовал этот метод:

${subj}= ${subject:0:8} 

Когда я сделал это, последний кронштейн отказался закрыть - то есть закрывающая скобка не поворачивайте цвет открывающей скобки, и когда я попытался запустить скрипт, я получил ошибку в этой строке, говоря «команда не найдена». Я проверил свой синтаксис против примеров, которые я следовал, и это выглядит хорошо? Я что-то упустил?

+2

есть хотя бы одна проблема, что у вас есть дополнительное пространство в 'subj = echo $ {subject} | head -c-9' после '='. Также вы должны написать 'subj = $ (echo $ {subject} | head -c-9)', чтобы правильно выполнить присвоение (на самом деле, если вы просто удалите лишнее пространство, оно дает точно ошибку 'command not found' цитирую). В общем, вам следует рассмотреть возможность запуска скрипта через проверку орфографии, например. http://www.shellcheck.net/# – Erik

+0

Святое дерьмо это было пространство !? О, Боже, я чувствую себя идиотом. Огромное спасибо; Я, честно говоря, вероятно, не подумал бы даже проверить это самостоятельно. Кроме того, я понятия не имел, что shellcheck - это то, что у меня теперь есть закладки. Но да, это исправило мою проблему. Быстрый вопрос: есть ли у вас задание (с помощью метода $ (до эха) лучший способ по какой-либо конкретной причине? – chainhomelow

ответ

1

Попробуйте это:

cd "/media/The_Enforcer/ICA_Doug/Participants/RS1" 

for subject in * ; do 
    cd $subject 
    subj=${subject%.results} 
    3dAFNItoNIFTI -prefix ICA/cleanRS_NII_${subj} RSFC_LFF_rall_${subj}+orig 
    cd .. 
done 

${subject%.results} удаляет .results с конца строки. См. Shell-Parameter-Expansion.

+0

Это гораздо более элегантное решение, чем то, что я делаю. Кажется, я знаю достаточно, чтобы использовать но не достаточно, чтобы удалить вещи. Спасибо за ваш ответ, это будет полезно в остальных этих сценариях. – chainhomelow

Смежные вопросы