使用bash中的变量在名称中使用反斜杠打开文件

时间:2014-10-09 20:07:23

标签: bash variables filenames fastq

简单问题的复杂名称。我正在努力为我离开时与之合作的人制作一个白痴证明计划。我使用read将文件名保存为变量。当我拖放文件时,文件名称有空格(因此反斜杠),它将无效。如果我直接输入名称就行了。以下示例。

$ read -re a
/Users/microuser/Desktop/han\ scans/D2GDVACXX_s8_0_7bp_Index_9_SL39794.fastq 
$ echo $a
/Users/microuser/Desktop/han\ scans/D2GDVACXX_s8_0_7bp_Index_9_SL39794.fastq
$ echo "$a"
/Users/microuser/Desktop/han\ scans/D2GDVACXX_s8_0_7bp_Index_9_SL39794.fastq
$ head $a
head: /Users/microuser/Desktop/han\: No such file or directory
head: scans/D2GDVACXX_s8_0_7bp_Index_9_SL39794.fastq: No such file or directory
$ head "$a"
head: /Users/microuser/Desktop/han\ scans/D2GDVACXX_s8_0_7bp_Index_9_SL39794.fastq: No such file or directory

但是如果我输入它而不是使用变量。

$ head -n 1 /Users/microuser/Desktop/han\ scans/D2GDVACXX_s8_0_7bp_Index_9_SL39794.fastq 
@HWI-ST1280:209:D2GDVACXX:8:1101:2762:1973 1:Y:0:GATCAGA

如果我使用变量从文件夹名称中取出空格可以正常工作。

2 个答案:

答案 0 :(得分:2)

文件名包含反斜杠,只包含空格。反斜杠仅出现,因为某些应用程序将有助于使用/显示预先转发的版本,就像在bash的自动完成中一样。

以下示例应该有助于澄清这一点:

# touch "some file.txt"
# ls -lsa som*
0 -rw-rw-r--. 1 foo bar 0 Oct  9 13:49 some file.txt

# read var
some file.txt

# echo $var
some file.txt

# ls -lsa $var
ls: cannot access some: No such file or directory
ls: cannot access file.txt: No such file or directory

# ls -lsa "$var"
0 -rw-rw-r--. 1 foo bar 0 Oct  9 13:49 some file.txt

# ls -lsa some\ file.txt
0 -rw-rw-r--. 1 foo bar 0 Oct  9 13:49 some file.txt

# ls -lsa "some file.txt"
0 -rw-rw-r--. 1 foo bar 0 Oct  9 13:49 some file.txt

答案 1 :(得分:2)

在读取输入时不需要在空格之前放入反斜杠,并且避免使用-r选项作为-r选项说不允许反斜杠转义任何字符

这应该有效:

$ read -e a
/Users/microuser/Desktop/han scans/D2GDVACXX_s8_0_7bp_Index_9_SL39794.fastq 
$ head "$a"