Script Shell Bash, Vérifiez si la chaîne commence et se termine avec des guillemets simples
J'ai besoin de vérifier si une chaîne commence et se termine avec un seul devis, par exemple
"Mon nom est" de Mozart
Ce que j'ai est ce qui ne fonctionne pas
if [[ $TEXT == '*' ]] ;
Cela ne fonctionne pas, soit
if [[ $TEXT == /'*/' ]] ;
Mais si je l'ai changer pour
if [[ $TEXT == a*a ]] ;
il travaille pour une phrase comme "un incroyable apa'. Donc, je Crois qu'il a à voir avec la citation simple signe.
Des idées sur comment je peux le résoudre?
Explication pour una: correspond au caractère littéralement (sensible à la casse) * Quantificateur — Matches entre zéro et un nombre illimité de fois, autant de fois que possible, de donner en retour que nécessaire (gourmand) correspond au caractère littéralement (sensible à la casse), je récupère toutes les une dans le texte
avez-vous résolu votre problème?
avez-vous résolu votre problème?
OriginalL'auteur chichi | 2016-10-29
Vous devez vous connecter pour publier un commentaire.
Je suis en train d'écrire la complète bash script de sorte que vous n'aurez pas de confusion:
Enregistrer le script ci-dessus comme
matchCode.sh
Maintenant l'exécuter en tant que:
./matchCode
de sortie:
Vous demander si vous avez toute confusion.
OriginalL'auteur Sulav Timsina
Avec un regex:
Avec d'expansion:
Ceux-ci sont valables Bash solutions. Exécuter
[[ "'ab'" =~ ^\'.*\'$ ]] && echo yes
et[[ "'ab'" == \'*\' ]] && echo yes
dans votre shell. À moins que les deux d'entre eux de sortieyes
, vous devez utiliser un shell est autre que le Bash.OriginalL'auteur Cyrus
Cyrus' réponse utile résout votre problème posté.
Cependant, je soupçonne vous pouvez être confus sur les devis partie de la syntaxe shell vs citations qui sont en fait des partie de la chaîne:
Dans une POSIX-comme shell comme Bash,
'My name is Mozart'
est une simple chaîne de caractères entre guillemets dont le contenu est le littéralMy name is Mozart
- sans la enfermant'
. C'est, en l'enfermant'
personnages sont un éléments syntaxiques que dire de la coquille que tout entre est le littérale contenu de la chaîne.En revanche, pour créer une chaîne dont contenu est réellement contenu dans
'
- à-d., a intégré'
cas, vous devez utiliser quelque chose comme:"'My name is Mozart'"
. Maintenant, l'enfermant"
instance sont les éléments syntaxiques qui jalonnent la chaîne de contenu."..."
chaîne (guillemets doubles) rend le contenu soumis à chaîne d'interpolation (expansion de l'embedded références à des variables, le calcul et la commande des substitutions; pas dans le cas, toutefois), il est donc important de savoir quand utiliser'...'
(des chaînes de caractères littérales) vs"..."
(interpolée de chaînes de caractères).'
cas dans'...'
de chaînes de caractères est en fait pas du tout supporté dans POSIX, comme des coquillages, mais en Bash, Ksh et Zsh, il y a un autre type chaîne de caractères qui vous permet de le faire: C ANSI-chaînes entre guillemets,$'...'
, dans lequel vous pouvez intégrer'
échappé que\'
:$'\'My name is Mozart\''
"'"'My Name is Mozart'"'"
serait également vous donner une chaîne avec contenu'My Name is Mozart'
.POSIX, comme des coquillages également vous permettre d'échapper à individu, non cotées caractères (ce qui signifie: ni la partie d'un seul, ni une chaîne de caractères entre guillemets) avec
\
; par conséquent,\''My name is Mozart'\'
donne le même résultat.La comportement de Bash est
==
opérateur à l'intérieur de[[ ... ]]
(conditionnelles) peut-être ajouté à la confusion:Si le membre de droite (côté droit - l'opérande à droite de l'opérateur
==
) est cité, Bash le considère comme un littérale; seulement non cotées des chaînes (ou les références à des variables) sont traités comme des (glob) modèles:'*'
correspond littérale*
, alors que*
(non coté!) correspond à toute séquence de caractères, y compris aucun.Ainsi:
[[ $TEXT == '*' ]]
ne voulut jamais correspondre à la unique, caractère littéral*
.[[ $TEXT == /'*/' ]]
, parce qu'on confond/
pour le caractère d'échappement - en réalité, il est\
- ne correspondent à littérale/*/
(/'*/'
est effectivement une concaténation de sociétés non cotées/
et unique cité littérale*/
).[[ $TEXT == a*a ]]
, en raison de l'utilisation d'un non cotées RHS, est la seule variante qui effectue pattern matching: toute chaîne qui commence aveca
et se termine aveca
est mis en correspondance, y comprisaa
(parce que non cotées*
représente n'importe quelle séquence de caractères).Pour vérifier que Cyrus " les commandes fonctionnent avec des cordes dont l' contenu est fermé (embedded) les guillemets simples, essayez ces commandes, qui - sur Bash, Ksh et Zsh - devrait à la fois de sortie
yes
.OriginalL'auteur mklement0