1This file is shift.def, from which is created shift.c. 2It implements the builtin "shift" in Bash. 3 4Copyright (C) 1987-2020 Free Software Foundation, Inc. 5 6This file is part of GNU Bash, the Bourne Again SHell. 7 8Bash is free software: you can redistribute it and/or modify 9it under the terms of the GNU General Public License as published by 10the Free Software Foundation, either version 3 of the License, or 11(at your option) any later version. 12 13Bash is distributed in the hope that it will be useful, 14but WITHOUT ANY WARRANTY; without even the implied warranty of 15MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 16GNU General Public License for more details. 17 18You should have received a copy of the GNU General Public License 19along with Bash. If not, see <http://www.gnu.org/licenses/>. 20 21$PRODUCES shift.c 22 23#include <config.h> 24 25#if defined (HAVE_UNISTD_H) 26# ifdef _MINIX 27# include <sys/types.h> 28# endif 29# include <unistd.h> 30#endif 31 32#include "../bashansi.h" 33#include "../bashintl.h" 34 35#include "../shell.h" 36#include "common.h" 37 38$BUILTIN shift 39$FUNCTION shift_builtin 40$SHORT_DOC shift [n] 41Shift positional parameters. 42 43Rename the positional parameters $N+1,$N+2 ... to $1,$2 ... If N is 44not given, it is assumed to be 1. 45 46Exit Status: 47Returns success unless N is negative or greater than $#. 48$END 49 50int print_shift_error; 51 52/* Shift the arguments ``left''. Shift DOLLAR_VARS down then take one 53 off of REST_OF_ARGS and place it into DOLLAR_VARS[9]. If LIST has 54 anything in it, it is a number which says where to start the 55 shifting. Return > 0 if `times' > $#, otherwise 0. */ 56int 57shift_builtin (list) 58 WORD_LIST *list; 59{ 60 intmax_t times; 61 int itimes, nargs; 62 63 CHECK_HELPOPT (list); 64 65 if (get_numeric_arg (list, 0, ×) == 0) 66 return (EXECUTION_FAILURE); 67 68 if (times == 0) 69 return (EXECUTION_SUCCESS); 70 else if (times < 0) 71 { 72 sh_erange (list ? list->word->word : NULL, _("shift count")); 73 return (EXECUTION_FAILURE); 74 } 75 nargs = number_of_args (); 76 if (times > nargs) 77 { 78 if (print_shift_error) 79 sh_erange (list ? list->word->word : NULL, _("shift count")); 80 return (EXECUTION_FAILURE); 81 } 82 else if (times == nargs) 83 clear_dollar_vars (); 84 else 85 shift_args (itimes = times); 86 87 invalidate_cached_quoted_dollar_at (); 88 89 return (EXECUTION_SUCCESS); 90} 91