Newsgroups: comp.unix.shell
> I want to pass a swich taken from command line into subroutines. > E.g, for the following code, I want to pass the command line swich > -t and its parameter into sub2: [snip] > You can see, the first time it works fine, but the second time it is > not. and the output of the echo (with "!!" as comment) is wrong too. > > The reson I can't pass directy is that I also want to do some > processing along the passing. This is a general question about how > to pass swithes along to subroutines with proper quoting and in > proper way.
>sub1(){
>
> [ "x$1" = "x-t" ] && {
> file_title_s="-t '$2'"
> shift 2
> }
> sub2 $file_title_s "$@" more from sub1
>}Is there a reason that you are restricted to one variable? It's simpler if you use two:
sub1(){
case $1 in
-t) file_title_s=-t
file_title_o=$2
shift 2 ;;
esac
sub2 "$file_title_s" "$file_title_o" "$@" more from sub1
}Ken Pizzini
this one works fine.
$ cat /tmp/test
sub1(){
echo sub1:$#
[ "x$1" = "x-t" ] && {
file_title_s="-t \"$2\""
shift 2
}
args=
for arg in "$@"; do args="$args \"$arg\""; done
eval set -- $file_title_s $args
sub2 "$@" "5 6"
}
sub2(){
echo sub2:$#
[ "x$1" = "x-t" ] && {
file_title="$2"
shift 2
}
echo "$1 should be: 2nd"
echo $file_title
echo "$@"
}
[ "x$1" = "x-t" ] && {
file_title_s="-t \"$2\""
shift 2
}
echo sub0:$#
args=
for arg in "$@"; do args="$args \"$arg\""; done
eval set -- $file_title_s $args
sub1 "$@" "3 4"
$ ast-ksh -x /tmp/test -t '1 2' 2nd 3rd
+ [ x-t = x-t ]
+ file_title_s='-t "1 2"'
+ shift 2
+ echo sub0:2
sub0:2
+ args=''
+ args=' "2nd"'
+ args=' "2nd" "3rd"'
+ eval set -- -t '"1' '2"' '"2nd"' '"3rd"'
+ set -- -t '1 2' 2nd 3rd
+ sub1 -t '1 2' 2nd 3rd '3 4'
+ echo sub1:5
sub1:5
+ [ x-t = x-t ]
+ file_title_s='-t "1 2"'
+ shift 2
+ args=''
+ args=' "2nd"'
+ args=' "2nd" "3rd"'
+ args=' "2nd" "3rd" "3 4"'
+ eval set -- -t '"1' '2"' '"2nd"' '"3rd"' '"3' '4"'
+ set -- -t '1 2' 2nd 3rd '3 4'
+ sub2 -t '1 2' 2nd 3rd '3 4' '5 6'
+ echo sub2:6
sub2:6
+ [ x-t = x-t ]
+ file_title='1 2'
+ shift 2
+ echo '2nd should be: 2nd'
2nd should be: 2nd
+ echo 1 2
1 2
+ echo 2nd 3rd '3 4' '5 6'
2nd 3rd 3 4 5 6Cyrille.
Though seem complicated, the above is really the minimum steps. Here is a trying-to-be-simple one and its failure record:
copied exactly from above |
sub1(){
echo sub1:$#
[ "x$1" = "x-t" ] && {
file_title_s="-t \"$2\""
shift 2
}
args=
for arg in "$@"; do args="$args \"$arg\""; done
eval set -- $file_title_s $args
sub2 "$@" "5 6"
}
[ "x$1" = "x-t" ] && {
file_title_s="-t \"$2\""
shift 2
}neglect the for loop |
eval set -- $file_title_s "$@" sub1 $file_title_s more parameters
!! |
$ sh -x test_script0 -t "This is a test" 2nd 3rd + [ x-t = x-t ] file_title_s=-t 'This is a test' + shift 2 + sub1 -t 'This is a test' more parameters + echo sub1:7 sub1:7 + [ x-t = x-t ] file_title_s=-t "'This" + shift 2 args= args= "is" args= "is" "a" args= "is" "a" "test'" args= "is" "a" "test'" "more" args= "is" "a" "test'" "more" "parameters" + eval set -- -t "'This" "is" "a" "test'" "more" "parameters" + set -- -t 'This is a test' more parameters + sub2 -t 'This is a test' more parameters 5 6 + [ x-t = x-t ] file_title='This + shift 2