Как я сравниваю строки в Оболочке Bourne?

Предполагая, что вы ссылаетесь на метки узлов, networkx сохраняет индексы только при извлечении матрицы смежности графа. Networkx представляет каждый узел как индекс, и вы можете добавить больше атрибутов, если хотите. Все атрибуты узла, кроме индекса, хранятся в словаре. При создании матрицы смежности графа сохраняются только индексы, поэтому , если вы хотите сохранить только одну строку на узел, при создании графа учитывайте индексирование узлов по этой строке .

12
задан Mateusz Piotrowski 23 August 2017 в 21:38
поделиться

7 ответов

bash

Самая короткая фиксация:

if [[ "$var1" = "mtu "* ]]

Bash [[ ]] не становится расширенным до шарика, в отличие от этого [ ] (который должен по историческим причинам).


bash --posix

О, я отправил слишком быстро. Оболочка Bourne, не Bash...

if [ "${var1:0:4}" == "mtu " ]

${var1:0:4} означает первые четыре символа $var1.


/bin/sh

А-ч, извините. Эмуляция POSIX Bash не заходит достаточно далеко; истинная исходная Оболочка Bourne не имеет ${var1:0:4}. Вам будет нужно что-то как решение mstrobl.

if [ "$(echo "$var1" | cut -c0-4)" == "mtu " ]
11
ответ дан 2 December 2019 в 03:49
поделиться

Можно звонить expr к строкам совпадения против регулярных выражений из сценариев Оболочки Bourne. Ниже, кажется, работает:

#!/bin/sh

var1="mtu eth0"

if [ "`expr \"$var1\" : \"mtu .*\"`" != "0" ];then
  echo "match"
fi
6
ответ дан 2 December 2019 в 03:49
поделиться

Используйте инструменты Unix. Программа cut счастливо укоротит строку.

if [ "$(echo $var1 | cut -c 4)" = "mtu " ];

... должен сделать то, что Вы хотите.

18
ответ дан 2 December 2019 в 03:49
поделиться

Я сделал бы следующее:

# Removes anything but first word from "var1"
if [ "${var1%% *}" = "mtu" ] ; then ... fi

Или:

# Tries to remove the first word if it is "mtu", checks if we removed anything
if [ "${var1#mtu }" != "$var1" ] ; then ... fi
2
ответ дан 2 December 2019 в 03:49
поделиться

Или, как пример = ~ оператор:

if [[ "$var1" =~ "mtu *" ]]
-1
ответ дан 2 December 2019 в 03:49
поделиться

Мне нравится использовать оператор case для сравнения строк.

Тривиальный пример:

case "$input"
in
  "$variable1") echo "matched the first value" 
     ;;
  "$variable2") echo "matched the second value"
     ;;
  *[a-z]*)  echo "input has letters" 
     ;;
  '')       echo "input is null!"
     ;;
   *[0-9]*)  echo "matched numbers (but I don't have letters, otherwise the letter test would have been hit first!)"
     ;;
   *) echo "Some wacky stuff in the input!"
esac

Я делал сумасшедшие вещи вроде

case "$(cat file)"
in
  "$(cat other_file)")  echo "file and other_file are the same"
      ;;
  *)  echo "file and other_file are different"
esac

И это тоже работает, с некоторыми ограничениями, например, файлы не могут быть больше пары мегабайт, а оболочка просто не видит нулей, поэтому, если один файл полон нулей, а другой их нет (и ни у кого нет ничего другого), этот тест не будет увидеть разницу между ними.

Я не использую сравнение файлов в качестве серьезного примера, а только пример того, как оператор case может выполнять гораздо более гибкое сопоставление строк, чем доступно с test, expr или другим похожие выражения оболочки.

2
ответ дан 2 December 2019 в 03:49
поделиться

В оболочке Bourne, если я хочу проверить, содержит ли строка другую строку:

if [  `echo ${String} | grep -c ${Substr} ` -eq 1 ] ; then

Enclose echo $ {String} | grep -c $ {Substr} с двумя обратными кавычками `:

Чтобы проверить, находится ли подстрока в начале или в конце:

if [ `echo ${String} | grep -c "^${Substr}"` -eq 1 ] ; then
...
if [ `echo ${String} | grep -c "${Substr}$"` -eq 1 ] ; then
1
ответ дан 2 December 2019 в 03:49
поделиться
Другие вопросы по тегам:

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