shell-目录判断

兜兜转转好像又回到了之前的那个问题:命令行中能执行的东西,脚本可不一定能够执行。可能shell不同,或者那种比较隐蔽的问题,比如$COLS这种变量只在命令行中才起作用。继之前发现的这些问题后,今天又遇到了一个关于路径的问题。

问题都是因为使用了这个符号来代表家目录导致的。

这是一个存储路径的文件。

1
2
3
4
5
6
7
8
#~/Desktop
#~/Documents
#~/Downloads
#~/Music
#~/Pictures
#~/Software
#~/Videos
#~/下载

我需要从这个文件中读取,并判断是否存在这个目录。

1
2
3
4
5
6
7
8
9
10
11
#!/bin/bash

cat file.txt | while read line
do
d=`echo $line | awk -v FS='#' '{print $2}'`
if [ -d $d ];then
echo $d
else
echo "not a dir"
fi
done

看着一点毛病都挑不出来是不是,可是运行脚本的结果是全部不存在这些目录,但是这些目录真的就存在。

好吧,sh -x my.sh进行调试,显示没有问题

1
2
3
4
5
6
7
+ read line
++ echo '#~/下载'
++ awk -v FS=# '{print $2}'
+ d='~/下载'
+ '[' -d '~/下载' ']'
+ echo 'not a dir'
not a dir

明明就有这个目录啊,为什么判断的结果是不存在呢?苦思不得其解,在终端执行这个语句也没有问题,我就奇怪了,难怪是加了单引号的问题?于是在脚本中为找到的字符串加了双引号,但是却没有任何效果。

后来突然想到是不是路径问题,可能需要使用绝对路径

1
2
3
4
5
6
7
8
#/home/narcissus/Desktop
#/home/narcissus/Documents
#/home/narcissus/Downloads
#/home/narcissus/Music
#/home/narcissus/Pictures
#/home/narcissus/Software
#/home/narcissus/Videos
#/home/narcissus/下载

然后再运行,竟然好了!结论就是应该写绝对路径,在终端中shell帮我们把解释为/home/narcissus。但是在脚本中进行if判断的时候,它不会进行这个解释。这个在终端下进行if判断,它却能解释为绝对路径,真的是有点奇怪!shell脚本也是使用的bash进行解释的啊,为什么脚本就不行,终端却可以呢?看来脚本和终端差距还是有点大,自以为shell已经到了随手写脚本的程度,其实还是有很多不懂的地方啊!所以永远不要眼高手低,觉得它简单,只能说too young too simple