Я пытаюсь написать код, который работает с моим списком аргументов,
например, если у меня есть -p a b c d -q g e f c в качестве аргументов:
когда я получаю -p, я хочу, чтобы цикл выполнялся с переменными a b c d, пока я не получу -q, а затем делаю что-то еще,
точно так же я хочу, чтобы это было наоборот;
это мой код:
#bin/bash
while test -n "$1" -a ${1:0:1} = - ;do
if test x$1=x-q:then
shift
while test -n "$1" ; do
echo $1
if test x$2=x-p;then
break;
shift
done
fi
if test x$1=x-p;then
echo 'print test'+$1;
shift
fi
done
но перерыв, похоже, не работает, кто-нибудь знает, как я могу это реализовать?
test x$1=x-q:then у вас есть : там, где вам нужно ;. Это ошибка копирования?
код работает нормально, ошибка в брейке; каков правильный синтаксис для этого?
Вам не хватает fi вместо if.
Вы должны указывать свои переменные.
-a устарел и почти устарел; вместо этого используйте test -n "$1" && test ${1:0:1} = -.
Пожалуйста, запустите свой код через shellcheck.net на наличие ошибок. Кроме того, если вы явно используете bash в своем шебанге (там отсутствует косая черта?), попробуйте [[ ... ]] вместо test .... Это шаг вперед почти во всех случаях.





Попробуйте сначала проанализировать все аргументы и собрать аргументы «-p» в одном массиве и аргументы «-q» в другом массиве:
p_args=()
q_args=()
opt = ""
for arg do
case $arg in
"-p") opt=p ;;
"-q") opt=q ;;
*) [[ $opt == p ]] && p_args+=("$arg")
[[ $opt == q ]] && q_args+=("$arg")
;;
esac
done
# do stuff with "-p" args
declare -p p_args
# do stuff with "-p" args
declare -p q_args
Можете ли вы немного сузить его? Я не уверен, что ваш реальный вопрос: «Почему этот синтаксис недействителен?» или «Почему
shiftне бежит заbreak?» или «Почемуtest x$1=x-pвсегда верно?»