readlink -f 带空格

6
我正在编写一个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}`

它的意思是: 用法:readlink [-n] [-f] 符号链接 如果我在shell中像普通的Unix命令一样执行它
       readlink -f "/home/stack over flow/location"

正在工作,我得到了完整的路径。为什么即使我添加空格,readlink 在 shell 脚本中也无法工作?请帮助我解决这个问题。

1
这个命令readlink -f "$*"有效吗? - perreal
1
将代码改为 full_path=$(readlink -f "$temp")。注意双引号。 - fork0
1个回答

7

在脚本参数中不使用引号得到路径是有道理的:引号是为了处理调用您的脚本的shell,而不是针对脚本本身的。我假设您这样调用命令:

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

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

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

readlink -f "$@"

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

2
如果脚本的所有参数都不是针对readlink,那么他该如何做呢?此外,readlink只接受一个文件参数。 - fork0
@fok0:是的,你说得对。在传递给readlink之前,我必须进行额外的检查。 - Lolly

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接