linux - readlink -f 带空格

标签 linux shell unix

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

    /home/stack over flow/location

我不希望用户发送类似这样的引号

    "/home/stack over flow/location"

我这里有两个问题,

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

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

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

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

    full_path=`readlink -f ${temp}`

它的说法 用法:读取链接 [-n] [-f] 符号链接(symbolic link)

如果我在 shell 中将它作为一个普通的 unix 命令来执行,比如

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

正在运行,我正在获取完整路径。为什么即使我附加空格 readlink 在 shell 脚本中也不起作用?请帮我解决这个问题。

最佳答案

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

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

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

您可以毫无问题地使用该参数。只需再次在其周围加上引号:

readlink -f "$@"

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

关于linux - readlink -f 带空格,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11664559/

相关文章:

C++11 std::unique_ptr 删除器

ruby-on-rails - 在使用 RVM 的 linux mint 上运行 `bundle install` 时出现许多临时 UnknownHost 错误

shell - 合并多个文本文件并删除重复项

linux - 写一个shell脚本,在连接丢失时保持重新连接SSH for proxy

java - 如何在linux中用包编译java文件

linux - xargs 并查找,rm 提示文件名中的\n(换行符)

swift - 从 Mac 应用程序运行 Swift 命令

bash - 如何使用 grep 将 bash 命令输出的一部分解析为变量?

bash - 如何让grep通过NULL字符单独输出?

linux - 如何遍历文件并用行号回显每一行