Bash将变量插入到反勾选的命令中

Bash将变量插入到反勾选的命令中,bash,variables,backticks,Bash,Variables,Backticks,我需要使用这个命令 /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 $UPLO

我需要使用这个命令

/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和web进行了一些研究之后,我找到了几种方法来做类似的事情(甚至使用backticks),但我仍然无法让它工作


正确的方法是什么?

我想你想要的是:

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

您可以尝试将以下内容保存为,例如
/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
并将打印

got:==/Cloud Drive/test1.bz2==
got:==/Cloud Drive/test2.bz2==
你是说像这样

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

是的,但这和我用backticks而不是$()尝试的是一样的。。。我想要一个工作版本:)只是一个问题:upload=$(/usr/local/bin/mcl find-f.bz2)返回正确的结果?是的,即使它由空格而不是换行符分隔(这与我需要的是一样的):/云驱动器/test1.bz2':/云驱动器/test2.bz2'不,它不是。当您
echo$UPLOADED
不带双引号时,将显示空格。正确的语法是
echo“$upload”
@sotcha,在标量变量中存储路径列表并不完全是一种好的做法——因为路径中任何地方都不能存在的唯一字符是
NUL
,而bash中的标量变量(就像其他使用C样式字符串的shell一样)不能存储NUL,这种方法注定会有无法正确处理的文件名。这种结构适合我。如果我创建了一个BASH文件,其中包含
VARIABLE=“content”
,后跟
RESULT=$(echo$VARIABLE)
,那么
echo$RESULT
只输出
content
。你得到了什么而不是预期的结果?您可以编辑您的问题以添加错误消息或不正确的输出吗?@Arkanon,对于
内容
,这是正确的。对于
$'content\n\n'
,情况并非如此——后面的换行符会被删除。对于
“*”
而言,这是不正确的,除非您在扩展时修复了报价(
echo“$VARIABLE”
,而不是
echo$VARIABLE
)。如果您的echo吃掉了这些参数,
-e
-n
则不正确。等等。这比我需要的稍微多了一点,但它工作得很好。我可能遗漏了你在其他评论中提到的双引号,这导致我的检查失败。谢谢@ToX82并不真正理解这对于您的示例是如何工作的,其中
mcl
返回
'/Cloud Drive/test1.bz2'
-例如,空间分隔路径,并且$upload
中u的
将分配给
u
1st
/Cloud
和2nd
Drive/test1.bz2
。。。所以奇怪的是,accept…可能会在读取过程中清除IFS,以避免从文件名末尾删除空白。否则,这看起来很完美。@charlesduff是的!是的!再说一遍,是的!每次都忘了它补充。。。thanx.)
uploaded=$(mcl find -f "$FILENAME" | cut -d"'" -f2)
for u in $uploaded; do
    echo "$u"
    # process "$u"
done