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 = '的/ etc /哪里/什么'
当我做 :
[[ -e "$FILE1" ]]
$?等于1,它说它找不到文件(上面的路径是一个例子....)
尝试了几个选项:文件路径周围的双引号而不是单引号(变量是从文件中的一行获得的)
发现它只有在我把文件路径放在我没有任何引号的文件中时才有效。但是当使用带有空格的文件名时,这将是一个问题。
因此,澄清一下:1)文件包含逐行读取的行2)行中的列使用IFS分割成单独的变量3)一个变量是文件名,用单引号括起来4)a [[-e $变量]]找不到文件。
请问正确的语法是什么?
这是因为您的字符串中有文字引号,并且它们不会被解释为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
你可以试试这个:
[ $(ls "$file") == "$file" ]
还可以使用其他旗帜,如-r
或-x
。