Path: utzoo!utgpu!jarvis.csri.toronto.edu!cs.utexas.edu!usc!rutgers!mcnc!thorin!grover!beckerd From: beckerd@grover.cs.unc.edu (David Becker) Newsgroups: gnu.bash.bug Subject: complex functions Summary: can bash handle this? Message-ID: <11606@thorin.cs.unc.edu> Date: 23 Jan 90 17:13:30 GMT Sender: news@thorin.cs.unc.edu Reply-To: beckerd@grover.cs.unc.edu (David Becker) Distribution: na Organization: University Of North Carolina, Chapel Hill Lines: 147 I have a script from a friend that gives cd a history in ksh. I've found it handier than CDPATH. Anyways bash barfs. In particular it doesn't take the typedef flags which isn't too big a deal but it also won't swallow ((i=cdlen)). The double parentheses cause a syntax error. Should in its present incarnation handle this stuff(ie there's a bug) or is bash not up to these functions yet? The texinfo on bash shell scripts didn't say much. The first syntax error occurs on line 38 at the (( # # CD History function originally by Shane McCaron # external shell variables # CDHISTFILE - where you want the history kept # alias cd=_cd function _cd { typeset -i cdlen i typeset t if [ $# -eq 0 ] then set -- $HOME fi if [ "$CDHISTFILE" -a -r "$CDHISTFILE" ] # if directory history exists then typeset CDHIST i=-1 while read -r t # read directory history file do CDHIST[i=i+1]=$t done <$CDHISTFILE fi if [ "${CDHIST[0]}" != "$PWD" -a "$PWD" != "" ] then _cdins # insert $PWD into cd history fi cdlen=${#CDHIST[*]} # number of elements in history case "$@" in -) # cd to new dir if [ "$OLDPWD" = "" ] && ((cdlen>1)) # SYNTAX HERE from BASH then print ${CDHIST[1]} 'cd' ${CDHIST[1]} else 'cd' $@ fi ;; -l) # print directory list typeset -R3 num ((i=cdlen)) while (((i=i-1)>=0)) do num=$i print "$num ${CDHIST[i]}" done return ;; -[0-9]|-[0-9][0-9]) # cd to dir in list if (((i=${1#-})=cdlen)) then 'cd' $@ fi ;; *) # cd to new dir 'cd' $@ ;; esac _cdins # insert $PWD into cd history if [ "$CDHISTFILE" ] then cdlen=${#CDHIST[*]} # number of elements in history i=0 while ((i$CDHISTFILE fi # set_prompt return 0 } function _cdins # insert $PWD into cd history { # meant to be called only by _cd typeset -i i ((i=0)) while ((i<${#CDHIST[*]})) # see if dir is already in list do if [ "${CDHIST[$i]}" = "$PWD" ] then break fi ((i=i+1)) done if ((i>22)) # limit max size of list then i=22 fi while (((i=i-1)>=0)) # bump old dirs in list do CDHIST[i+1]=${CDHIST[i]} done CDHIST[0]=$PWD # insert new directory in list } David Becker beckerd@cs.unc.edu