ubuntu 10.06 shell 对++运算错误的问题

sh/bash/dash/ksh/zsh等Shell脚本
lsq0252
帖子: 14
注册时间: 2011-11-03 17:43

ubuntu 10.06 shell 对++运算错误的问题

#1

帖子 lsq0252 » 2011-11-03 17:47

ubuntu 10.06 shell 不支持++运算吗?为什么我的脚本写的++运算都无法正确执行,改成+1 就 ok了?
难道shell有bug还是我ubuntu哪儿设置不对?
有人知道吗?
头像
lilydjwg
论坛版主
帖子: 4258
注册时间: 2009-04-11 23:46
系统: Arch Linux
联系:

Re: ubuntu 10.06 shell 对++运算错误的问题

#2

帖子 lilydjwg » 2011-11-03 18:03

ubuntu 10.06 是什么东东?
什么 shell?
你的代码是怎样的?

请先阅读我签名中的链接再来提问。
lsq0252
帖子: 14
注册时间: 2011-11-03 17:43

Re: ubuntu 10.06 shell 对++运算错误的问题

#3

帖子 lsq0252 » 2011-11-04 16:02

写错了,是10.04。
一个.sh的脚本文件,里面有执行++运算的地方都无法正确执行,改成+1 就 ok了
fnan
帖子: 919
注册时间: 2009-07-01 22:04

Re: ubuntu 10.06 shell 对++运算错误的问题

#4

帖子 fnan » 2011-11-04 21:17

#无图无真相:
kose3@kose3-laptop:~$ cat /etc/issue
Ubuntu 10.04.3 LTS \n \l
kose3@kose3-laptop:~$ a=1;let a++;echo $a
2
kose3@kose3-laptop:~$
#有些操作会有命令行可以脚本中不可以现象。
bash不如perl精妙,学不到lisp的皮毛,远不够c++强悍,不过可以用。
lsq0252
帖子: 14
注册时间: 2011-11-03 17:43

Re: ubuntu 10.06 shell 对++运算错误的问题

#5

帖子 lsq0252 » 2011-11-07 9:16

按照你的方式我做了测试,确实命令行下可以,为什么脚本中不行,有办法解决吗?
这个脚本我在redhat下测试是没有问题的,为什么ubuntu不可以?
请指点
头像
lilydjwg
论坛版主
帖子: 4258
注册时间: 2009-04-11 23:46
系统: Arch Linux
联系:

Re: ubuntu 10.06 shell 对++运算错误的问题

#6

帖子 lilydjwg » 2011-11-07 12:54

lsq0252 写了:按照你的方式我做了测试,确实命令行下可以,为什么脚本中不行,有办法解决吗?
这个脚本我在redhat下测试是没有问题的,为什么ubuntu不可以?
请指点
你确定你的命令行和脚本使用的是相同的 shell?你脚本怎么执行的?第一行怎么写的?连我的第二个问题都还没回答就在这里自言自语问题能解决才奇怪了呢。
fnan
帖子: 919
注册时间: 2009-07-01 22:04

Re: ubuntu 10.06 shell 对++运算错误的问题

#7

帖子 fnan » 2011-11-07 18:23

lsq0252 写了:按照你的方式我做了测试,确实命令行下可以,为什么脚本中不行,有办法解决吗?
这个脚本我在redhat下测试是没有问题的,为什么ubuntu不可以?
请指点
#脚本中用了 #!/bin/bash 的shebang一样有此现象,这是shell的责任,不是用户的,折腾有个限度。
bash不如perl精妙,学不到lisp的皮毛,远不够c++强悍,不过可以用。
lsq0252
帖子: 14
注册时间: 2011-11-03 17:43

Re: ubuntu 10.06 shell 对++运算错误的问题

#8

帖子 lsq0252 » 2011-11-08 14:20

# ls /bin/sh -lt
lrwxrwxrwx 1 root root 4 2011-03-21 15:17 /bin/sh -> bash
可以看出 sh 是连接到bash上的

fnan的意思是这是shell的问题,我在使用时只能避免使用++,没有其他办法解决,是吗?

另外我无法上传附件,在下面附上代码。代码分两个文件(在下面分别列出),
我执行unpack.sh,提示如下信息:
# ./sdk.unpack
Unpacking SDK

WARN: ALL THE SOUCE FILES WILL BE OVERWRITED, FILES YOU MOTIFIED WILL BE LOST !!!
警告:所有源代码将被覆盖,所有你修改过的文件将会丢失 !!!

To continue, type 'Yes' and then press ENTER ...
请输入'Yes'并回车以继续...
Yes
install cross toolchain
CROSS_COMPILER_PATH=/opt/hisi-linux/x86-arm/gcc-3.4.3-uClibc-0.9.28/usr/bin
Cross Tools has been installed yet!
unpacking source/lib/ncurses-5.5
run_command_progress_float: 'tar -xvzf pub/tarball/ncurses-5.5.tgz -C source/lib/'
[100%]##################################################|
unpacking source/lib/expat-1.95.8
run_command_progress_float: 'tar -xvzf pub/tarball/expat-1.95.8.tgz -C source/lib/'
Initializing progress bar ...
执行到这里就停了,
但是把comman.sh里的 ++ 改为 += 1,后,就可以继续运行下去


/*********unpack.sh 代码*************/

#!/bin/sh
source common.sh

ECHO "Unpacking SDK" COLOR_YELLOW

ECHO ""
WARN "ALL THE SOUCE FILES WILL BE OVERWRITED, FILES YOU MOTIFIED WILL BE LOST !!!"
ECHO "警告:所有源代码将被覆盖,所有你修改过的文件将会丢失 !!!" COLOR_YELLOW
ECHO ""

ECHO "To continue, type 'Yes' and then press ENTER ..."
ECHO "请输入'Yes'并回车以继续..."

read choice
[ x$choice != xYes ] && exit 1

set +e

ECHO "install cross toolchain"
./tools/toolchains/cross.install

ECHO "unpacking source/lib/ncurses-5.5"
mkdir -pv source/lib
run_command_progress_float "tar -xvzf pub/tarball/ncurses-5.5.tgz -C source/lib/" 0 "tar -tzf pub/tarball/ncurses-5.5.tgz | wc -l"

ECHO "unpacking source/lib/expat-1.95.8"
mkdir -pv source/lib
run_command_progress_float "tar -xvzf pub/tarball/expat-1.95.8.tgz -C source/lib/" 0 "tar -tzf pub/tarball/expat-1.95.8.tgz | wc -l"

ECHO "unpacking source/lib/pcre-7.2"
mkdir -pv source/lib
run_command_progress_float "tar -xvzf pub/tarball/pcre-7.2.tgz -C source/lib/" 0 "tar -tzf pub/tarball/pcre-7.2.tgz | wc -l"

ECHO "unpacking source/lib/zlib-1.2.3"
mkdir -pv source/lib
run_command_progress_float "tar -xvzf pub/tarball/zlib-1.2.3.tgz -C source/lib/" 0 "tar -tzf pub/tarball/zlib-1.2.3.tgz | wc -l"


/***********************以下是comman.sh代码*****************************************/
#!/bin/sh

#set -e

# for debug
DEBUG_LOG_FILE='&2'
DEBUG_LOG_LEVEL=0

# ANSI COLORS
COLOR_CRE="[K"
COLOR_NORMAL="[0;39m"
COLOR_RED="[1;31m"
COLOR_GREEN="[1;32m"
COLOR_YELLOW="[1;33m"
COLOR_BLUE="[1;34m"
COLOR_MAGENTA="[1;35m"
COLOR_CYAN="[1;36m"
COLOR_WHITE="[1;37m"

# Shell command
TAR=tar
CP=/bin/cp
RM=/bin/rm
GREP=grep
SED=sed
MKDIR=mkdir
CHMOD=chmod
MV=mv
CD=cd
LN=ln
MAKE=make
MKNOD=mknod
PUSHD=pushd
POPD=popd
RMDIR=rmdir
DEPMOD=/sbin/depmod
RMDIR=rmdir
MKIMG=mkimage
PATCH=patch
DIFF=diff
TOUCH=touch
CAT=cat

e_blank='[ ][ ]*'
e_year='20[0-9][0-9]'
e_month='([1-9]|0[1-9]|1[0-2])'
e_day='([1-9]|0[1-9]|[12][0-9]|3[0-1])'
e_time='([01][0-9]|2[0-3]):[0-5][0-9]'
e_employid='[a-zA-Z][a-zA-Z]*[0-9]{4,}'

#$1: string
#$2: color
ECHO()
{
[ -n "$2" ] && eval echo -n \"\${${2}}\";
echo "${1}${COLOR_NORMAL}"
}

ERR()
{
echo "${COLOR_RED} ERR: ${1}${COLOR_NORMAL}" >&2
}

WARN()
{
echo "${COLOR_YELLOW}WARN: ${1}${COLOR_NORMAL}" >&2
}

# $1:
LOG()
{
echo "$1"
}


#$1: string
#$2: level
DEBUG()
{
local level=$2
[ -z "$level" ] && { level=0; }
[ $level -lt $DEBUG_LOG_LEVEL ] && return 0;

echo "$COLOR_WHITE$1$COLOR_NORMAL" > $DEBUG_LOG_FILE
}

# $1: command
# $2: LR/CR steps
run_command_progress()
{
local n=0
local steps=$2
local progress_bar=""
local counter=0
local files=0

ECHO "run_command_progress: '$1'"
[ -z "$steps" ] && { steps=1; }

[ -n "$3" ] && [ -d "$3" ] && { steps=`find $3 | wc -l`; steps=`expr $steps / 50`; }

eval $1 | while read line
do
((n++))
((files++))

if [ $n -ge $steps ] ;
then
((counter++))
if [ $counter -le 50 ] ;
then
progress_bar="$progress_bar#";
printf " --------------------------------------------------|\r[%03d]$progress_bar\r" $steps
else
printf "[%03d#$progress_bar|\r" `expr $files / 50`
fi

n=0
fi
done

echo ""
}

# $1: command
# $2: total
# $3: command to calc totals
run_command_progress_float()
{
local readonly RCP_RANGE=50
local rcp_lines=0
local rcp_nextpos=1
local rcp_total=0
local progress_bar=
local rcp_prog=0
local rcp_tmp=0
local prog_bar_base=
local rcp_percent=0

ECHO "run_command_progress_float: '$1'"

if [ -n "$3" ] ;
then
echo -n "Initializing progress bar ..."
rcp_total=`eval $3`;
echo -n "\r"
[ -z "$rcp_total" ] && rcp_total=1
else
[ -n "$2" ] && rcp_total=$2
fi

[ -z "$rcp_total" ] && rcp_total=1
[ $rcp_total -le 0 ] && rcp_total=1

prog_bar_base="[ ]"
while [ $rcp_tmp -lt $RCP_RANGE ]
do
prog_bar_base="$prog_bar_base-"
((rcp_tmp++))
done
prog_bar_base="${prog_bar_base}|"
printf "\r$prog_bar_base\r"

set +e
eval $1 | while read line
do
((rcp_lines++))

if [ $rcp_lines -ge $rcp_nextpos ]
then
rcp_percent=`expr \( $rcp_lines \* 101 - 1 \) / $rcp_total `
rcp_prog=`expr \( $rcp_lines \* \( $RCP_RANGE + 1 \) - 1 \) / $rcp_total `
[ $rcp_prog -gt $RCP_RANGE ] && rcp_prog=$RCP_RANGE
rcp_nextpos=`expr \( \( $rcp_percent + 1 \) \* $rcp_total \) / 100`
[ $rcp_nextpos -gt $rcp_total ] && rcp_nextpos=$rcp_total

rcp_tmp=0
progress_bar=""
while [ $rcp_tmp -lt $rcp_prog ]
do
progress_bar="$progress_bar#"
((rcp_tmp++))
done
printf "\r$prog_bar_base\r[%3d%%]$progress_bar\r" $rcp_percent
fi
done
set -e

echo ""
}

#$1: path
abs_path()
{
pushd "$1" >/dev/null
[ $? -ne 0 ] && return 1;
pwd
popd >/dev/null
}

#$1: $cfg_moddir is multi
prepare_unpacking_cleanup()
{
$CAT >> $HCM_SH_SDKINSTALL << EOF

ECHO "unpacking $cfg_moddir"
mkdir -pv $module_basedir
run_command_progress_float "tar -xvzf `sub_dir $dir_postbuild_srctarball $HCM_DESTDIR`/$module_dirname.tgz -C $module_basedir/" 0 \
"tar -tzf `sub_dir $dir_postbuild_srctarball $HCM_DESTDIR`/$module_dirname.tgz | wc -l"
EOF

if [ -z "$1" ] ;
then
$CAT >> $HCM_SH_SDKCLEANUP << EOF

ECHO "cleanup $cfg_moddir"
run_command_progress_float "rm $cfg_moddir -frv" 0 "find $cfg_moddir | wc -l"
EOF
else
$CAT >> $HCM_SH_SDKCLEANUP << EOF

ECHO "cleanup $cfg_moddir"
pushd $module_basedir
run_command_progress_float "rm $cfg_moddir -frv" 0 "find $cfg_moddir | wc -l"
popd
EOF
fi

}

# $1: prefix
# $2..$n: dirs list
make_dirs()
{
local make_dirs_count=2
local make_dirs_dir=

[ -z "$1" ] && { ERR "make_dirs mast have a prefix dir!"; return 1; }
$MKDIR $1 -p

while true
do
eval make_dirs_dir=\${$make_dirs_count}
[ -z "$make_dirs_dir" ] && break;
$MKDIR $1/$make_dirs_dir -p
((make_dirs_count++))
done
}

check_dir_empty()
{
[ -z "$1" ] && return 0;
! [ -d $1 ] && return 0;
[ -z "`find $1/ -maxdepth 1 -mindepth 1`" ] && return 0;

return 1
}

# $1 - $2
# $3: frefix for '/', like "\\\\/"
sub_dir()
{
local subdir=
local dirA=`dirname $1/stub`
local dirB=`dirname $2/stub`

while [ "$dirA" != "$dirB" ] && [ "$dirA" != "." ] && [ "$dirA" != "/" ]
do
if [ -z "$subdir" ] ; then
subdir=`basename $dirA`
else
subdir=`basename $dirA`$3/$subdir
fi
dirA=`dirname $dirA`
done

[ -z "$subdir" ] && subdir=.

dirname $subdir/stub
}

# $1: base dir
# $2: dest dir
# $3: frefix for '/', like "\\\\/"
base_offset_dir()
{
local ofstdir=`sub_dir $2 $1`
local bodofst=

while [ "$ofstdir" != "." ] && [ "$ofstdir" != "/" ]
do
if [ -z "$bodofst" ] ; then
bodofst=..
else
bodofst=..$3/$bodofst
fi
ofstdir=`dirname $ofstdir`
done

dirname $bodofst/stub
}

#$1: dir
set_drv_kbuild()
{
local cc_file=Makefile
local mbdir=

for mbdir in $1 $1/*
do
if [ -f $mbdir/$cc_file ] ;
then
local kbuild_dir_adj="`base_offset_dir $HCM_DESTDIR $mbdir "\\\\"`\\/`echo "$HCM_SDKDIR_KBUILD" | \
sed -n "s/\//\\\\\\\\\//gp"`"

$SED -i "s/^KERNEL_MAKE[ \t]*:=.*/KERNEL_MAKE := -C $kbuild_dir_adj/" $mbdir/$cc_file
fi
done
}

#$1: name
#$2: level
write_rootfs_level()
{
local rlevel_config=$HCM_DESTDIR/$HCM_SDKDIR_RESOURCE/rlevel.config
$TOUCH $rlevel_config
[ -n "`grep "^\[[0-9A-Za-z][0-9A-Za-z\-]*\] $1$" < $rlevel_config`" ] && { \
WARN "$rlevel_config already have item '$1'"
return 0;
}
echo "[$2] $1" >> $rlevel_config
}

#$1:
remove_all_cvsdir()
{
! [ -d "$1" ] && { WARN "'$1' not found when remove 'CVS' directories."; return ; }

ECHO "Remove: 'CVS' directories in $1"
find $1 -type d -name "CVS" | xargs rm -fr
}

#$1: strip command
#$2: file list
strip_elf()
{
for file in $2
do
[ -z "`file $file | grep "ELF .* executable, .*, not stripped"`" ] && continue

ECHO "$1 $file"
$1 $file
done
}

#$1: strip command
#$2: file list
strip_lib()
{
for file in $2
do
[ -z "`file $file | grep "ELF .* shared object, .*, not stripped"`" ] && continue

ECHO "strip not really done: $file"
done
}

# $1: rootfs base
# $2: modules list
install_extern_kmod()
{
local iek_installed_modules=
local iek_dest_module=
local iek_depend_info=
local iek_install_base=

pushd $1 >/dev/null
iek_install_base=$PWD
popd >/dev/null

for iek_extmod in `find $2`
do
iek_dest_module=/$HCM_INROOTFS_EXTKMOD/`basename $iek_extmod`

[ -f $HCM_DESTDIR/$HCM_KERNEL_INSTALL_RESOURCE/$iek_dest_module ] && \
{ WARN "Extern module $iek_extmod conflict: $iek_dest_module"; sleep 1; }

iek_installed_modules="$iek_installed_modules $iek_dest_module"
$CP -uf $iek_extmod $HCM_DESTDIR/$HCM_KERNEL_INSTALL_RESOURCE/$iek_dest_module
done

pushd $HCM_DESTDIR/$HCM_KERNEL_INSTALL_RESOURCE >/dev/null

ECHO "Generating modules dependency ..."
$DEPMOD -ae -b ./ -r -F $HCM_DESTDIR/$HCM_SDKDIR_KBUILD/System.map $HCM_KERNEL_RELEASE

for iek_extmod in $iek_installed_modules
do
iek_depend_info=`grep "^$iek_extmod:" < $HCM_DESTDIR/$HCM_KERNEL_INSTALL_RESOURCE/$HCM_INROOTFS_DEPKMOD/modules.dep | sed "s/\://"`
for iek_extmod in $iek_depend_info
do
$CP -uf --parents .$iek_extmod $iek_install_base/
[ x$cfg_install_strip == xyes ] && $HCM_CROSS_COMPILE-strip $iek_install_base$ikm_kmod -g -S -d

done
done

popd >/dev/null
}

# $1: dest rootfs based
# $2: module list
install_kernel_module()
{
local ikm_kmod_resdir=$HCM_DESTDIR/$HCM_KERNEL_INSTALL_RESOURCE
local ikm_install_basedir=
local ikm_kmod=

pushd $1 >/dev/null
ikm_install_basedir=$PWD
popd >/dev/null

pushd $ikm_kmod_resdir >/dev/null
$DEPMOD -ae -b ./ -r -F $HCM_DESTDIR/$HCM_SDKDIR_KBUILD/System.map $HCM_KERNEL_RELEASE

while read ikm_kmod
do
ikm_depend_info=`grep "^$ikm_kmod:" < $HCM_DESTDIR/$HCM_KERNEL_INSTALL_RESOURCE/$HCM_INROOTFS_DEPKMOD/modules.dep | sed "s/\://"`
for ikm_kmod in $ikm_depend_info
do
$CP -uf --parents .$ikm_kmod $ikm_install_basedir
[ x$cfg_install_strip == xyes ] && $HCM_CROSS_COMPILE-strip $ikm_install_basedir$ikm_kmod -g -S -d
done
done << EOF
`pushd $HCM_INROOTFS_KERNMOD >/dev/null; \
eval find "$2" -type f -printf \"/$HCM_INROOTFS_KERNMOD/%p\\\n\"; \
popd >/dev/null`
EOF

popd >/dev/null
}

string_to_varname()
{
echo "$1" | sed 's/[^a-zA-Z0-9_]/_/g'
}

patchset_get_param()
{
echo "$1" | cut -d')' -f1 | sed 's/[\(\|]/ /g'
}

patchset_get_name()
{
echo "$file" | cut -d')' -f2
}
头像
lilydjwg
论坛版主
帖子: 4258
注册时间: 2009-04-11 23:46
系统: Arch Linux
联系:

Re: ubuntu 10.06 shell 对++运算错误的问题

#9

帖子 lilydjwg » 2011-11-08 14:44

你确定你的 /bin/sh 是 bash? dash / ash 都是不支持 ((a++)) 这种语法的。
fnan
帖子: 919
注册时间: 2009-07-01 22:04

Re: ubuntu 10.06 shell 对++运算错误的问题

#10

帖子 fnan » 2011-11-08 21:15

# ls /bin/sh -lt
lrwxrwxrwx 1 root root 4 2011-03-21 15:17 /bin/sh -> bash
可以看出 sh 是连接到bash上的

fnan的意思是这是shell的问题,我在使用时只能避免使用++,没有其他办法解决,是吗?
# 很明显用的是bash,编程有个原则是尽量高效编程,意思不是使用完美的最简语法和算法,而是使用自己所知能稳定运行的语法和算法快速完成程序,如果目的不是编程而是研究那是另一回事,建议只用shell的比较基本的语法或者用别的脚本语言,当然只是个建议。
bash不如perl精妙,学不到lisp的皮毛,远不够c++强悍,不过可以用。
fnan
帖子: 919
注册时间: 2009-07-01 22:04

Re: ubuntu 10.06 shell 对++运算错误的问题

#11

帖子 fnan » 2011-11-08 23:21

#附个现象例子:
kose3@kose3-laptop:~$ echo "shell=$SHELL"
shell=/bin/bash
kose3@kose3-laptop:~$ a='a123b';echo "a=$a";echo '${a//+([0-9])/}='${a//+([0-9])/}
a=a123b
${a//+([0-9])/}=ab
kose3@kose3-laptop:~$ cat tmp1.sh
#!/bin/bash

echo "shell=$SHELL"
a='a123b'
echo "a=$a"
echo '${a//+([0-9])/}='${a//+([0-9])/}

kose3@kose3-laptop:~$ ./tmp1.sh
shell=/bin/bash
a=a123b
${a//+([0-9])/}=a123b
bash不如perl精妙,学不到lisp的皮毛,远不够c++强悍,不过可以用。
lsq0252
帖子: 14
注册时间: 2011-11-03 17:43

Re: ubuntu 10.06 shell 对++运算错误的问题

#12

帖子 lsq0252 » 2011-11-09 9:17

可是为什么redhat下这个脚本没有问题呢?ubuntu的shell难道不能升级解决这个问题?
头像
ljj_jjl2008
论坛版主
帖子: 14256
注册时间: 2007-09-16 8:29

Re: ubuntu 10.06 shell 对++运算错误的问题

#13

帖子 ljj_jjl2008 » 2011-11-09 9:27

楼上的人回答问题时都说了:
第一句要写成:#!/bin/bash
不同版本linux情况不同,有的linux里面sh和bash其实是指向同一个程序。
lsq0252
帖子: 14
注册时间: 2011-11-03 17:43

Re: ubuntu 10.06 shell 对++运算错误的问题

#14

帖子 lsq0252 » 2011-11-09 17:29

第一句写成#!/bin/bash我已经试过了,不行。
况且这一句话都被注释掉了,有什么意义吗?
就算是有意义,我已经说过,在我的系统下面执行:
# ls /bin/sh -lt
lrwxrwxrwx 1 root root 4 2011-03-21 15:17 /bin/sh -> bash
可以看出 sh 是连接到bash上的

所以我写成#!/bin/sh也应该没有问题的。
fnan
帖子: 919
注册时间: 2009-07-01 22:04

Re: ubuntu 10.06 shell 对++运算错误的问题

#15

帖子 fnan » 2011-11-10 3:07

lsq0252 写了:第一句写成#!/bin/bash我已经试过了,不行。
况且这一句话都被注释掉了,有什么意义吗?
就算是有意义,我已经说过,在我的系统下面执行:
# ls /bin/sh -lt
lrwxrwxrwx 1 root root 4 2011-03-21 15:17 /bin/sh -> bash
可以看出 sh 是连接到bash上的

所以我写成#!/bin/sh也应该没有问题的。
#问题与用户无关,那些童鞋再护短也于事无补,其实我也喜欢ubuntu,但踩到狗屎不打算用香水掩饰。
bash不如perl精妙,学不到lisp的皮毛,远不够c++强悍,不过可以用。
回复