Unix kabuk skriptlərindəki bir simli başqa bir dize ehtiva edirmi?

Başqa bir simli içərisində bir xətt varsa, müxtəlif məntiqi yerinə yetirəcək bir Unix script yazmaq istəyirəm. Məsələn, müəyyən bir qovluqda olsam, onu açın. Kimsə bunu necə edəcəyini mənə bildirə bilərmi? Mümkündürsə, mən bunu bir qabıq (yəni Baş deyil) etmək istərdim, amma başqa bir yol yoxsa, mən bunu idarə edə bilərəm.

 #!/usr/bin/env sh if [ "$PWD" contains "String1" ] then echo "String1 present" elif [ "$PWD" contains "String2" ] then echo "String2 present" else echo "Else" fi 
84
13 мая '10 в 22:17 2010-05-13 22:17 Mayın 13-də, 10-da saat 10: 17-də Matt təyin olundu. 2010-05-13 22:17
@ 11 cavab

Burada başqa bir həll var. POSIX substrinq uzantısını istifadə edir, bash, dash, ksh ...

 test "${string#*$word}" != "$string"  echo "$word found in $string" 

Edit: Bu böyük bir fikir, K. Ross. Burada bəzi nümunələrlə funksional bir versiya var:

 # contains(string, substring) # # Returns 0 if the specified string contains the specified substring, # otherwise returns 1. contains() { string="$1" substring="$2" if test "${string#*$substring}" != "$string" then return 0 # $substring is in $string else return 1 # $substring is not in $string fi } contains "abcd" "e" || echo "abcd does not contain e" contains "abcd" "ab"  echo "abcd contains ab" contains "abcd" "bc"  echo "abcd contains bc" contains "abcd" "cd"  echo "abcd contains cd" contains "abcd" "abcd"  echo "abcd contains abcd" contains "" ""  echo "empty string contains empty string" contains "a" ""  echo "a contains empty string" contains "" "a" || echo "empty string does not contain a" contains "abcd efgh" "cd ef"  echo "abcd efgh contains cd ef" contains "abcd efgh" " "  echo "abcd efgh contains a space" 
119
11 янв. Cavab fjarlq yanvar 11 verilir 2012-01-11 02:01 '12 at 2:01 am 2012-01-11 02:01

POSIX xalçası:

 #!/bin/sh CURRENT_DIR=`pwd` case "$CURRENT_DIR" in *String1*) echo "String1 present" ;; *String2*) echo "String2 present" ;; *) echo "else" ;; esac 
border=0

Ksh və ya bash kimi genişləndirilmiş mərmi, eşleme mexanizmləri ilə uyğunlaşdı, lakin köhnə case üslubu şaşırtıcıdır.

52
14 мая '10 в 0:24 2010-05-14 00:24 cavab Norman Ramsey tərəfindən 14 May '10 'də 0:24 2010-05-14 00:24' də verilir

Təəssüf ki, bunu sh-də necə edəcəyimi bilmirəm. Buna baxmayaraq, bash istifadə edərək (ehtimal etdiyiniz versiya 3.0.0-dan) = = operatoru aşağıdakı kimi istifadə edə bilərsiniz:

 #!/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 

Əlavə bonus olaraq (və / və ya sətirlərinizdə hər hansı bir məzəli simvol varsa) xəbərdarlıq edirsinizsə, = ~ Əgər sitat sayılmazsanız, düzgün operand kimi normal ifadələri qəbul edir.

34
13 мая '10 в 22:52 2010-05-13 22:52 Cavab John Hyland tərəfindən 13 May 'da 10:52' da verildi
 #!/usr/bin/env sh # Searches a subset string in a string: # 1st arg:reference string # 2nd arg:subset string to be matched if echo "$1" | grep -q "$2" then echo "$2 is in $1" else echo "$2 is not in $1" fi 
18
19 марта '13 в 20:58 2013-03-19 20:58 Cavab 19 mart 2013- il tarixində saat 20:58 da verilir
 case $(pwd) in *path) echo "ends with path";; path*) echo "starts with path";; *path*) echo "contains path";; *) echo "this is the default";; esac 
12
13 мая '10 в 23:38 2010-05-13 23:38 cavab 13: 00-da saat 23: 38-də verilir. 2010-05-13 23:38

Probleminizə müxtəlif həllər üçün bir link.

Bu mənim sevimli, çünki bir şəxs üçün ən aydın mənada:

Wildcard metodu

 if [[ "$string" == *"$substring"* ]]; then return 1 fi return 0 
9
27 дек. Cavab TT4M.C 27 dekabrda verilir . 2015-12-27 09:45 '15 at 9:45 AM 2015-12-27 09:45

Bash regexps var . Və ya bir ifadə var:

  if expr "$link" : '/.*' > /dev/null; then PRG="$link" else PRG=`dirname "$PRG"`/"$link" fi 
6
13 мая '10 в 22:51 2010-05-13 22:51 Cavab bambuklar tərəfindən verilir 13 may '10 saat 10:51 pm 2010-05-13 22:51

Xüsusi hallarda, uzun bir mətndə bir sözün olub-olmadığını öyrənmək istədiyiniz zaman loop istifadə edərək uzun mətn vasitəsilə loop edə bilərsiniz.

 found=F query_word=this long_string="many many words in this text" for w in $long_string; do if [ "$w" = "$query_word" ]; then found=T break fi done 

Bu təmiz Bourne qabığıdır.

2
17 мая '16 в 0:17 2016-05-17 00:17 Cavab Kemin Zhou tərəfindən 17 May '16 'da 0:17 2016-05-17 00:17' də verilir

Test proqramının istinad səhifəsinə baxın. Yalnız bir kataloq üçün nəzarət edirsinizsə, adətən bu kimi bir şeylər edəsiniz:

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

Bir simli uyğunlaşmağa çalışırsınızsa, məsləhət qaydaları və bash şablonlarını istifadə edə bilərsiniz:

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

Bir şey daha mürəkkəb bir şey etmək lazımdır, siz expr kimi başqa bir proqram istifadə etmək lazımdır.

2
13 мая '10 в 22:57 2010-05-13 22:57 Cavab jdeseno tərəfindən 13 May 'da 10:57' da verildi 2010-05-05 22:57
 test $(echo "stringcontain" "ingcon" |awk '{ print index($1, $2) }') -gt 0  echo "String 1 contain string 2" 

-> çıxış: Satır 1 line 2 ehtiva edir

1
31 июля '15 в 13:01 2015-07-31 13:01 Cavab Lu xu bu tərəfindən 31 iyul 'da 13:01' də verilir 2015-07-31 13:01

"Test" kimi tez işləyən bir ksh üsuluna ehtiyacınız varsa, aşağıdakı kimi bir şey edə bilərsiniz:

 contains() # haystack needle { haystack=${1/$2/} if [ ${#haystack} -ne ${#1} ] ; then return 1 fi return 0 } 

Bir samanlıq içində iğneyi çıxararaq, sonra köhnə və yeni samanlıqların simli uzunluğunu müqayisə etməklə çalışır.

1
11 авг. cavab OneEyed 11 aug tərəfindən verilir . 2015-08-11 17:56 '15 at 5:56 pm 2015-08-11 17:56

tags ilə bağlı digər suallar və ya bir sual