Прочитать аргументы bash-скрипта несколько раз - PullRequest
0 голосов
/ 25 апреля 2018

У меня есть сценарий bash, которому может быть передан ряд различных аргументов и переменных, которые будут использоваться самим сценарием. Некоторые параметры присваиваются переменным. секундный цикл while , по-видимому, не работает, когда программа пытается его выполнить. Я упростил следующий скрипт из соображений конфиденциальности / простоты.

./myscript --dir2 /new/path
while :; do
  case $1 in
    --var1) $var1=$2
    ;;
    --var2) $var2=$2
    ;;
    "") break
  esac
  shift
done

$dir1=/default/directory
$dir2=/default/directory

while :; do
  case $1 in
    --dir1) $dir1=$2
    ;;
    --dir2) $dir2=$2
    ;;
    "") break 
  esac
  shift
done

echo "Expect /default/directory, returned: $dir1" 
echo "Expect /new/path, returned: $dir2"

Вот то, что моя программа эффективно вернула бы.

Expected /default/directory, returned: /default/directory
Expected /new/path, returned: /default/directory

Есть ли лучший способ сделать это? Или другой способ перебора параметров, изначально переданных в сценарий? Спасибо за помощь!

Ответы [ 2 ]

0 голосов
/ 25 апреля 2018

Если вы хотите сохранить свои аргументы, вы можете скопировать их в массив, а затем восстановить исходный список из этого массива:

#!/usr/bin/env bash
#              ^^^^ - must be invoked as bash, not sh, for array support

# Copy arguments into an array
original_args=( "$@" )

# ...consume them during parsing...
while :; do # ...parse your arguments here...
  shift
done

# ...restore from the array...
set -- "${original_args[@]}"

# ...and now you can parse them again.
0 голосов
/ 25 апреля 2018

Это потому, что вы используете shift, который потребляет элементы.Попробуйте использовать цикл for для перебора аргументов.Есть несколько способов сделать это.Вот мой предпочтительный метод:

for elem in "$@" # "$@" has the elements in an array 
do
   ... # can access the current element as $elem
done

Другой способ - получить к ним доступ по индексу, для этого вы можете найти учебник по синтаксису массива bash.

...