Kornshell中的反斜杠

时间:2010-11-11 15:18:57

标签: ksh backslash

我正在查看一些ksh代码并遇到了一条我认为不会起作用的行。在测试代​​码时,它确实有效,但我不确定原因。

如果重要,那就是在AIX 5.3系统上运行。

代码中的行是:

scriptname=$(\basename $0)

由于basename命令前面的反斜杠,我认为它不会起作用,但是当我测试scriptname变量时,它具有正确的值。

我在命令行上做了一些进一步的测试:

$ echo $(\echo test)
test
$ echo $(\echo \test)
test
$ echo $(\e\c\h\o \test)
test
$ echo `\e\c\h\o \test`
test
$ echo $(\echo "\test")
est

我在命令子代码之外尝试了它,它仍然没有像我想象的那样工作:

$ \echo \testi\ng
testing
$ \echo "\testi\ng"
        esti
g

最后一个是对我有用的唯一一个。

Kornshell是否只是忽略反斜杠,或者只是将它们转换为反斜杠前面的字符?我假设在命令行的任何位置加\n都是换行符,但显然只有在引号或\\n中。

有人可以解释一下ksh在命令行上使用反斜杠做什么吗?

无论哪种方式,我认为编写我最初质疑的命令的更好方法是:

scriptname=$(basename $0)

而不是:

scriptname=$(\basename $0)

重要吗?

提前致谢!

2 个答案:

答案 0 :(得分:3)

如果引用了命令名的任何部分,那么当选择要执行的内容时,ksh将忽略任何别名。

我认为这就是原始脚本使用\ basename。

的原因

答案 1 :(得分:1)

我遇到了一个相关但略有不同的情况。我正在编写一个shell脚本,其中包含几个rm命令:

\rm ...

我想知道为什么'\'在rm之前,并且同样尝试它只是为了发现它似乎确实有效。根据此site,这样做是为了防止脚本意外使用别名(例如,如果rm别名为'rm -i')。自从我首先发现有关Stack Overflow的讨论之后,我想我会添加这一点以防它帮助下一个人。