【问题标题】:Bash converting double quotes to single quotesBash将双引号转换为单引号
【发布时间】:2012-07-23 05:01:23
【问题描述】:

我的 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 似乎不仅忽略了我的双引号,而且将它们变成了单引号。变量正在扩展,但通配符没有。如果有人能解释这里发生了什么,我将不胜感激。

【问题讨论】:

  • 正如一些人所建议的,我已经尝试删除双引号,并移动尾随双引号以排除通配符。这不会改变输出!
  • bash -x 的输出总是有单引号。

标签: bash


【解决方案1】:

如果你想要通配符,你不应该引用文件路径:

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

【讨论】:

  • 谢谢 - 但即使没有引号,通配符仍然无法正常工作。
  • 试试echo /home/dash/reference/hg18_bowtie_build/hg18.fa*,也许你没有任何匹配这个扩展的文件
  • 这是正确的 - 文件路径有误。现在它已得到纠正,一切正常。感谢您的帮助!
【解决方案2】:

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

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

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

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

【讨论】:

  • 谢谢!我在条件的第二部分看到了错误。但是移动引号不会改变 bash -x 的输出。
  • 如果此时它不匹配任何东西,那么就没有任何东西 to 匹配。
  • 如果我有声望,我会标记你!文件路径有错误。谢谢!
  • 所以我愿意!迟到总比没有好。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-12-28
  • 2017-06-19
  • 2018-11-18
  • 1970-01-01
  • 1970-01-01
  • 2017-12-29
  • 2013-01-20
相关资源
最近更新 更多