Cómo pasar un set de valores al script de shell en la command-line y consejos sobre el bucle

El objective es get solo los nombres de file de svn log function del número de revisión. Cada confirmación tiene un número de ticket jira en el comentario svn, por lo que las revisiones svn se obtienen buscando los numbers de ticket jira.

Hasta ahora, el script funciona bien cuando solo doy un número de ticket jira, pero necesito que funcione cuando entrego más de un ticket jira.

  1. El problema con esta secuencia de commands es que la salida solo tiene valores de ticket-2. ¿Cómo puedo hacer que el resultado incluya valores tanto de ticket-1 como de ticket-2?

  2. Necesito ayuda sobre cómo pasar el ticket-1 y el ticket-2 como arguments para el script en lugar de asignarlos en el script.

Código:

 #!/bin/sh src_url=$1 target_url=$2 jira_ticket=("ticket-1 ticket-2") for i in $jira_ticket; do revs=(`svn log $1 --limit 10 | grep -B 2 $i | grep "^r" | cut -d"r" -f2 | cut -d" " - f1|sort -r`) done for revisions in ${!revs[*]}; do files=(`svn log -v $1 -r ${revs[$revisions]} | awk '$1~/^[AMD]$/{for(i=2;i<=NF;i++)print $i}'`) for (( i = 0; i < ${#files[@]}; i++ )); do echo "${files[$i]} @" ${revs[$revisions]} " will be merged." done done 

tl; dr

Porque el segundo ciclo (procesamiento de revs ) está fuera del primer ciclo (ajuste de las revs ). Mueva el segundo ciclo dentro del primer ciclo para solucionar este problema.

Reparaciones detalladas

Este script necesita una solución seria.

  • La matriz jira_ticket fue declarada incorrectamente – debería ser jira_ticket=("ticket-1" "ticket-2") .
  • Para recorrer todos los elementos de una matriz, utilice "${array[@]}" (las comillas son importantes para evitar la split accidental de palabras, y usar @ lugar de * hace que la expansión se divida en una palabra por elemento, que es lo que estás después). $array es equivalente a ${array[0]} .
  • El mismo principio con el bucle sobre las teclas de una matriz: diga "${!array[@]}" lugar de ${!array[*]} .
  • ¿Por qué pasar el cursor sobre las teclas cuando puede recorrer valores y no necesita las teclas?
  • No se garantiza la propagación de asignaciones variables en un bucle ( probablemente estén aquí, pero ocurren cosas extrañas en las tuberías y tal).
  • ¿Quiso ejecutar el segundo ciclo dentro del primer ciclo, para usar cada copy de las revs ? (Tal como está, solo está procesando la última copy).
  • Indique todas las expansiones variables ( "$1" , no $1 ).
  • Utilice la syntax de sustitución de command moderna $(command) lugar de las comillas inversas. Es mucho less propenso a errores.
  • Tendrá que configurar IFS correctamente para dividir correctamente los resultados de sustitución de commands. Creo que buscas un IFS de $'\n' ; Puedo estar equivocado .

Pasando los boletos como arguments

Usa shift después de lidiar con $1 para deshacerte de $1 , luego asigna todo lo que queda a la matriz jira_tickets .

El script, reparado lo mejor que puedo:

 #!/bin/sh # First argument is the source URL; remaining args are ticket numbers src_url="$1"; shift #target_url="$2"; shift # Never used # Handy syntax hint: `for i in "$@"; do` == `for i; do` for ticket; do # Fixed below $1 to be $src_url revs=($(IFS=$'\n'; svn log "$src_url" --limit 10 | grep -B 2 "$ticket" | grep "^r" | cut -d"r" -f2 | cut -d" " - f1 | sort -r)) for revision in "${revs[@]}"; do # I think you meant to loop over the values here, not the keys files=($(IFS=$'\n'; svn log -v "$src_url" -r "$revision" | awk '$1~/^[AMD]$/{for(i=2;i<=NF;i++)print $i}')) for file in "${files[@]}"; do # Think you wanted to loop over the values here too echo "$file @ $revision will be merged." done done done