【问题标题】:Removing an additional leading slash if one exists如果存在,则删除额外的前导斜杠
【发布时间】:2013-06-28 15:29:40
【问题描述】:

我正在编写一个脚本,其中我有一个用于输出数据的默认目录,或者用户可以指定一个目录。问题是,我不知道如何雄辩地做到这一点。这是我所拥有的:

#!/bin/bash

OUTPUT="$1"

DEFAULT_DIR=/Default/Dir/For/Me

if [ -z "$OUTPUT" ] 
then
   OUTPUT=.${DEFAULT_DIR}
else
   OUTPUT=""${OUTPUT_DIR}""${DEFAULT_DIR}""
fi

echo "$OUTPUT"
  • 如果我这样做./script /,我会得到//Default/Dir/For/Me

  • 如果我这样做./script /home,我会得到/home/Default/Dir/For/Me

  • 如果我这样做./script /home/,我会得到/home//Default/Dir/For/Me

有没有什么方法可以让这一切变得漂亮并正确处理第一个场景?显然,第一种情况不起作用,因为目录// 不存在。

【问题讨论】:

  • @trojanfoe 是的,这很有帮助。
  • tr -s "/" 管它怎么样?它将删除重复的斜杠。
  • @fedorqui 这行得通!如此简单,如此优雅。谢谢!

标签: linux bash


【解决方案1】:

(只是为了让 cmets 清楚)

我的建议是使用管道 tr -s "/" 以便删除重复的斜杠:

$ echo "/home//Default/Dir/For/Me" | tr -s "/"
/home/Default/Dir/For/Me
$ echo "/home//Default/Dir/For/M//////////e" | tr -s "/"
/home/Default/Dir/For/M/e

【讨论】:

    【解决方案2】:

    这是另一个解决方案,无需派生另一个进程:

    DEFAULT_DIR=${DEFAULT_DIR//\/\///}
    

    这会将字符串中所有出现的// 替换为/

    【讨论】:

    • 这是 bash 语法,用于替换变量中的模式 - ${VARIABLE/old/new} 在变量扩展中用 new 替换第一次出现的 old${VARIABLE//old/new} 替换所有匹配项。上面看起来很奇怪,因为需要在替换的 old 部分中转义斜线。
    猜你喜欢
    • 2015-08-09
    • 2016-04-21
    • 1970-01-01
    • 1970-01-01
    • 2016-06-16
    • 1970-01-01
    • 2012-05-11
    • 1970-01-01
    • 2012-06-06
    相关资源
    最近更新 更多