Як я можу передати аргумент командного рядка в сценарій оболонки?


242

Я знаю, що сценарії оболонки просто виконують команди так, ніби вони виконані в командному рядку. Я хотів би мати можливість запускати сценарії оболонки так, ніби це були функції ... Тобто, взявши в скрипт вхідне значення або рядок. Як я підходжу до цього?

Відповіді:


198

Командна оболонка і будь-які аргументи цієї команди відображаються в вигляді нумерованих змінних оболонки: $0має значення рядка самої команди, що - щось на зразок script, ./script, /home/user/bin/scriptабо будь-який інший . Будь-які аргументи з'являються як "$1", "$2", "$3"і так далі. Кількість аргументів знаходиться в змінній оболонки "$#".

Поширені способи боротьби з цим включають команди оболонки getoptsта shift. getoptsдуже нагадує функцію getopt()бібліотеки С. shiftпереміщує значення $2до $1, $3до $2тощо; $#зменшується. Код закінчується переглядом значення "$1", виконуючи речі, використовуючи case…, esacщоб вирішити дію, а потім зробити a, shiftщоб перейти $1до наступного аргументу. Це лише коли-небудь доводиться обстежувати $1, а може бути $#.


6
C getopt()- надзвичайно усталений стандарт, але getoptвиконуваний файл не є однаковим у дистрибутиві / платформі. Я зараз повністю перетворений getoptsкористувач, оскільки це стандарт POSIX. Він чудово працює і з тим dash, що є моїм улюбленим оболонком сценарію
JM Becker

165

Ви можете отримати доступ до переданих аргументів, $nде nзнаходиться номер аргументу - 1, 2, 3, .... Ви передаєте аргументи так само, як і в будь-якій іншій команді.

$ cat myscript
#!/bin/bash
echo "First arg: $1"
echo "Second arg: $2"
$ ./myscript hello world
First arg: hello
Second arg: world

27
$/shellscriptname.sh argument1 argument2 argument3 

Ви також можете передавати вихід одного сценарію оболонки як аргумент іншому сценарію оболонки.

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

У скрипті оболонки ви можете отримати аргументи з числами, як $1для першого аргументу та $2для другого аргументу тощо.

Детальніше про аргументи оболонки


18

Форма

$ ./script.sh "$@" 

є найбільш зручним для argv. Розмежувач аргументу - пробіл, але його можна змінити. Не пам’ятайте, як це було без рук. Потім використовуйте

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

для контролю потоку. Я, як правило, не обіймаю геттоптів, якщо case ... esacзаповіту вистачить.


14

У bash-скрипті я особисто люблю використовувати наступний сценарій для встановлення параметрів:

#!/bin/bash

helpFunction()
{
   echo ""
   echo "Usage: $0 -a parameterA -b parameterB -c parameterC"
   echo -e "\t-a Description of what is parameterA"
   echo -e "\t-b Description of what is parameterB"
   echo -e "\t-c Description of what is parameterC"
   exit 1 # Exit script after printing help
}

while getopts "a:b:c:" opt
do
   case "$opt" in
      a ) parameterA="$OPTARG" ;;
      b ) parameterB="$OPTARG" ;;
      c ) parameterC="$OPTARG" ;;
      ? ) helpFunction ;; # Print helpFunction in case parameter is non-existent
   esac
done

# Print helpFunction in case parameters are empty
if [ -z "$parameterA" ] || [ -z "$parameterB" ] || [ -z "$parameterC" ]
then
   echo "Some or all of the parameters are empty";
   helpFunction
fi

# Begin script in case all parameters are correct
echo "$parameterA"
echo "$parameterB"
echo "$parameterC"

Завдяки цій структурі ми не покладаємось на порядок параметрів, оскільки ми визначаємо ключову букву для кожного з них. Також довідкова функція буде надрукована весь час, коли параметри визначені неправильно. Це дуже корисно, коли ми маємо багато сценаріїв з різними параметрами для обробки. Він працює наступним чином:

$ ./myscript -a "String A" -b "String B" -c "String C"
String A
String B
String C

$ ./myscript -a "String A" -c "String C" -b "String B"
String A
String B
String C

$ ./myscript -a "String A" -c "String C" -f "Non-existent parameter"
./myscript: illegal option -- f

Usage: ./myscript -a parameterA -b parameterB -c parameterC
    -a Description of what is parameterA
    -b Description of what is parameterB
    -c Description of what is parameterC

$ ./myscript -a "String A" -c "String C"
Some or all of the parameters are empty

Usage: ./myscript -a parameterA -b parameterB -c parameterC
    -a Description of what is parameterA
    -b Description of what is parameterB
    -c Description of what is parameterC


5

В сценарії оболонки; вона стає назвою змінної $ 1. Друге слово стає назвою змінної $ 2 тощо.

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

Більше, можливо, можна знайти в посібнику з оболонки (sh) на веб-сайті http://heirloom.sourceforge.net/sh/sh.1.html


2
Ласкаво просимо до U&L, це навряд чи щось додасть до вже даної відповіді.
Архемар


0
#!/bin/bash
echo "First arg: $1"
echo "Second arg: $2"
echo "Your First Argument was $1 & Second Argument was $2" 2> /dev/null

------------------------------------------------------------------------

./scriptname.sh value1 value2

3
1) непотрібне 2> /dev/null, 2) нічого не додає до існуючих відповідей.
ксеноїд
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.