Package: bash
Version: 3.2-4
Severity: normal

The man page for bash states:

       for name [ in word ] ; do list ; done
              The list of words following in is expanded, generating 
a list of
              items.  The variable name is set to each element of 
this list in
              turn,  and  list is executed each time.  ...

This has been the expected behavior of for name in word since
the introduction of the Bourne shell, 30 years ago.

In the case of for name in *, bash executes the loop only once
with name set to the entire list of all the files in the current
directory.

This means that a significant number of scripts do not work as
they should.

I have generated the following test cases from a script called
speakupconf that is distributed with the speakup-doc package.
I am sure that I have seen this problem with scripts that I
have written, as well.

The first case is using the script as distributed.  I created
the second and third cases by using alternate formats for the
for statement.  The forth case uses ls to generate the file
list, and is the only one that works.

Case 1:  asterisk adjacent to semicolon

#!/bin/sh
set -x
# script to load/save all the vars in speakup
# speakupconf save or speakupconf load
# if root saves in /etc/speakup/<synth> else in $HOME/.speakup/<synth>
if [ $UID -eq "0" ]; then
  SAVEDIR="/etc/speakup"
else
  SAVEDIR="$HOME/.speakup"
fi
if [ ! -d /sys/module/speakup/parameters ]; then
  echo "no directory /sys/module/speakup/parameters"
  exit 0
fi
SYNTH=`cat /sys/module/speakup/parameters/synth`
case "$1" in
*save)
  if [ ! -d $SAVEDIR ] ; then
    echo creating $SAVEDIR
    mkdir $SAVEDIR
  fi
  if [ ! -d $SAVEDIR/$SYNTH ] ; then
    echo creating $SAVEDIR/$SYNTH
    mkdir $SAVEDIR/$SYNTH
  fi
  cd /sys/module/speakup/parameters
  SAVELIST=`    find . -perm -6 |sed 's/..//' |fgrep -v synth`
  for f in $SAVELIST; do
    cp $f $SAVEDIR/$SYNTH/$f
  done
;;
*load)
  if [ ! -d $SAVEDIR ] ; then
    echo no directory $SAVEDIR
    exit 1
  fi
  if [ ! -d $SAVEDIR/$SYNTH ] ; then
    echo no directory $SAVEDIR/$SYNTH
    exit 1
  fi
  cd $SAVEDIR/$SYNTH
  for f in *; do
    if [ -w /sys/module/speakup/parameters/$f ]; then
      cat $f >/sys/module/speakup/parameters/$f
    fi
  done
;;
*)
  echo "usage: speakupconf load/save"
  exit 1
;;
esac

Results 1:

+ '[' 0 -eq 0 ']'
+ SAVEDIR=/etc/speakup
+ '[' '!' -d /sys/module/speakup/parameters ']'
++ cat /sys/module/speakup/parameters/synth
+ SYNTH=ltlk
+ case "$1" in
+ '[' '!' -d /etc/speakup ']'
+ '[' '!' -d /etc/speakup/ltlk ']'
+ cd /etc/speakup/ltlk
+ for f in '*'
+ '[' -w /sys/module/speakup/parameters/attrib_bleep 
/sys/module/speakup/parameters/bell_pos 
/sys/module/speakup/parameters/bleeps 
/sys/module/speakup/parameters/bleep_time 
/sys/module/speakup/parameters/caps_start 
/sys/module/speakup/parameters/caps_stop 
/sys/module/speakup/parameters/characters 
/sys/module/speakup/parameters/chartab 
/sys/module/speakup/parameters/cursor_time 
/sys/module/speakup/parameters/delay_time 
/sys/module/speakup/parameters/delimiters 
/sys/module/speakup/parameters/ex_num 
/sys/module/speakup/parameters/freq 
/sys/module/speakup/parameters/full_time 
/sys/module/speakup/parameters/jiffy_delta 
/sys/module/speakup/parameters/key_echo 
/sys/module/speakup/parameters/keymap 
/sys/module/speakup/parameters/lang 
/sys/module/speakup/parameters/no_interrupt 
/sys/module/speakup/parameters/pitch 
/sys/module/speakup/parameters/punc_all 
/sys/module/speakup/parameters/punc_level 
/sys/module/speakup/parameters/punc_most 
/sys/module/speakup/parameters/punc_some 
/sys/module/speakup/parameters/punct 
/sys/module/speakup/parameters/quiet 
/sys/module/speakup/parameters/rate 
/sys/module/speakup/parameters/reading_punc 
/sys/module/speakup/parameters/repeats 
/sys/module/speakup/parameters/say_control 
/sys/module/speakup/parameters/say_word_ctl 
/sys/module/speakup/parameters/silent 
/sys/module/speakup/parameters/spell_delay 
/sys/module/speakup/parameters/synth 
/sys/module/speakup/parameters/synth_direct 
/sys/module/speakup/parameters/tone 
/sys/module/speakup/parameters/trigger_time 
/sys/module/speakup/parameters/version 
/sys/module/speakup/parameters/voice 
/sys/module/speakup/parameters/vol ']'
/usr/local/bin/speakupconf: line 43: [: too many arguments

Case 2:  space between asterisk and semicolon

#!/bin/sh
set -x
# script to load/save all the vars in speakup
# speakupconf save or speakupconf load
# if root saves in /etc/speakup/<synth> else in $HOME/.speakup/<synth>
if [ $UID -eq "0" ]; then
  SAVEDIR="/etc/speakup"
else
  SAVEDIR="$HOME/.speakup"
fi
if [ ! -d /sys/module/speakup/parameters ]; then
  echo "no directory /sys/module/speakup/parameters"
  exit 0
fi
SYNTH=`cat /sys/module/speakup/parameters/synth`
case "$1" in
*save)
  if [ ! -d $SAVEDIR ] ; then
    echo creating $SAVEDIR
    mkdir $SAVEDIR
  fi
  if [ ! -d $SAVEDIR/$SYNTH ] ; then
    echo creating $SAVEDIR/$SYNTH
    mkdir $SAVEDIR/$SYNTH
  fi
  cd /sys/module/speakup/parameters
  SAVELIST=`    find . -perm -6 |sed 's/..//' |fgrep -v synth`
  for f in $SAVELIST; do
    cp $f $SAVEDIR/$SYNTH/$f
  done
;;
*load)
  if [ ! -d $SAVEDIR ] ; then
    echo no directory $SAVEDIR
    exit 1
  fi
  if [ ! -d $SAVEDIR/$SYNTH ] ; then
    echo no directory $SAVEDIR/$SYNTH
    exit 1
  fi
  cd $SAVEDIR/$SYNTH
  for f in * ; do
    if [ -w /sys/module/speakup/parameters/$f ]; then
      cat $f >/sys/module/speakup/parameters/$f
    fi
  done
;;
*)
  echo "usage: speakupconf load/save"
  exit 1
;;
esac

Results 2:

+ '[' 0 -eq 0 ']'
+ SAVEDIR=/etc/speakup
+ '[' '!' -d /sys/module/speakup/parameters ']'
++ cat /sys/module/speakup/parameters/synth
+ SYNTH=ltlk
+ case "$1" in
+ '[' '!' -d /etc/speakup ']'
+ '[' '!' -d /etc/speakup/ltlk ']'
+ cd /etc/speakup/ltlk
+ for f in '*'
+ '[' -w /sys/module/speakup/parameters/attrib_bleep 
/sys/module/speakup/parameters/bell_pos 
/sys/module/speakup/parameters/bleeps 
/sys/module/speakup/parameters/bleep_time 
/sys/module/speakup/parameters/caps_start 
/sys/module/speakup/parameters/caps_stop 
/sys/module/speakup/parameters/characters 
/sys/module/speakup/parameters/chartab 
/sys/module/speakup/parameters/cursor_time 
/sys/module/speakup/parameters/delay_time 
/sys/module/speakup/parameters/delimiters 
/sys/module/speakup/parameters/ex_num 
/sys/module/speakup/parameters/freq 
/sys/module/speakup/parameters/full_time 
/sys/module/speakup/parameters/jiffy_delta 
/sys/module/speakup/parameters/key_echo 
/sys/module/speakup/parameters/keymap 
/sys/module/speakup/parameters/lang 
/sys/module/speakup/parameters/no_interrupt 
/sys/module/speakup/parameters/pitch 
/sys/module/speakup/parameters/punc_all 
/sys/module/speakup/parameters/punc_level 
/sys/module/speakup/parameters/punc_most 
/sys/module/speakup/parameters/punc_some 
/sys/module/speakup/parameters/punct 
/sys/module/speakup/parameters/quiet 
/sys/module/speakup/parameters/rate 
/sys/module/speakup/parameters/reading_punc 
/sys/module/speakup/parameters/repeats 
/sys/module/speakup/parameters/say_control 
/sys/module/speakup/parameters/say_word_ctl 
/sys/module/speakup/parameters/silent 
/sys/module/speakup/parameters/spell_delay 
/sys/module/speakup/parameters/synth 
/sys/module/speakup/parameters/synth_direct 
/sys/module/speakup/parameters/tone 
/sys/module/speakup/parameters/trigger_time 
/sys/module/speakup/parameters/version 
/sys/module/speakup/parameters/voice 
/sys/module/speakup/parameters/vol ']'
/usr/local/bin/speakupconf: line 43: [: too many arguments

Case 3:  newline between asterisk and "do"

#!/bin/sh
set -x
# script to load/save all the vars in speakup
# speakupconf save or speakupconf load
# if root saves in /etc/speakup/<synth> else in $HOME/.speakup/<synth>
if [ $UID -eq "0" ]; then
  SAVEDIR="/etc/speakup"
else
  SAVEDIR="$HOME/.speakup"
fi
if [ ! -d /sys/module/speakup/parameters ]; then
  echo "no directory /sys/module/speakup/parameters"
  exit 0
fi
SYNTH=`cat /sys/module/speakup/parameters/synth`
case "$1" in
*save)
  if [ ! -d $SAVEDIR ] ; then
    echo creating $SAVEDIR
    mkdir $SAVEDIR
  fi
  if [ ! -d $SAVEDIR/$SYNTH ] ; then
    echo creating $SAVEDIR/$SYNTH
    mkdir $SAVEDIR/$SYNTH
  fi
  cd /sys/module/speakup/parameters
  SAVELIST=`    find . -perm -6 |sed 's/..//' |fgrep -v synth`
  for f in $SAVELIST; do
    cp $f $SAVEDIR/$SYNTH/$f
  done
;;
*load)
  if [ ! -d $SAVEDIR ] ; then
    echo no directory $SAVEDIR
    exit 1
  fi
  if [ ! -d $SAVEDIR/$SYNTH ] ; then
    echo no directory $SAVEDIR/$SYNTH
    exit 1
  fi
  cd $SAVEDIR/$SYNTH
  for f in *
  do
    if [ -w /sys/module/speakup/parameters/$f ]; then
      cat $f >/sys/module/speakup/parameters/$f
    fi
  done
;;
*)
  echo "usage: speakupconf load/save"
  exit 1
;;
esac

Results 3:

+ '[' 0 -eq 0 ']'
+ SAVEDIR=/etc/speakup
+ '[' '!' -d /sys/module/speakup/parameters ']'
++ cat /sys/module/speakup/parameters/synth
+ SYNTH=ltlk
+ case "$1" in
+ '[' '!' -d /etc/speakup ']'
+ '[' '!' -d /etc/speakup/ltlk ']'
+ cd /etc/speakup/ltlk
+ for f in '*'
+ '[' -w /sys/module/speakup/parameters/attrib_bleep 
/sys/module/speakup/parameters/bell_pos 
/sys/module/speakup/parameters/bleeps 
/sys/module/speakup/parameters/bleep_time 
/sys/module/speakup/parameters/caps_start 
/sys/module/speakup/parameters/caps_stop 
/sys/module/speakup/parameters/characters 
/sys/module/speakup/parameters/chartab 
/sys/module/speakup/parameters/cursor_time 
/sys/module/speakup/parameters/delay_time 
/sys/module/speakup/parameters/delimiters 
/sys/module/speakup/parameters/ex_num 
/sys/module/speakup/parameters/freq 
/sys/module/speakup/parameters/full_time 
/sys/module/speakup/parameters/jiffy_delta 
/sys/module/speakup/parameters/key_echo 
/sys/module/speakup/parameters/keymap 
/sys/module/speakup/parameters/lang 
/sys/module/speakup/parameters/no_interrupt 
/sys/module/speakup/parameters/pitch 
/sys/module/speakup/parameters/punc_all 
/sys/module/speakup/parameters/punc_level 
/sys/module/speakup/parameters/punc_most 
/sys/module/speakup/parameters/punc_some 
/sys/module/speakup/parameters/punct 
/sys/module/speakup/parameters/quiet 
/sys/module/speakup/parameters/rate 
/sys/module/speakup/parameters/reading_punc 
/sys/module/speakup/parameters/repeats 
/sys/module/speakup/parameters/say_control 
/sys/module/speakup/parameters/say_word_ctl 
/sys/module/speakup/parameters/silent 
/sys/module/speakup/parameters/spell_delay 
/sys/module/speakup/parameters/synth 
/sys/module/speakup/parameters/synth_direct 
/sys/module/speakup/parameters/tone 
/sys/module/speakup/parameters/trigger_time 
/sys/module/speakup/parameters/version 
/sys/module/speakup/parameters/voice 
/sys/module/speakup/parameters/vol ']'
/usr/local/bin/speakupconf: line 44: [: too many arguments

Case 4:  work around using ls

#!/bin/sh
set -x
# script to load/save all the vars in speakup
# speakupconf save or speakupconf load
# if root saves in /etc/speakup/<synth> else in $HOME/.speakup/<synth>
if [ $UID -eq "0" ]; then
  SAVEDIR="/etc/speakup"
else
  SAVEDIR="$HOME/.speakup"
fi
if [ ! -d /sys/module/speakup/parameters ]; then
  echo "no directory /sys/module/speakup/parameters"
  exit 0
fi
SYNTH=`cat /sys/module/speakup/parameters/synth`
case "$1" in
*save)
  if [ ! -d $SAVEDIR ] ; then
    echo creating $SAVEDIR
    mkdir $SAVEDIR
  fi
  if [ ! -d $SAVEDIR/$SYNTH ] ; then
    echo creating $SAVEDIR/$SYNTH
    mkdir $SAVEDIR/$SYNTH
  fi
  cd /sys/module/speakup/parameters
  SAVELIST=`    find . -perm -6 |sed 's/..//' |fgrep -v synth`
  for f in $SAVELIST; do
    cp $f $SAVEDIR/$SYNTH/$f
  done
;;
*load)
  if [ ! -d $SAVEDIR ] ; then
    echo no directory $SAVEDIR
    exit 1
  fi
  if [ ! -d $SAVEDIR/$SYNTH ] ; then
    echo no directory $SAVEDIR/$SYNTH
    exit 1
  fi
  cd $SAVEDIR/$SYNTH
  for f in `ls -1 2>/dev/null`; do
    if [ -w /sys/module/speakup/parameters/$f ]; then
      cat $f >/sys/module/speakup/parameters/$f
    fi
  done
;;
*)
  echo "usage: speakupconf load/save"
  exit 1
;;
esac

Results 4:

+ '[' 0 -eq 0 ']'
+ SAVEDIR=/etc/speakup
+ '[' '!' -d /sys/module/speakup/parameters ']'
++ cat /sys/module/speakup/parameters/synth
+ SYNTH=ltlk
+ case "$1" in
+ '[' '!' -d /etc/speakup ']'
+ '[' '!' -d /etc/speakup/ltlk ']'
+ cd /etc/speakup/ltlk
++ ls -1

Note: Now the script works!

-- System Information:
Debian Release: 5.0
  APT prefers testing
  APT policy: (500, 'testing')
Architecture: i386 (i686)

Kernel: Linux 2.6.26-1-686 (SMP w/1 CPU core)
Locale: LANG=en_US.UTF-8, LC_CTYPE=en_US.UTF-8 (charmap=UTF-8)
Shell: /bin/sh linked to /bin/bash

Versions of packages bash depends on:
ii  base-files                5              Debian base system miscellaneous f
ii  debianutils               2.30           Miscellaneous utilities specific t
ii  libc6                     2.7-18         GNU C Library: Shared libraries
ii  libncurses5               5.7+20081213-1 shared libraries for terminal hand

Versions of packages bash recommends:
pn  bash-completion               <none>     (no description available)

Versions of packages bash suggests:
pn  bash-doc                      <none>     (no description available)

-- no debconf information



-- 
To UNSUBSCRIBE, email to debian-bugs-dist-requ...@lists.debian.org
with a subject of "unsubscribe". Trouble? Contact listmas...@lists.debian.org

Reply via email to