Shell:目录中的/和//之间有区别吗?

时间:2011-11-07 15:28:50

标签: linux shell

我在Shell制作这个小程序:

#***************************************************************
# Function.
# NAME: chk_df
# Synopsis:
# Check if a local directory (dirName) exist and has a file (fileName).
# 
# 
# The return codes are the following:
# 99 : dirName does not exists
#  0 : dirName exists and has fileName
#  1 : dirName exists and has not fileName
#
# Parameters:
# In values: dirName <string> fileName <string>
# Out values: returnCode <int>
# 
# How to use:
# chk_df dirName fileName
#***************************************************************
chk_df(){
   # Check the number of arguments that could be passed.
   # In this case, two, dirName, fileNAme.
   if [[ ${#@} != 2 ]]; then
       echo "Error ...Use [Function]: chk_df <dirName> <fileName>"
       echo "Ex: chk_df /foo lola.txt"
       exit
   fi   

   DIR=$1
   FILE=$2      

   [[ ! -d $DIR ]] && return 99
   [[ -d $DIR && ! -e $DIR/$FILE ]] && return 1
   [[ -d $DIR && -e $DIR/$FILE ]] && return 0

}

因为我需要检查一个文件是否在目录中,我做了这个(可怕的?)补丁 $ DIR / $ FILE ,但是这样的事情可能会发生:

I) If we do: chk_df /foo lola.txt
We get: /foo/lola.txt

II) If we do: chk_df /foo/ lola.txt
We get: /foo//lola.txt [Notice the //]

在这两种情况下,代码似乎都有效。 为什么?我读到反斜杠就像空间。那么,我可以使用 n 反斜杠而不会出现未知问题吗?

我可以这样离开它还是会带来问题?有区别吗? UNIX以正确的方式假设它?

额外问题:为什么我不能用负数做回报?这是:返回-1

3 个答案:

答案 0 :(得分:6)

根据POSIX标准,

///或任何连续斜杠的字符串具有相同的含义,但可能的含义不同路径的开头(因此/foo//foo可能表示不同的对象)。 Linux不使用此异常,因此任意数量的连续斜杠始终与单个/的意思相同。

(例外是为了满足使用前导//来表示网络路径的其他类Unix系统的需求。)

答案 1 :(得分:1)

没有区别。

// = /

答案 2 :(得分:0)

原则上,您可以根据需要使用尽可能多的/分隔符(直到您开始点击PATH_MAX或其他一些硬限制):

$ ls /usr/bin///////////////less
/usr/bin///////////////less

你遇到的一个问题是你是否想要测试两个路径是相同的[*],因为/ usr / bin / less和/ usr / bin // less是相同的路径但是是不同的字符串。在比较之前规范化路径可能很有用。

[*]忽略不同路径可以引用同一个对象的事实。