web-dev-qa-db-fra.com

Comment trouver la longueur de la ficelle dans la coque

Je dois calculer la longueur d'une chaîne en utilisant uniquement sh Shell. Ce qui se passe, c’est que /bin/sh est en fait un lien symbolique vers bash ou un autre shell. Ainsi, ${#STRING} donne la longueur de la chaîne car il s'agit de la fonctionnalité advance bash.

Quelqu'un peut-il me dire comment je peux trouver la longueur de la chaîne? J'utilise l'architecture Solaris 5.10 Sparc

7
Niraj

wc -m compte les caractères dans une chaîne. Donc, vous pouvez faire quelque chose comme:

STRLENGTH=$(echo -n $STRING | wc -m)

Syntaxe alternative:

STRLENGTH=`echo -n $STRING | wc -m`

L’indicateur -n pour écho empêche l’impression d’une nouvelle ligne. L’indicateur peut être différent sous Solaris 5. Vérifiez man echo

9
Peter Lamby

Voici deux façons de le faire.

myvar="This is a test"
echo "${#myvar}"
14

Ou

expr length "${myvar}"
14
7
R J

Voici deux manières:

echo ${#VAR}
echo -n $VAR | wc -m
echo -n $VAR | wc -c
printf $VAR | wc -m
expr length $VAR
expr $VAR : '.*'

http://techopsbook.blogspot.fr 2017/09/how-to-find-length-of-string-variable.html

2
Mukesh Shakya

Utiliser ${#string} pour obtenir la longueur de $string est un développement de paramètre pour le shell POSIX . Ce n'est pas une caractéristique bash- seulement.

Sous Solaris 5.10, si /bin/sh ou /usr/bin/sh (comme indiqué dans le manuel sh(1) ) ne le prend pas en charge, alors /usr/xpg4/bin/sh le fera.

Pour obtenir le comportement POSIX sur un système Solaris 5.10, votre PATH doit être défini sur

/usr/xpg6/bin:/usr/xpg4/bin:/usr/ccs/bin:/usr/bin

(dans cet ordre), comme décrit dans le manuel standards(5) .

1
Kusalananda

Je ne pense pas que "pure sh" puisse le faire. Mais vous n'avez rien à faire en "sh pur"; vous devez le faire dans sh plus les utilitaires standard. Le moyen le plus simple est:

strlength=`expr "$string" : ".*"`

( expr est POSIX). Sinon, si vous n'avez pas expr (Solaris 5.1 est ancien), vous pouvez également utiliser wc avec printf comme:

strlength=`printf "%s" "$string" | wc -m`

N'essayez tout simplement pas d'utiliser echo, car echo ajoutera des retours à la ligne et il n'existe aucun moyen standard de le supprimer.

Notez que wc -m compte les caractères et wc -c compte les octets s'il existe une différence dans les paramètres régionaux en cours.

1
Jan Hudec

set var = "test test test";

echo $% var;

14

0
user874816

(Bien qu'il y ait déjà beaucoup de réponses, mais pense qu'elles ne sont pas si intuitives, j'ajouterais donc une réponse pour que ce soit clair à première vue)

Si vous voulez juste le faire dans Shell (bash) en ligne de commande (ou même un script) .

Vous pouvez utiliser l’une des méthodes suivantes:

  • Utilisez echo -n et wc -m
  • Utilisez printf et wc -m

par exemple

# 5
echo -n hello | wc -m

# 11
echo -n "hello world" | wc -m

# 5
printf "hello" | wc -m

# 11
printf "hello world" | wc -m

# 11
printf "hello %s" world | wc -m

Astuces:

  • echo par défaut ajoutera une nouvelle ligne à la fin. L'option -n est donc nécessaire pour éviter cela.
  • S'il y a de la place dans la chaîne d'entrée, alors citez-la.
0
Eric Wang