GNU/Linux >> Tutoriales Linux >  >> Linux

¿Cómo divido un literal de cadena extremadamente largo en bash?

Defino una función strcat corta en la parte superior de mi script bash y uso una invocación en línea para dividir las cosas. A veces prefiero usar una variable separada porque puedo definir el literal largo en línea con la invocación del comando.

function strcat() {
  local IFS=""
  echo -n "$*"
}

mycommand \
  --server myserver \
  --filename "$(strcat \
      extremely/long/file/name/ \
      that/i/would/like/to/be/able/to/break/ \
      up/if/possible)" \
  --otherflag \
  --anotherflag \

También me gusta este enfoque cuando tengo que ingresar un CSV largo de valores como parámetro de marca porque puedo usarlo para evitar escribir la coma entre valores:

function strjoin() {
  local IFS="$1"
  shift
  echo -n "$*"
}

csv_args=(
  foo=hello
  bar=world
  "this=arg  has  spaces  in  it"
)
mycommand \
  --server myserver \
  --csv_args "$(strjoin , "${csv_args[@]}")" \
  --otherflag \
  --anotherflag \

Que es equivalente a

mycommand \
  --server myserver \
  --csv_args "foo=hello,bar=world,this=arg  has  spaces  in  it" \
  --otherflag \
  --anotherflag \

Puedes usar una variable:

file=extremely/long/file/name
file+=/that/i/would/like/to/be/able/to/break
file+=/up/if/possible

mycommand\
    --server myserver\
    --filename $file\
    --flag flag

También se puede usar una variable de matriz

file=(extremely/long/file/name
    /that/i/would/like/to/be/able/to/break
    /up/if/possible)
IFS=''

echo mycommand\
    --server myserver\
    --filename "${file[*]}"\
    --flag flag

Es un un poco piratear, pero esto funciona:

mycommand \
    --server myserver \
    --filename "extremely/long/file/name/"`
               `"that/i/would/like/to/be/able/to/break/"`
               `"up/if/possible" \
    --otherflag \
    --anotherflag

Bash concatena literales de cadena que son adyacentes, así que aprovechamos eso. Por ejemplo, echo "hi" "there" imprime hi there mientras que echo "hi""there" imprime hithere .

También aprovecha el operador de acento grave y el hecho de que un montón de espacios se evalúa como nada.


Linux
  1. Cómo escribir un bucle en Bash

  2. ¿Cómo leer una cadena como número hexadecimal en Bash?

  3. Cómo dividir una cadena en Bash Script

  4. ¿Cómo funciona cat << EOF en bash?

  5. ¿Cómo escribir una cadena de varias líneas usando Bash con variables?

Bash break:cómo salir de un bucle

Bash concatenar cadenas

Cómo verificar si una cadena contiene una subcadena en Bash

Cómo usar bash if -z y if -n para probar cadenas en Linux

Bash Scripting – Manipulación de cadenas

Cómo ejecutar un script Bash