Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Bash:从文件中读取filnames并检查它是否存在_Bash - Fatal编程技术网

Bash:从文件中读取filnames并检查它是否存在

Bash:从文件中读取filnames并检查它是否存在,bash,Bash,我想从“filenames.dat”文件中读取,该文件包含其他文件的路径+文件名 $ more filenames.dat "/home/test1.dat" "/home/test2.dat" "/home/test3.dat" 然后检查这些文件是否存在。这是filenames.dat中第一行的代码 line=$(head -n 1 "filenames.dat") [ -e "$line" ] && echo "files do exist" || echo "files

我想从“filenames.dat”文件中读取,该文件包含其他文件的路径+文件名

$ more filenames.dat
"/home/test1.dat"
"/home/test2.dat"
"/home/test3.dat"
然后检查这些文件是否存在。这是filenames.dat中第一行的代码

line=$(head -n 1 "filenames.dat")
[ -e "$line" ] && echo "files do exist" || echo "files do not exist"
然而,我得到“文件不存在”,即使它们存在。如果我这样做

[ -e "/home/test1.dat" ] && echo "files do exist" || echo "files do not exist"
比文件存在

文字引号和语法引号是两种不同的东西:前者告诉shell如何解析您输入的代码,后者是数据的一部分

运行时:

echo '"filenames.dat"' >filenames.dat
line=$(head -n 1 "filenames.dat")
head
返回的行中的双引号是文字:它们是数据的一部分。”

相反,在
[-e“$line”]
中,代码中的引号是语法性的;它们告诉shell将变量扩展的结果视为完全文字,而不进行字符串拆分或全局扩展。(这是正确和可取的)

当运行
[-e“$line”]
时,我们检查是否存在名为
line
的变量的文本内容。由于这些文字内容包含由
head
返回的文字引号,因此我们将查找包含文字引号的文件名和目录名

因为您的实际文件名不包含文字引号,所以结果是找不到文件

如果希望保持数据格式不变,在数据中使用文字引号,请遵循

中的指导。文字引号和语法引号是两件不同的事情:前者告诉shell如何解析输入的代码,后者是数据的一部分

运行时:

echo '"filenames.dat"' >filenames.dat
line=$(head -n 1 "filenames.dat")
head
返回的行中的双引号是文字:它们是数据的一部分。”

相反,在
[-e“$line”]
中,代码中的引号是语法性的;它们告诉shell将变量扩展的结果视为完全文字,而不进行字符串拆分或全局扩展。(这是正确和可取的)

当运行
[-e“$line”]
时,我们检查是否存在名为
line
的变量的文本内容。由于这些文字内容包含由
head
返回的文字引号,因此我们将查找包含文字引号的文件名和目录名

因为您的实际文件名不包含文字引号,所以结果是找不到文件


如果希望保持数据格式不变,数据中使用文字引号,请遵循

引号中的指导?这个文件的语法是什么?JSON字符串?Shell引用字符串?还有什么吗?要清楚,您的代码正在查找一个名为
“/home/test1.dat”
,而不是
/home/test1.dat
@CharlesDuffy的文件,所以我必须删除filenames.dat中的引号吗?有关详细讨论,请参阅。也就是说,删除这些文字引号确实是解决此问题的一种方法。但是,如果您想真正正确地执行操作,最好不要使用换行符分隔的文件来列出名称。(请记住,UNIX中的文件名允许包含换行文字;如果您有一个使用
touch$'foo\nbar'
创建的文件,则根本不能将其放入以换行分隔的文件名中)。引号?这个文件的语法是什么?JSON字符串?Shell引用字符串?还有什么吗?要清楚,您的代码正在查找一个名为
“/home/test1.dat”
,而不是
/home/test1.dat
@CharlesDuffy的文件,所以我必须删除filenames.dat中的引号吗?有关详细讨论,请参阅。也就是说,删除这些文字引号确实是解决此问题的一种方法。但是,如果您想真正正确地执行操作,最好不要使用换行符分隔的文件来列出名称。(请记住,UNIX中的文件名允许包含换行文字;如果使用
touch$'foo\nbar'
创建文件,则根本无法将其放入以换行分隔的文件名中)。