2008-10-08 7 views

ответ

11

bash

Кратчайший фикс:

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

в Bash [[ ]] не получает Глоб вспененные, в отличие от [ ] (который должен, по историческим причинам).


bash --posix

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

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

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


/bin/sh

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

if [ "$(echo "$var1" | cut -c0-4)" == "mtu " ] 
+0

`$ {var1: 0: 4}` - откуда вы получили этот синтаксис? Это определенно не POSIX. – 2011-09-16 06:23:04

+1

Моя версия разреза указывает, что позиции нумеруются начиная с 1. `` cut -c 1-4`` или `` cut -c -4`` возвращают правильное значение здесь. – jotr 2016-01-25 22:02:04

18

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

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

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

+1

yes, но kinda heavy – 2008-10-08 16:37:29

0

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

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

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

#!/bin/sh 

var1="mtu eth0" 

if [ "`expr \"$var1\" : \"mtu .*\"`" != "0" ];then 
    echo "match" 
fi 
3

Я хотел бы сделать следующее:

# 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 
1

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

Тривиального пример

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 способен выполнять гораздо более гибкое сопоставление строк, чем доступно с помощью теста или выражения expr или других подобных выражений оболочки.

1

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

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

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

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

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