Como posso passar um argumento de linha de comando para um script de shell?

170

Eu sei que os scripts de shell apenas executam comandos como se fossem executados no prompt de comando. Eu gostaria de poder executar scripts de shell como se fossem funções ... Ou seja, levar um valor de entrada ou string para o script. Como eu me aproximo disso?

    
por Paul 10.02.2012 / 22:16

7 respostas

153

O comando shell e quaisquer argumentos para esse comando aparecem como variáveis de shell numeradas : $0 tem o valor de string do próprio comando, algo como script , ./script , /home/user/bin/script como queiras. Todos os argumentos aparecem como "$1" , "$2" , "$3" e assim por diante. A contagem de argumentos está na variável do shell "$#" .

Formas comuns de lidar com isso envolvem comandos shell getopts e shift . getopts é muito parecido com a função da biblioteca C getopt() . shift move o valor de $2 para $1 , $3 para $2 e assim por diante; $# é diminuído. O código acaba vendo o valor de "$1" , fazendo coisas usando caseesac para decidir uma ação e, em seguida, fazendo um shift para mover $1 para o próximo argumento. Ele só precisa examinar $1 e talvez $# .

    
por 10.02.2012 / 22:55
126

Você pode acessar os argumentos transmitidos com $n , em que n é o número do argumento - 1, 2, 3, ... . Você passa os argumentos como faria com qualquer outro comando.

$ cat myscript
#!/bin/bash
echo "First arg: $1"
echo "Second arg: $2"
$ ./myscript hello world
First arg: hello
Second arg: world
    
por 10.02.2012 / 22:24
23
$/shellscriptname.sh argument1 argument2 argument3 

Você também pode passar a saída de um script de shell como um argumento para outro script de shell.

$/shellscriptname.sh "$(secondshellscriptname.sh)"

Dentro do shell script você pode acessar argumentos com números como $1 para o primeiro argumento e $2 para o segundo argumento e assim por diante.

Mais sobre argumentos da shell

    
por 11.02.2012 / 06:07
12

O formulário

$ ./script.sh "$@" 

é o mais conveniente para argv . O delimitador arg é um espaço em branco, mas pode ser alterado. Não me lembro como fora de mão. Então use

 $1, $2, shift, if [ $# -ne 3 ] 

para controlar o fluxo. Eu não costumo abraçar getopts se um case ... esac for suficiente.

    
por 15.07.2016 / 11:21
11
./myscript myargument

myargument torna-se $1 dentro de myscript .

    
por 10.02.2012 / 22:21
4

No script de shell; torna-se o nome da variável $ 1. A segunda palavra se torna o nome da variável $ 2 e assim por diante.

cat << 'EOF' > test
echo "First arg: $1"
echo "Second arg: $2"
echo "List of all arg: $@"
EOF
sh test hello world

Mais talvez encontrado no manual shell (sh) no link

    
por 20.09.2017 / 15:12
-1

Se você está familiarizado com o Python argparse, e não se importa em chamar o python para analisar argumentos bash, use bash argparse ( link ),

Veja a mesma resposta aqui: link

    
por 04.05.2018 / 20:32