comment diviser la chaîne après et avant l'espace dans le script shell?

17

J'ai une variable qui apparaît sur l'écho comme ceci

$ echo $var
129 148

Je dois prendre seulement 129 en sortie. Comment vais-je diviser 129 et 148?

surbhi
la source
echo "${var% *}" && echo "${var#* }"...
jasonwryan

Réponses:

31

En plus de la suggestion de jasonwryan , vous pouvez utiliser cut:

echo $var | cut -d' ' -f1

Ce qui précède cutest la echosortie avec un délimiteur d'espace ( -d ' ') et sort le premier champ ( -f1)

Joseph R.
la source
ça ne marche pas. je l'ai déjà utilisé. il dit que la commande est introuvable.
surbhi
3
@surbhi Que dit la commande introuvable? cutest un utilitaire standard. Votre script contient probablement une erreur ailleurs. Plus généralement, ne dites jamais «ça ne marche pas». Dites toujours exactement quel code vous avez exécuté, exactement ce qui s'est passé, et copiez-collez les messages d'erreur.
Gilles 'SO- arrête d'être méchant'
Cette réponse doit être acceptée, car c'est la manière la plus concise et la plus directe. Cela ne fonctionnera pas dans les cas qui sont plus compliqués que l'exemple donné, bien sûr.
Dan Nguyen
10

Une bonne façon de le faire est d'utiliser un tableau bash pour fractionner une chaîne sur des espaces. Vous pouvez déclarer un tableau simplement en utilisant des crochets:

var="129 148     181"
vars=( $var )
echo "First  word of var: '${vars[0]}'"
echo "Second word of var: '${vars[1]}'"
echo "Third  word of var: '${vars[2]}'"
echo "Number of words in var: '${#vars[@]}'"
gogoud
la source
cela dit que la commande n'est pas trouvée
surbhi
Cela dépend de votre utilisation de bash. Si vous utilisez un autre shell, cela peut ne pas fonctionner. echo $SHELLdevrait montrer: /bin/bashou similaire.
gogoud
ne fonctionne pas zsh; (
TonyH
Cela fonctionne dans ZSH zoom="one two three"; declare -a zoomie=( $( echo $zoom | cut -d' ' -f1- ) ); echo ${zoomie[2]};
TonyH