Создать ссылку на переменную на основе другого имени переменной в сценарии bash? [дубликат]

Para cortar (truncar )cada línea del archivo (y tener la salida en la consola actual )use:

cut -c -80 infile               # cut only counts bytes (fail with utf8)
grep -o '^.\{1,80\}' infile
sed 's/\(^.\{1,80\}\).*/\1/' infile

Si lo que desea es insertar una nueva línea en el carácter 80 y dividir cada línea de más de 80 caracteres en más líneas, use:

fold -w 80 infile            # fold, like cut, counts bytes.

Si desea dividir solo en espacios (palabras completas ), use:

fold -sw 80 infile

Para todas las soluciones anteriores, redirija a algún otro archivo como>outfile(no use el mismo nombre, eso no funcionará )al final de cualquier comando para almacenar el resultado en outfile. Ejemplo:

fold -sw 80 infile > outfile
0
22.07.2019, 06:49
2 ответа

Вместо этого я бы предложил использовать ассоциативные массивы:

#! /bin/bash -
typeset -A dir log # declare both variables as associative arrays
dir=(
   [family]=/home/family
  [friends]=/home/friends
     [pets]=/home/pets
)
log=(
   [family]=/var/log/family.log
  [friends]=/var/log/friends.log
     [pets]=/var/log/pets.log
)
for type in "${!dir[@]}"
do
  cat -- "${dir[$type]}/somefile" >> "${log[$type]}"
done

("${!array[@]}"является синтаксисом ksh для получения списка ключей массива (в произвольном порядке )).

Или более разборчиво в zsh (, который имел ассоциативные массивы за десятилетия до bash):

#! /bin/zsh -
typeset -A dir log
dir=(
  family  /home/family
  friends /home/friends
  pets    /home/pets
)
log=(
  family  /var/log/family.log
  friends /var/log/friends.log
  pets    /var/log/pets.log
)
for type in ${(k)dir}
do
  cat -- $dir[$type]/somefile >> $log[$type]
done

В ksh93 (, из которого bash позаимствовал синтаксис ассоциативного массива ), вы также могли использовать ассоциативные массивы составных переменных:

#! /bin/ksh93 -
conf=(
   [family]=(dir=/home/family;  log=/var/log/family.log)
  [friends]=(dir=/home/friends; log=/var/log/friends.log)
     [pets]=(dir=/home/pets;    log=/var/log/pets.log)
)
for type in "${!conf[@]}"
do
  cat -- "${conf[$type].dir}/somefile" >> "${conf[$type].log}"
done
2
28.01.2020, 02:29

Имея в виду предоставленные вами переменные и приведенный ниже код, вы получите то, что ищете. Я надеюсь, что это может помочь вам и другим сейчас и в будущем.

Баш Многострочный:

for TYPE in family friends pets 
do  
    for FILE in $(eval echo "\$path_$TYPE/*")
    do 
        cat $FILE >> $(eval echo "\$path_${TYPE}_log")
    done
done

Одинарный вкладыш

for TYPE in family friends pets ;do  for FILE in $(eval echo "\$path_$TYPE/*"); do cat $FILE >> $(eval echo "\$path_${TYPE}_log") ;done ; done
0
28.01.2020, 02:29

Теги

Похожие вопросы