如何在(bash)shell脚本上获得被视为普通引号的命令的单引号? (dcm2niix出现问题)

时间:2019-07-17 11:21:39

标签: bash shell

我正在编写一个使用Dcm2niix的bash脚本。 Dcm2niix的命令包含单引号。我试图以多种方式在脚本上添加单引号,但这是行不通的。

我的工作系统(环境?)是:Ubuntu 18.04.1 LTS。 Dcm2niix是DICOM到NifTI的转换器。它将.dcm文件转换为.nii文件。 其命令通常类似于:

dcm2niix [options] <sourcedir>

<sourcedir>类似于: 'sourcedir' (没有单引号不起作用)

在终端上,输入

    dcm2niix -m y -f %d 'file_path' 

用来将.dcm文件转换为file_path目录中的.nii文件。 我想创建一个脚本,以自动将一些.dcm文件转换为单独的目录。 因此,我写了类似的内容:

    file_path=Desktop/test/
    dcm2niix -m y -f %d '$file_path' 

在这里,我尝试将文件路径视为变量。但这是行不通的。最后一行代码出错。 另外,

    dcm2niix -m y -f %d "'$file_path'"

    dcm2niix -m y -f %d '"$file_path"'

    dcm2niix -m y -f %d `'$file_path'`

效果不好。

我从先前显示的代码中得到的错误:

  

输出文件夹无效:桌面/测试

     

输出文件夹无效:“桌面/测试”

     

输出文件夹无效:“桌面/测试”

     

输出文件夹无效:$ file_path

2 个答案:

答案 0 :(得分:1)

仅当终端中包含空格或glob之类的特殊字符时,才需要在终端的file_path周围使用''Desktop/test/并非如此。但是在脚本中,您有一个变量$file_path,您想将其扩展为Desktop/test/,因此''可以防止这种情况。尝试使用双引号"代替'。或者尝试使用\'而不是'来避免单引号的特殊含义。

    dcm2niix -m y -f %d "$file_path" 

    dcm2niix -m y -f %d \'"$file_path"\' 

但是我怀疑<sourcedir>确实需要单引号。

答案 1 :(得分:1)

在shell中引用有两个主要目的:

  1. 防止“分词”-确保您要给引号引用的命令将一段文本作为一个参数接收。
  2. 防止“混淆”-确保您不会意外地将文本视为可能会扩展为文件名列表的glob模式。

双引号将允许在其中进行变量扩展和命令替换之类的事情。
单引号不允许任何扩展。

引号内的引号没有特殊用途:在双引号字符串内,单引号只是普通字符,反之亦然。

还要注意,一旦外壳准备好实际调用命令,引号就会被删除。 dcm2niix命令将接收参数Desktop/test/而不是"Desktop/test/"