2014-10-05 3 views
0

мне нужно использовать эту командуBash вставить переменную в backticked команду

/usr/local/bin/mcl find -f .bz2 

, который возвращает мне этот

:???????? '/Cloud Drive/test1.bz2' 
:???????? '/Cloud Drive/test2.bz2' 

в BASH сценарий. Проблема в том, что мне нужен последний параметр (.bz2) как переменная.

Я пытался с этим

FILENAME=".bz2" 
UPLOADED=$(/usr/local/bin/mcl find -f $FILENAME) 
# do something with $UPLOADED 

Но очевидно, что он не работает. После некоторого исследования StackOverflow и в Интернете я нашел несколько способов сделать что-то подобное (даже используя обратные ссылки), но все же я не могу заставить его работать.

Каков правильный способ сделать это?

+1

Эта структура работает для меня. Если я создаю файл BASH, содержащий содержимое VARIABLE = "", за которым следует 'RESULT = $ (echo $ VARIABLE)', тогда 'echo $ RESULT' выводит просто' content'. Что вы получаете вместо ожидаемого результата? Можете ли вы изменить свой вопрос, чтобы добавить сообщение об ошибке или неправильный вывод? – Bobulous

+0

@ Арканон, это правда для 'content'. Это неверно для '$ 'content \ n \ n'' - завершающие символы новой строки лишаются. Это неверно для '' * "', если вы не исправите котирование во время расширения ('echo" $ VARIABLE "', а не 'echo $ VARIABLE'). Это неверно для '-e' или' -n', если ваше эхо использует эти параметры. Etc и т. Д. –

ответ

1

Вы имеете в виду, как это?

uploaded=$(mcl find -f "$FILENAME" | cut -d"'" -f2) 
for u in $uploaded; do 
    echo "$u" 
    # process "$u" 
done 
+0

Это немного больше, чем мне нужно, но он отлично работает. Мне, вероятно, не хватало двойных кавычек, как вы заявили в своем другом комментарии, и это заставило мою проверку потерпеть неудачу. Благодаря!! –

+3

@ ToX82 Не совсем понятно, как это может работать для вашего примера, где 'mcl' возвращает' '/ Cloud Drive/test1.bz2'' - например. пробел, а 'для u в $ uploaded' будет присваиваться' u' 1st '/ Cloud' и 2-й' Drive/test1.bz2' ... Так странно согласен ... – jm666

-1

Я думаю, что вы хотите, что:

UPLOADED=`/usr/local/bin/mcl find -f $FILENAME` 
+0

Ну да, но это то же самое, что я пытался с backticks вместо $() ... Мне нужна рабочая версия этого :) –

+0

Только вопрос: UPLOADED = $ (/ usr/local/bin/mcl find -f .bz2) вернет вам правильный результат? – sotcha

+0

Да, даже если он разделен пробелом, а не новой линией (что то же самое для чего мне нужно) : ???????? '/ Cloud Drive/test1.bz2': ???????? '/ Cloud Drive/test2.bz2' –

1

Вы можете попробовать сохранить следующие как, например, ./script.sh

filename="${1:-.bz2}" #<-- your variable as 1st argument, defaults to .bz2 

do_my_work() { 
    local uploaded="$1" 
    #do whatever you want with the "uploaded" 
    printf "got:==%s==\n" "$uploaded" 
} 

while IFS= read -r __mc1path 
do 
    do_my_work "$__mc1path" 
done < <(mc1 find -f "$filename" | sed "s/.*'\(.*\)'.*/\1/") 
#  variable----^^^^^^^^^^^   ^^^^^^^^^^^^^^^^^^- keep only stuff inside of quotes 

и использовать его в качестве

./script.sh .bz2 #or anything, defaults to ".bz2" 

и напечатает

got:==/Cloud Drive/test1.bz2== 
got:==/Cloud Drive/test2.bz2== 
+0

Можете очистить IFS во время чтения, чтобы избежать удаления пробела с конца имени файла. В противном случае это выглядит идеально. –

+0

@CharlesDuffy ДА! и да! и снова ДА! каждый раз забывайте об этом. ;) :) добавил ... thanx. ;) – jm666

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