在BASH中,当变量中的文件名具有单引号时,测试文件是否存在不起作用

问题描述 投票:1回答:2

[Update]

1)我有一个包含这样的行的文件(a.cfg):

FILE;'/tmp/testfile';;;+;'Add this line';$;Y

2)在我的脚本中,我逐行读取此文件:

while read line
do
...
done < a.cfg

3)当读取一行并且它不为空时,我使用IFS拆分该行:

IFS=';' read a b c d e f g h <<< $line

4)可以肯定的是,我回应了$ b的内容。它返回:

'/tmp/testfile'

包括单引号。

5)接下来,我想看看存储在$ b中的位置是否存在:

if ! [ -e "$b" ]
then
  echo "not found"
else
  echo "found"
fi

返回未找到....

6)当我从提示中做一个ls -l '/tmp/testfile'(再次,包括单引号)时,我得到:

-rw-r--r-- 1 root root 0 Jul 10 22:22 /tmp/testfile

(我提到我是以root身份完成所有这些吗?)

7)我用几种方式尝试了上面的if语句,但结果保持不变:

if [ ! -e $b ]
if ! [ -e "$b" ]
if [[ ! -e $b ]]
if ! [[ -e $b ]]

所以,请告诉我我认为不对的地方......

[End update]

我试图通过将变量的内容传递给bash的test -e来测试文件是否存在。变量看起来像这样:

FILE1 = '的/ etc /哪里/什么'

当我做 :

[[ -e "$FILE1" ]]

$?等于1,它说它找不到文件(上面的路径是一个例子....)

尝试了几个选项:文件路径周围的双引号而不是单引号(变量是从文件中的一行获得的)

发现它只有在我把文件路径放在我没有任何引号的文件中时才有效。但是当使用带有空格的文件名时,这将是一个问题。

因此,澄清一下:1)文件包含逐行读取的行2)行中的列使用IFS分割成单独的变量3)一个变量是文件名,用单引号括起来4)a [[-e $变量]]找不到文件。

请问正确的语法是什么?

bash ifs
2个回答
1
投票

这是因为您的字符串中有文字引号,并且它们不会被解释为shell脚本代码。

考虑这个PHP代码:

$x="1+1";
echo 1+1;   # Writes 2
echo $x;    # Writes 1+1, not 2

它在Bash中的工作方式相同:

var="'myfile'"
[[ -e 'myfile' ]]  # Checks for a file called  myfile 
[[ -e $var ]]      # Checks for a filename with apostrophes in it, not  myfile

您必须提取所需的确切文件名。由于您的文件名不包含撇号,因此您应该删除它们:

var="'myfile'"
var=${var//\'/}  # Replace all apostrophes with nothing
if [[ -e $var ]]
then
  echo "Exists"
fi

-1
投票

你可以试试这个:

[ $(ls "$file") == "$file" ]

还可以使用其他旗帜,如-r-x

© www.soinside.com 2019 - 2024. All rights reserved.