在BASH中,当变量中的文件名具有单引号

时间:2017-07-10 16:00:04

标签: bash ifs

[更新]

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 ]]

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

[结束更新]

我试图通过将变量的内容传递给bash的test -e来测试文件是否存在。 变量如下所示:

FILE1 =&#39;在/ etc /哪里/不管&#39;

当我这样做时:

[[ -e "$FILE1" ]]

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

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

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

所以,澄清一下: 1)文件包含逐个读取的行 2)使用IFS将行中的列拆分为单独的变量 3)一个变量是一个文件名,用单引号括起来 4)[[ - e $ variable]]无法找到该文件。

请问正确的语法是什么?

2 个答案:

答案 0 :(得分: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 :(得分:-1)

你可以试试这个:

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

另请使用其他旗帜,例如-r-x