Problème
J'ai essayé d'extraire le niveau du signal pour le wifi de la manière suivante, dans un script bash (les guillemets semblent ne faire aucune différence):
string="$(iwconfig wlan0 | grep -I Signal)"
Si je echo $string
, j'obtiens ce que j'attends:
Link Quality=63/70 Signal level=-47dBm
Mais si j'essaye d'obtenir une sous-chaîne echo ${string:5}
, elle renvoie la même chose.
Débogage:
Si je colle la sortie de wconfig wlan0 | grep -I Signal
directement dans la variable: string="Link Quality=63/70 Signal level=-47dBm"
alors tout fonctionne comme prévu.
echo $string
# Link Quality=63/70 Signal level=-47dBm
echo ${string:5}
# Quality=63/70 Signal level=-47dBm
Question: Selon Internet, toutes les variables bash sont stockées sous forme de chaînes de caractères. Par conséquent, le résultat du débogage aurait dû être le même que mon problème d'origine. Y a-t-il une raison pour laquelle il n'est pas analysé en tant que texte dans le problème d'origine?
la source
Cela fonctionne sur ma machine:
wlp60s0
parwlan0
.42
etdBm
. En tant que telle, lacut
commande est invitée à imprimer les champs # 4 et # 5. Dans votre question, il n'y a pas d'espace donc je ne sais pas quelle version vous utilisez.Vous pouvez également utiliser:
cut
est dit d'utiliser=
comme délimiteur de champ.Si vous souhaitez utiliser
${string...}
la syntaxe correcte:L'une ou l'autre méthode fonctionnera pour prendre la sous-chaîne après la dernière
=
. La méthode originale de5
dans votre question, je ne comprends pas comment cela peut fonctionner.la source