Bash将双引号转换为单引号

时间:2012-07-23 05:01:23

标签: bash

我的bash脚本出现了问题,这让我陷入困境。我有一段代码应该带来一些文件:

if [[ $FILENODE == null ]]
then
    cp "/home/dash/reference/hg18_bowtie_build/hg18.fa*" "$JOBDIR"
    cp "$IN" "$JOBDIR"
else
    echo "Copying files from node$FILENODE"
    rcp "node$FILENODE-ib:$JOBDIR/hg18.fa*" "node$FILENODE-ib:$JOBDIR/$IN" "$JOBDIR"
fi

通常我们将落入条件的第一部分,因此cp命令应该在第一个参数中扩展通配符。我理解我需要加倍引用我的论点以确保它们得到扩展。但是,当我用bash -x执行这个脚本时,这就是我所看到的:

+ cp '/home/dash/reference/hg18_bowtie_build/hg18.fa*' /usr/tmp/707361.master.cl.osumc.edu
cp: cannot stat `/home/dash/reference/hg18_bowtie_build/hg18.fa*': No such file or directory
+ cp '*.sort.bam' /usr/tmp/707361.master.cl.osumc.edu
cp: cannot stat `*.sort.bam': No such file or directory

出于某种原因,bash似乎不仅忽略了我的双引号,而且将它们变成单引号。变量正在扩展,但不是通配符。如果有人能解释这里发生了什么,我真的很感激。

2 个答案:

答案 0 :(得分:4)

如果要进行通配,则不应引用文件路径:

cp /home/dash/reference/hg18_bowtie_build/hg18.fa* "$JOBDIR"

答案 1 :(得分:3)

双引号允许参数扩展,但它们仍然禁止全局扩展。将glob通配符移到引号之外。

cp "/home/dash/reference/hg18_bowtie_build/hg18.fa"* "$JOBDIR"

至于第二个,创建一个数组。

files=(foo*)
cp "${files[@]}" "$bar"