Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Bash 用斜杠有条件地前置变量_Bash_Shell - Fatal编程技术网

Bash 用斜杠有条件地前置变量

Bash 用斜杠有条件地前置变量,bash,shell,Bash,Shell,我想我能弄明白。我以前写过更复杂的shell脚本,所以我认为这很容易做到。我现在已经浪费了一个小时,因为我所做的一切都不管用,也无法在网上找到任何有用的帮助 我所要做的就是等效于下面这个简单的小C#代码片段: var splat = "some/path"; if (!splat.StartsWith("/")) { splat = $"/{splat}"; } 以字符串参数为例。如果它以斜线开头,什么也不做。如果它不是以斜

我想我能弄明白。我以前写过更复杂的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"
我也尝试过使用regex,但没有成功地满足以下条件:

如果[[“$HOST”=~^user.*];然后

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


编辑:
bash--version
表示它是GNU bash verison 5.0.17,如果有区别的话。

如果是斜杠,则使用参数展开,删除前导字符,否则保留值不变,并在结果前加斜杠

#!/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 "Start with slash"
    else
        echo "doesn't start with slash!"
        slash="/"
        sub_dir="${slash}${sub_dir}"
        echo "slash added: "$sub_dir
    fi
else
    echo "argument not given"
    # echo $dir
fi

echo "$dir$sub_dir"
$ s1=some/path s2=/some/path
$ echo /${s1#/}
/some/path
$ echo /${s2#/}
/some/path
简单地说,您可以将if命令替换为以下行:

sub_dir=/${sub_dir#/}

使用参数展开,如果是斜杠,则删除前导字符,否则保留值不变,并在结果前加斜杠

$ s1=some/path s2=/some/path
$ echo /${s1#/}
/some/path
$ echo /${s2#/}
/some/path
简单地说,您可以将if命令替换为以下行:

sub_dir=/${sub_dir#/}

非常感谢。现在一切正常。总是乐于助人:)无可否认,当你看到正确的结果并意识到自己的错误时,会有点恼人。哈哈。
if[!-z$sub_dir]
→ <代码>如果[-n“$sub_dir”]替换
-z
by
-n
并在变量展开周围添加双引号,否则在
$sub_dir
展开空格时会出现错误。谢谢。现在一切正常。总是乐于助人:)无可否认,当你看到正确的结果并意识到自己的错误时,会有点恼人。哈哈。
if[!-z$sub_dir]
→ <代码>如果[-n“$sub_dir”]替换
-z
by
-n
并在变量展开周围添加双引号,否则在
$sub_dir
展开空格时会出现错误。