我一直在bash和sh脚本中使用它,因为我读到某处,我似乎无法再找到它,这是处理具有空格,斜杠或其他字符的入站参数的最佳方法可能需要特殊待遇,如逃避。
INCOMING_ARG=${1%/}
有人能否打破这一点,或告诉我是否有更好的方式?
最长的一段时间我只是使用了$1
,$2
,$3
,$4
等,因为他们进来了,从来没有在屁股上,但我我确实对我不再使用${1%/}
的论点做了一些消毒。
答案 0 :(得分:4)
${1%/}
只会从$1
中删除尾部斜杠。就是这样。
这是bash参数扩展${parameter%word}
的示例,其中parameter
是shell变量的名称,word
是您要从参数末尾删除的内容。例如:
$ a=/home/me/dir/ ; echo ${a%/}
/home/me/dir
$ a=/home/me/dir/ ; echo ${a%e/dir/}
/home/m
对于具有空格,斜线或其他可能需要特殊处理(如转义)的角色的args,这一点都没有任何帮助。
Unix / Linux非常容忍多余的斜杠。当给出重复斜杠时,Unix会忽略它们。例如,观察以下所有内容都指向同一目录:
$ ls -altd /usr/bin/ /usr/bin// /usr/bin///
drwxr-xr-x 2 root root 81920 Sep 19 11:25 /usr/bin/
drwxr-xr-x 2 root root 81920 Sep 19 11:25 /usr/bin//
drwxr-xr-x 2 root root 81920 Sep 19 11:25 /usr/bin///
以下所有内容都指向同一个文件:
$ ls -alt /usr/bin/xpdf /usr/bin//xpdf /usr/bin///xpdf
-rwxr-xr-x 1 root root 2358 Apr 17 2012 /usr/bin/xpdf
-rwxr-xr-x 1 root root 2358 Apr 17 2012 /usr/bin//xpdf
-rwxr-xr-x 1 root root 2358 Apr 17 2012 /usr/bin///xpdf
因此,通常不需要从目录名中删除尾部斜杠。
答案 1 :(得分:1)
所有这一切都会在$1
上删除一个尾部斜杠。
$ X=foo/
$ echo ${X%/}
foo
但是对于空白或不寻常的角色并不安全,实际上可能会让事情变得更糟,因为它的扩展会受到进一步扩展路径的影响。假设您有一个脚本$1
等于文字*/
,它被引用到脚本中,并且您希望在没有脚本的情况下保留其值而不是以奇怪的方式展开它。那么${X%/}
肯定不是你想要做的:
$ touch foo.txt
$ X='*/'
$ echo $X
*/
$ echo ${X%/}
foo.txt
这是因为没有引用。
不要使用它。
在shell脚本中,通常总是引用所有内容。
$ echo "${X%/}"
*