readlink -f with spaces

Lol*_*lly 4 unix linux shell

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

    /home/stack over flow/location
Run Code Online (Sandbox Code Playgroud)

我除了用户发送报价之外

    "/home/stack over flow/location"
Run Code Online (Sandbox Code Playgroud)

我这里有两个问题,

1)即使路径是用引号传递的,当我迭代$ @时,引号被抑制并获得没有引号的路径.

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

    if [[ $1 = *\ * ]] ; then
           temp=\"$1\"
    fi
Run Code Online (Sandbox Code Playgroud)

我明确地添加了引号,但我现在面临的问题是即使我添加了带空格的变量,现在readlink也无法工作.当我做的时候

    full_path=`readlink -f ${temp}`
Run Code Online (Sandbox Code Playgroud)

它的用法是:readlink [-n] [-f]符号链接

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

       readlink -f "/home/stack over flow/location"
Run Code Online (Sandbox Code Playgroud)

这是有效的,我正在走完全路.为什么即使我追加空格readlink也不能在shell脚本中工作?这个你能帮我吗.

ark*_*cha 6

那么它使你得到没有脚本参数报价的路径读:引号都是为了壳处理呼叫脚本的,而不是脚本本身.我假设您像这样调用命令:

./test "/home/stack over flow/location"
Run Code Online (Sandbox Code Playgroud)

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

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

readlink -f "$@"
Run Code Online (Sandbox Code Playgroud)

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

  • 如果脚本的所有参数并非都用于“readlink”,他应该如何执行此操作?此外,readlink 只接受一个文件参数 (2认同)