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]]无法找到该文件。
请问正确的语法是什么?
答案 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
。