Dividindo o argumento da linha de comando bash

5

Esta é a melhor maneira de dividir um argumento de linha de comando bash separado por dois pontos?

#!/bin/bash
hostlist='echo $1| awk '{split($0,Ip,":")} END{for (var in Ip) print Ip[var];}''
for host in $hostlist
 do
  ....
 done
    
por Alastair 30.05.2012 / 17:16

2 respostas

7

Outra maneira seria usar o IFS , o método interno do shell para dividir sequências em campos.

OLDIFS=$IFS
IFS=':'
set -f
for host in $hostlist; do
  set +f
  echo "$host"
done
set +f
IFS=$OLDIFS

set -f desativa a geração de nome de arquivo (globbing): sem ele, curingas *?\[ seriam expandidos em cada palavra.

    
por 30.05.2012 / 17:24
3

Acho que a solução mais simples é apenas usar o bash builtins:

#!/bin/bash
hostlist=${1//:/ }  # this will replace all : with a space

for host in $hostlist ; do
    echo ${host}
done

Outra maneira (ainda mais simples que a sua solução awk) é usar o corte, embora isso provavelmente dependa do corte GNU.

#!/bin/bash
hostlist=$(echo $1 | cut -d : --output-delimiter=" " -f 1-) 

for host in $hostlist ; do
    echo ${host}
done
    
por 30.05.2012 / 17:23