首页 > 解决方案 > 有条件地在变量前面加上斜杠

问题描述

我以为我能解决这个问题。我以前写过更复杂的 shell 脚本,所以我认为这很容易做到。我现在浪费了一个小时,把头发扯掉了,因为我所做的一切都不起作用,而且我在网上找不到任何有用的帮助。

我想做的只是相当于这里的这个简单的小 C# 代码片段:

var splat = "some/path";
if (!splat.StartsWith("/"))
{
    splat = $"/{splat}";
}

取一个字符串参数。如果它以斜线开头,则什么也不做。如果它不以斜杠开头,请将其添加到字符串变量的前面。

如何在 bash 脚本中完成这个明显的艰巨任务?

我的尝试:

#!/bin/bash

dir="/root/home"
sub_dir=$1

echo "argument given: '"$sub_dir"'"

if [ ! -z $sub_dir ]
then
        echo "before: "$dir$1
        if [[ "${sub_dir}" != *'/' ]]; then
                echo "starts with slash!"
        else
                echo "doesn't start with slash!"
                $sub_dir="\/"${sub_dir}
                echo "slash added: "$sub_dir
        fi
else
        echo "argument not given"
        echo $dir
fi

echo "$dir$sub_dir"

我也尝试过使用正则表达式,但条件没有成功:

if [[ "$HOST" =~ ^user.* ]]; then

我还没有找到一种方法来传递一个以斜杠开头的参数,或者创建一个以斜杠开头的字符串,但出于某种原因,将其视为文件路径而不是字符串(并随后导致错误)。

编辑:bash --version说它是 GNU bash verison 5.0.17,如果这有什么不同的话。

标签: bashshell

解决方案


使用参数扩展,如果它是斜杠则删除前导字符,否则保持值不变,并在结果前面加上斜杠。

$ s1=some/path s2=/some/path
$ echo /${s1#/}
/some/path
$ echo /${s2#/}
/some/path

简而言之,您可以将 if 命令替换为以下行:

sub_dir=/${sub_dir#/}

推荐阅读