bash script: passando argumentos para o mkfs

0

Estou escrevendo um script bash para formatar minhas partições. Um dos comandos que quero executar é o seguinte:

mkfs.btrfs -f -m single -L root /dev/sda1

Então eu dividi o comando na parte de opções: -f -m single -L root e a parte da partição: /dev/sda1 e colocá-los em variáveis como esta:

mkfs.btrfs "${myoptions}" /dev/"${mypartition}"

mas falha com:

mkfs.btrfs: invalid option -- ´ ´

Eu tentei variações diferentes, como colocar as duas partes em duplas, mas todas falharam. Eu também tentei colocar as duas partes em uma matriz e executá-lo assim:

mkfs.btrfs "${array[1]}" "${array[2]}"

ou assim:

mkfs.btrfs "${array[*]}"

mas também falha.

Se eu rodá-lo sem a parte de opções funciona, então meu palpite é que o problema vem do espaço vazio entre os dois argumentos, mas eu não sei como resolvê-lo.

    
por coverflower 01.05.2018 / 16:52

2 respostas

3

I have also tried to put the two parts into an array...

Não é bom o suficiente. Todo argumento único deve ser um elemento de uma matriz (ou o único valor na variável).

args1=(-f -m single -L root)
args2=/dev/"$mypartition"
mkfs.btrfs "${args1[@]}" "$args2"
    
por 01.05.2018 / 16:56
0

Esse tipo de coisa é sempre uma dor enorme para mim. Neste caso, já que nenhum dos seus argumentos possui espaços, eu tentaria remover as aspas duplas e deixar o Bash dividi-lo em palavras para sua variável $myoptions . Então isso:

mkfs.btrfs ${myoptions} /dev/"${mypartition}"

Com as aspas duplas, você obtém um campo, -f -m single -L root contendo espaços. Sem ele, ele deve ser dividido em campos individuais -f -m single -L e root e mostra o mesmo comportamento que digitar mkfs.btrfs -f -m single -L root /dev/sda1 no shell interativo.

Se você tiver alguns argumentos que contenham espaços, talvez seja complicado usar a variável $IFS e sua codificação.

Você também pode usar a variável especial $@ , que tem suas próprias regras.

Eu escrevo todas as coisas da minha shell para o POSIX, então tenho certeza que existe uma maneira mais fácil de fazer isso no Bash.

    
por 01.05.2018 / 17:10