Как Вы говорите, содержит ли строка другую строку в POSIX sh? [дубликат]

Этот вопрос уже имеет ответ здесь:

Я хочу записать сценарий оболочки Unix, который сделает различную логику, если будет строка в другой строке. Например, если я нахожусь в определенной папке, отклоняюсь. Кто-то мог сказать мне, как выполнить это? Если возможный я хотел бы заставить это не окружить конкретный (т.е. не колотить только), но если нет никакого другого пути, я могу суметь обойтись этим.

#!/usr/bin/env sh

if [ "$PWD" contains "String1" ]
then
    echo "String1 present"
elif [ "$PWD" contains "String2" ]
then
    echo "String2 present"
else
    echo "Else"
fi
119
задан Reid 15 August 2018 в 07:09
поделиться

5 ответов

Чистая оболочка POSIX:

#!/bin/sh
CURRENT_DIR=`pwd`

case "$CURRENT_DIR" in
  *String1*) echo "String1 present" ;;
  *String2*) echo "String2 present" ;;
  *)         echo "else" ;;
esac

Расширенные оболочки, такие как ksh или bash, имеют необычные механизмы сопоставления, но старый вариант удивительно мощный.

73
ответ дан 24 November 2019 в 01:46
поделиться

К сожалению, я не знаю, как это сделать в sh. Однако, используя bash (начиная с версии 3.0.0, которая, вероятно, у вас есть), вы можете использовать оператор = ~ следующим образом:

#!/bin/bash
CURRENT_DIR=`pwd`

if [[ "$CURRENT_DIR" =~ "String1" ]]
then
 echo "String1 present"
elif [[ "$CURRENT_DIR" =~ "String2" ]]
then
 echo "String2 present"
else
 echo "Else"
fi

В качестве дополнительного бонуса (и / или предупреждения, если в ваших строках есть какие-то забавные символы в них), = ~ принимает регулярные выражения в качестве правильного операнда, если вы опускаете кавычки.

37
ответ дан 24 November 2019 в 01:46
поделиться
case $(pwd) in
  *path) echo "ends with path";;
  path*) echo "starts with path";;
  *path*) echo "contains path";;
  *) echo "this is the default";;
esac
14
ответ дан 24 November 2019 в 01:46
поделиться

Есть регулярные выражения bash . Или есть «expr»:

 if expr "$link" : '/.*' > /dev/null; then
    PRG="$link"
  else
    PRG=`dirname "$PRG"`/"$link"
  fi
6
ответ дан 24 November 2019 в 01:46
поделиться

См. manpage для программы 'test'. Если вы просто проверяете существование каталога, вы обычно делаете что-то вроде этого:

if test -d "String1"; then
  echo "String1 present"
end

Если вы действительно пытаетесь найти строку, вы можете использовать правила расширения bash и подстановочные знаки:

if test -d "String*"; then
  echo "A directory starting with 'String' is present"
end

Если вам нужно сделать что-то более сложное, вам нужно использовать другую программу, например expr.

2
ответ дан 24 November 2019 в 01:46
поделиться
Другие вопросы по тегам:

Похожие вопросы: