Si, par hasard, vous essayez simplement de gérer des devis pour réutiliser la coque, vous pouvez le faire sans les supprimer, et c'est aussi simple que cela:
aq() { sh -c 'for a do
alias "$((i=$i+1))=$a"
done; alias' -- "$@"
}
Ce shell de fonction cite tout tableau arg que vous lui donnez et incrémente sa sortie par argument itérable.
Le voici avec quelques arguments:
aq \
"here's an
ugly one" \
"this one is \$PATHpretty bad, too" \
'this one```****```; totally sucks'
PRODUCTION
1='here'"'"'s an
ugly one'
2='this one is $PATHpretty bad, too'
3='this one```****```; totally sucks'
Cette sortie est celle à partir de dash
laquelle les guillemets simples sont généralement sécurisés '"'"'
. bash
ferait '\''
.
Le remplacement d'une sélection d'octets simples, non blancs et non nuls par un autre octet unique peut probablement se faire le plus rapidement dans n'importe quel shell POSIX avec $IFS
et $*
.
set -f; IFS=\"\'\`; set -- $var; printf %s "$*"
PRODUCTION
"some ""crazy """"""""string ""here
Là je l'ai juste printf
pour que vous puissiez le voir, mais bien sûr, si j'avais fait:
var="$*"
... plutôt que la valeur de la printf
commande $var
serait ce que vous voyez dans la sortie.
Lorsque set -f
j'ordonne au shell de ne pas glob - au cas où la chaîne contient des caractères qui pourraient être interprétés comme des modèles glob. Je le fais parce que l'analyseur de shells étend les modèles globaux après avoir effectué la division du champ sur les variables. le globbing peut être réactivé comme set +f
. En général - dans les scripts - je trouve utile de définir mon bang comme:
#!/usr/bin/sh -f
Et puis pour activer explicitement le globbing avec set +f
sur n'importe quelle ligne je pourrais le vouloir.
La division des champs se produit en fonction des caractères dans $IFS
.
Il existe deux types de $IFS
valeurs: les $IFS
espaces blancs et $IFS
non blancs. $IFS
les espaces délimités par des espaces (espace, tabulation, nouvelle ligne) sont spécifiés pour être éliminés par séquence vers un seul champ (ou aucun du tout s'ils ne précèdent pas autre chose) - donc ...
IFS=\ ; var=' '; printf '<%s>' $var
<>
Mais tous les autres sont spécifiés pour évaluer un seul champ par occurrence - ils ne sont pas tronqués.
IFS=/; var='/////'; printf '<%s>' $var
<><><><><>
Toutes les extensions de variables sont, par défaut, $IFS
des tableaux de données délimités - elles se répartissent en champs séparés selon $IFS
. Lorsque vous en "
citez une, vous remplacez cette propriété de tableau et l'évaluez comme une chaîne unique.
Alors quand je fais ...
IFS=\"\'\`; set -- $var
Je mets le tableau d'arguments du shell sur les nombreux $IFS
champs délimités générés par $var
l'expansion de. Lorsqu'elle est développée, ses valeurs constitutives pour les caractères contenus dans $IFS
sont perdues - ce ne sont plus que des séparateurs de champs - elles le sont \0NUL
.
"$*"
- comme les autres extensions de variable entre guillemets doubles - remplace également les qualités de séparation de champ de $IFS
. Mais, en plus , il substitue le premier octet dans $IFS
pour chaque champ délimité dans "$@"
. Parce que "
a été la première valeur dans $IFS
tous les délimiteurs suivantes deviennent "
en "$*"
. Et le "
besoin n'est pas là non plus $IFS
lorsque vous le divisez. Vous pouvez modifier complètement $IFS
après set -- $args
une autre valeur et son nouveau premier octet apparaîtra alors pour les délimiteurs de champ dans "$*"
. De plus, vous pouvez en supprimer toutes les traces comme:
set -- $var; IFS=; printf %s "$*"
PRODUCTION
some crazy string here
tr
. Le PE de BASH est bon mais tr est beaucoup plus rapide dans ce cas. par exemple,echo "$OUTPUT" | tr -dc '[[:alpha:]]'
puisque vous ne voulez avoir que des caractères alphanumériques