Я думал, что смогу понять это. Раньше я писал более сложные сценарии оболочки, поэтому подумал, что это будет легко сделать. Я потратил час впустую и рвал волосы, потому что ничего из того, что я делаю, не работает, и я не могу найти какую-либо полезную помощь в Интернете.

Все, что я хочу сделать, это эквивалент этого простого небольшого фрагмента кода 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 версии 5.0.17, если это имеет значение.

1
Kagemand Andersen 19 Янв 2021 в 13:29

2 ответа

Лучший ответ
#!/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"
2
ajinzrathod 19 Янв 2021 в 10:39

Используйте расширение параметра, которое удаляет начальный символ, если это косая черта, или оставляет значение неизменным в противном случае, и добавляет к результату косую черту.

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

Проще говоря, вы можете заменить эту команду if на эту строку:

sub_dir=/${sub_dir#/}
3
oguz ismail 19 Янв 2021 в 11:12