readlink -f with spaces

时间:2012-07-26 07:38:46

标签: linux shell unix

我正在编写一个shell脚本,其中parameter将是一个位置的路径。我使用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]符号链接

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

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

这是有效的,我正在获得完整的路径。为什么即使我追加空格readlink也无法在shell脚本中工作?请帮帮我。

1 个答案:

答案 0 :(得分:5)

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

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

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

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

readlink -f "$@"

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