what sheet script es6 cheatsheet cheat bash split

bash - script - vim cheat sheet



Número de fichas en la variable bash (7)

¿Cómo puedo saber la cantidad de tokens en una variable bash (tokens separadas por espacios en blanco)? o, al menos, si es una o hay más.


La expansión $ # le dirá el número de elementos en una variable / matriz. Si está trabajando con una versión de bash superior a 2.05, puede:

VAR=''some string with words'' VAR=( $VAR ) echo ${#VAR[@]}

Esto efectivamente divide la cadena en una matriz a lo largo del espacio en blanco (que es el delimitador predeterminado), y luego cuenta los miembros de la matriz.

EDITAR:

Por supuesto, esto redistribuye la variable como una matriz. Si no quieres eso, usa un nombre de variable diferente o vuelve a fundir la variable en una cadena:

VAR="${VAR[*]}"


Método simple:

$ VAR="a b c d" $ set $VAR $ echo $# 4


No estoy seguro de si esto es exactamente lo que quisiste decir, pero:

$# = Número de argumentos pasados ​​al script de bash

De lo contrario, podría estar buscando algo como el man wc


No puedo entender por qué la gente usa esos bashismos demasiado complicados todo el tiempo. Casi siempre hay una solución directa, sin bashismo.

howmany() { echo $#; } myvar="I am your var" howmany $myvar

Esto usa el tokenizador incorporado en el shell, por lo que no hay discrepancia.

Aquí hay un gotcha relacionado:

myvar=''*'' echo $myvar echo "$myvar" set -f echo $myvar echo "$myvar"

Tenga en cuenta que la solución de @guns utilizando bash array tiene el mismo gotcha.

La siguiente es una versión (supuestamente) súper robusta para solucionar el problema:

howmany() ( set -f; set -- $1; echo $# )

Si queremos evitar la subshell, las cosas empiezan a ponerse feas.

howmany() { case $- in *f*) set -- $1;; *) set -f; set -- $1; set +f;; esac echo $# }

Estos dos deben usarse CON comillas, por ejemplo, howmany "one two three" devuelve 3


Para contar:

sentence="This is a sentence, please count the words in me." words="${sentence//[^/ ]} " echo ${#words}

Verificar:

sentence1="Two words" sentence2="One" [[ "$sentence1" =~ [/ ] ]] && echo "sentence1 has more than one word" [[ "$sentence2" =~ [/ ] ]] && echo "sentence2 has more than one word"


Para una solución sh robusta y portátil , vea las funciones de @ JoSo usando set -f .

(Solución simple de bash solo para responder (solo) a la pregunta "¿Hay al menos un espacio en blanco?"; Nota: también coincidirá con los espacios en blanco al principio y al final, a diferencia de la solución awk continuación:

[[ $v =~ [[:space:]] ]] && echo "/$v has at least 1 whitespace char."

)

Aquí hay una solución bash robusta basada en awk (menos eficiente debido a la invocación de una utilidad externa, pero probablemente no importa en muchos escenarios del mundo real):

# Functions - pass in a quoted variable reference as the only argument. # Takes advantage of `awk` splitting each input line into individual tokens by # whitespace; `NF` represents the number of tokens. # `-v RS=$''/3''` ensures that even multiline input is treated as a single input # string. countTokens() { awk -v RS=$''/3'' ''{print NF}'' <<<"$1"; } hasMultipleTokens() { awk -v RS=$''/3'' ''{if(NF>1) ec=0; else ec=1; exit ec}'' <<<"$1"; } # Example: Note the use of glob `*` to demonstrate that it is not # accidentally expanded. v=''I am *'' echo "/$v has $(countTokens "$v") token(s)." if hasMultipleTokens "$v"; then echo "/$v has multiple tokens." else echo "/$v has just 1 token." fi


set VAR=''hello world'' echo $VAR | wc -w

Aquí es cómo puede comprobar.

if [ `echo $VAR | wc -w` -gt 1 ] then echo "Hello" fi