5

我正在编写一个 shell 脚本,其中参数将是一个位置的路径。我正在使用 readlink -f 命令获取用户发送的路径的绝对路径。假设用户发送的路径有空格,例如,

    /home/stack over flow/location

我排除用户发送报价,例如

    "/home/stack over flow/location"

我这里有2个问题,

1)即使路径是用引号传递的,当我遍历 $@ 时,引号也会被抑制并得到不带引号的路径。

2)我做了一个工作来检查参数是否包含空格,我明确地添加了喜欢

    if [[ $1 = *\ * ]] ; then
           temp=\"$1\"
    fi

我在其中明确添加了引号 ",但现在我面临的问题是,即使我添加了带空格的变量,现在 readlink 也不起作用。当我这样做时

    full_path=`readlink -f ${temp}`

它的说法用法:readlink [-n] [-f] symlink

如果我在 shell 中将其作为普通的 unix 命令执行,例如

       readlink -f "/home/stack over flow/location"

这是有效的,我正在获得完整的路径。为什么即使我附加空格 readlink 在 shell 脚本中也不起作用?这个你能帮我吗。

4

1 回答 1

6

好吧,在脚本参数中获得不带引号的路径是有道理的:引号是用于处理脚本调用的 shell,而不是脚本本身。我假设你这样调用命令:

./test "/home/stack over flow/location"

其中“测试”是您实现的脚本。路径周围的引号确保执行此命令的 shell 将路径视为一个单独的参数,而不是像没有引号那样将其视为三个单独的字符串。但是引号不被视为参数本身的一部分。因此,当将参数移交给您的脚本时,您会得到一个包含整个路径的参数,而不是包含基于路径的修改字符串的参数:带有填充引号的字符串。

您可以毫无问题地使用该参数。只需再次引用它:

readlink -f "$@"

将保护指定路径中包含的空白,就像在原始调用中一样。

于 2012-07-26T07:49:34.163 回答