У меня есть файл:
аргумент
#!/bin/bash
function parse ()
{
echo "in parse"
echo "starting to parse args $@"
while getopts "pq:" opt; do
echo "parsing arg $opt"
case "$opt" in
p) echo "got option p" ;;
q) echo "got option q with value ${OPTARG}" ;;
esac
done
}
parse "$@"
Это работает правильно:
balter$ bash argtest -pq 9
in parse
starting to parse args -pq 9
parsing arg p
got option p
parsing arg q
got option q with value 9
balter$ source argtest
in parse
starting to parse args
balter$ parse -pq 9
in parse
starting to parse args -pq 9
parsing arg p
got option p
parsing arg q
got option q with value 9
Однако, если у меня есть такая же функция в моем файле ~/.bashrc
, я получаю:
balter$ tail -16 ~/.bashrc
function parse ()
{
echo "in parse"
echo "starting to parse args $@"
while getopts "pq:" opt; do
echo "parsing arg $opt"
case "$opt" in
p) echo "got option p" ;;
q) echo "got option q with value ${OPTARG}" ;;
esac
done
}
balter$ source ~/.bashrc
balter$ parse -pq 9
in parse
starting to parse args -pq 9
Я заметил что-то странное в getopts
:
balter$ getopts
getopts: usage: getopts optstring name [arg]
balter$ which getopts
which: no getopts in (<other paths>:/bin:/usr/local/bin:/usr/bin:/opt/condor/bin)
ИЗМЕНИТЬ ХА! Решение найдено здесь Использование getopts внутри функции Bash
Это работает:
function parse ()
{
echo "in parse"
echo "starting to parse args $@"
local OPTIND
local OPTARG
local opt
while getopts "pq:" opt; do
echo "parsing arg $opt"
case "$opt" in
p) echo "got option p" ;;
q) echo "got option q with value ${OPTARG}" ;;
esac
done
}
Если кто-то хочет объяснить проблему local
, я буду рад услышать. Кроме того, если кто-то хочет объяснить, что такое which getopts
, я буду рад это услышать.
export PATH
перед определением функции или после в.bashrc
- person Inian   schedule 18.02.2017which getopts
? - person abalter   schedule 18.02.2017.bashrc
, потому что проблема, похоже, заключается в том, что он не может найти путь, где установленgetopts
, в тот момент, когда вы запускаете функцию. - person Inian   schedule 18.02.2017