shell扮演者操作系统内核和用户的中间人的角色,

下载点

bashdb-4.4-0.94.tar.bz2.7z

DIE() {

echo "done"

从/etc/profile.d 目录的配置文件中收载 shell 的设置.

<6>. 脚本调节和测验 

前言

上周在学习linux脚本编制程序,调节和测量试验时,用echo 或bash -x
反省语法用bash -n x.sh

在函数中,要用echo重临出参字符串,假若再用echo打字与印刷调节和测量试验信息,将逻辑搞乱了。
当即就在想,linux工具这么庞大,既然有gdb, 这就有脚本的调节和测验器才对啊.

前天在看书时,见到了bashdb那个工具。
在debian下试过了,好使。
纵然尚未gdb -tui 那么好使,也快心满志了。

bashdb中也会有众多调剂命令,步向bashdb后,用help命令能够见到命令列表。
对此脚本的初级调节和测验,理解多少个指令就够用。

1 echo/printf

../gdb-6.8/configure --target=arm-linux --enable-shared --prefix=/usr/src/arm/gdb/build-gdb --without-x --disable-gdbtk --disable-tui --without-included-regex --without-included-gettext
make

通配符

<1>. 什么是shell 

shell扮演者操作系统内核和客户的中级人的剧中人物,客商通过键入shell command,然后shell通过解析顾客输入,然后将要求转载给操作系统的水源实行拍卖。

  1. 一个系统能够存在多个shell,能够由此cat /etc/shells命令查看系统中装置的shell,差异的shell大概支持的通令语法是分化等的。

  2. 可以通过echo $SHELL查看当前应用的shell 

实验

# backup /etc/apt/sources.list
cp /etc/apt/sources.list /etc/apt/sources.list.bk1
# add one row on the file(/etc/apt/sources.list)'s end for install bashdb
vi /etc/apt/sources.list
deb http://ftp.de.debian.org/debian wheezy main
wq
# update install source
aptitude update
# install bashdb
aptitude install bashdb
# bash doc
# http://www.gnu.org/software/bash/manual/bashref.html
# debug linux sh
# cd the .sh file dir, debug x.sh by bashdb
bashdb $(pwd)/main.sh
# bashdb's buildin command list
bashdb<0> help
Available commands:
  action     condition  edit     frame    load     run     source  unalias  
  alias      continue   enable   handle   next     search  step    undisplay
  backtrace  debug      eval     help     print    set     step-   untrace  
  break      delete     examine  history  pwd      shell   step+   up       
  clear      disable    export   info     quit     show    tbreak  watch    
  commands   display    file     kill     return   signal  trace   watche   
  complete   down       finish   list     reverse  skip    tty  
# list command
bashdb<1> help list
list[>] [LOC|.|-] [NUMBER] 
LOC is the starting location or dot (.) for current file and
line. Subsequent list commands continue from the last line
listed. Frame switching however resets the line to dot. LOC can be a
read-in function name or a filename and line number separated by a
colon, e.g /etc/profile:5
If NUMBER is omitted, use the LISTSIZE setting as a count. Use "set
listsize" to change this setting. If NUMBER is given and is less than
the starting line, then it is treated as a count. Otherwise it is
treated as an ending line number.
By default aliases "l>" and "list>" are set to list. In this case and
more generally when the alias ends in ">", rather than center lines
around LOC that will be used as the starting point.
Examples:
list .      # List centered around the curent frame line
list        # Same as above if the first time. Else start from where
            # we last left off.
list -      # list backwards from where we left off.
list> .     # list starting from the current frame line.
list  10 3  # list 3 lines centered around 10, lines 9-11
list> 10 3  # list lines 10-12
list  10 13 # list lines 10-13
list  10 -5 # list from lines to 5 lines before teh end of the file
list  /etc/profile:5  # List centered around line 5 of /etc/profile.
list  /etc/profile 5  # Same as above.
list usage  # list centered around function usage().
# 列出脚本源码-当前
l .
# 列出脚本源码-指定行数
l 0
# bashdb的命令和gdb兼容, 用gdb的命令就可以了
# n : 步过
# s : 步入
# 回车 : 执行上一条命令
# 打印变量
print $i_index
pr $i_index
# 指定行数下断点
break 18
# 用debian源提供的bashdb下断点有bug, continue后,断不下来
# 去官网上下载一个新的bashdb : https://sourceforge.net/projects/bashdb/files/bashdb/4.4-0.94/
tar xvf ./bashdb-4.4-0.94.tar.bz2
cd bashdb-4.4-0.94/
aptitude install autotools-dev
make clean
./configure
make
make check # 这步有2项通不过,不影响
# SKIP: test-file-with-spaces
# FAIL: test-sig
# SKIP: test-bug-loc
# FAIL: test-bug-set-e
aptitude remove bashdb
rm -rf /usr/share/bashdb/
make install
# 可以用新版bashdb重新调试脚本了
bashdb $(pwd)/main.sh
# 列出当前文件所有内容, 行数范围设置大点 从0~1000, 如果这个当前sh只有45行,就都显示全了
l 0 1000
# 对指定文件的指定行数下断点
break /home/dev/main.sh:35
# 对函数下断点
break func_show_title
# 继续 continue
c
# 断点列表
L
# 列出指定文件指定行数
l /home/dev/common/sh.prog_version:16
# 删除断点(指定断点号码, 用L命令看断点列表)
delete 1
# bashdb好像没有在调试中,设置变量值的控制语法
# 执行完一个函数或一个循环
finish
# 退出调试器
q
# 好像初步使用bashdb, 查的这些调试命令,已经够用了
# 看一本书上,人家调试就用echo 或 bash -x, 人家对脚本编程该有多熟练啊
# 如果是我,只有在没有条件的情况下才会用echo, 有利器为啥不用呢?

# redirect to file

始发编写翻译:
(1) cd obj-gdb
    ./build
(2) cd obj-gdbserver
    ./build
    那时会生成Makefile,修改Makefile如下
    LDFLAGS= -static
    然后make
(3) cd bin
    cp ../obj-gdb/gdb/gdb .
    cp ../obj-gdbserver/gdbserver .
    arm-linux-strip gdbserver
(4) 好了bin目录下便是最后编写翻译出来的gdb+gdbserver了

间非常长的动静。

<2>. 还是hello world程序 

率先应用vim编辑器(恐怕是linux下任性的文本编辑器)编写文件helloshell.sh(没有须要使用.sh后缀名):

 #!/bin/bash
echo "hello shell";

 

封存上边的文本,扩充该文件的执行权限:

 xuqiang@ubuntu:~/shell$ sudo chmod +x ./helloshell.sh

运行该shell程序:

 xuqiang@ubuntu:~/shell$ ./helloshell.sh

hello shell

经过地点的次序未有怎么实际的意义,可是经过第二个shell程序领会shell程序的执行进程。 

linux sh : bashdb的装置和始发使用,shbashdb

}

脚本obj-gdbserver/build内容如下:
#!/bin/sh

还足以用 unalias 解除小名成效。直接敲 alias 会见到眼下系统私下认可的 alias.

6.2 四个指令

shell脚本实行能够通过./shell-filename.sh的款型进行,别的的一种情势是因此bash ./shell-filename.sh的样式进行,同期在进行脚本时,能够使用-v只怕是-x参数打字与印刷程序实施音讯。

-v:私下认可打字与印刷shell读取的剧情

-x:将下令“张开” 之后打字与印刷

举例对于下面的顺序:

!/bin/sh

# for debug shell script
#
tot=`expr $1 + $2`
echo $tot

假定选取-v选项,结果如下:

 xuqiang@ubuntu:~/shell$ sh -v ./debug.sh 2 5

#!/bin/sh

#

# for debug shell script

#

tot=`expr $1 + $2`

echo $tot

7

借使是运用-x选项的话,结果:

 xuqiang@ubuntu:~/shell$ sh -x ./debug.sh 2 5

+ expr 2 + 5

+ tot=7

+ echo 7

7

[tt.sh : 10] echo $i ?

一.前言
嵌入式Linux系统中,应用开垦进度中,非常多场所下,客户供给对二个应用程序进行数十次调节和测量检验,
极其是犬牙相错的前后相继。选用GDB方法调节和测量试验,由于嵌入式系统能源有限性,平时不能一贯在目的系列上实行调护医治,
平日使用gdb+gdbserver的法子开展调解。 Gdbserver在对象连串中运作,gdb则在宿主机上运转。
对象连串必须归纳gdbserver程序,宿主机也亟须设置gdb程序。在此大家还不能够间接行使linux
发行版自带的gdb,要求交叉编写翻译gdb和gdbserver。

那边涉及的前面包车型大巴通令,并非全数的授命都足以的,日常针对文书档案操作的吩咐比较常

6.1 万能的echo

shell的脚本调节和测量检验是比价恶心的,这里独有是提供一些常规性的调试方法,最简易的正是运用echo函数打字与印刷出变量的值进而达到调整指标。

}

CC=/opt/toolchain/arm-linux/bin/arm-linux-gcc 
../gdb-6.8/gdb/gdbserver/configure --host=arm-linux --without-included-regex --without-included-gettext

# 那一个标识在 linux 中代表注释表明的意味,即 # 前面的内容 linux 忽略掉。

5.1 函数证明和概念

下边包车型地铁主次中定义函数demo,向函数传递的具有参数表示为$*,第一个参数$1,首个参数$2, 依次类推。

betway体育app 1

#!/bin/bash

function demo()
{
        echo "all function args : $*"
        echo "the first arg : $1"
        echo "the second arg : $2"
        echo "the third arg : $3"
}

# call the function

demo -f foo bar  

betway体育app 2

this is a test

echo "done"

境变量只对前段时间顾客起成效。

3.2 客户定义变量

shell中客户能够自定义变量,shell中的变量是没有数据类型的,shell将依据近来的条件活动进行转载,比方:

msg="hello world" 

下边包车型地铁话语定义变量msg,并设置起头值是为hello world。

1. 索要注意的是概念变量时,=两侧是未曾空格的 

3.2.1  顾客定义变量准绳

变量必需是以字母最初,后跟字母或然是下划线,变量的命名是大大小小写敏感的,並且能够定义一个变量的值为NULL。

xuqiang@ubuntu:~/shell$ vech=

xuqiang@ubuntu:~/shell$ echo $vec

3.2.2  shell中什么运用变量

假设想要获得shell变量中存款和储蓄的值的话,必要在变量名前净增$符号,比如:

xuqiang@ubuntu:~/shell$ vech="value"

xuqiang@ubuntu:~/shell$ echo $vech # this will print the value of vech

value

xuqiang@ubuntu:~/shell$ echo vech # this will print the string "vech"

vech

3.2.3 全局变量 vs 局地变量 

暗许在shell中编辑的变量全都以一些变量,假若再一次打开console的话,那么那些变量将全数有失,全局的变量能够写在文书~/.bashrc文件。

-x(xtrace) 选项会形成 BASH 在实践命令在此以前,先把要举行的命令打字与印刷出来。这些选项对调度一些下令错误很有帮扶。

三.gdbserver使用
(1) 指标机中
    实行命令gdbserver 10.0.12.144:1234 test
    注意test在编写翻译的时候是要加-g选项的
(2) 宿主机中
    gdb test
    再输入命令target remote 10.0.12.143:1234
    接下去就能够gdb的调治了
(3) 说明
    目标机IP:10.0.12.143
    宿主机IP: 10.0.12.144
    端口是不管三七二十一钦定的,只要互相保持一致就行了
    test程序两端也必需一律

 >, >>, 2>, 2>> 后边讲过重定向符号> 以及>> 分别代表代替和扩张的意味,然后还会有两

4.5 while

betway体育app 3

#!/bin/bash

#
# test while loop
#

n=$1
i=0
while [ $i -le 10 ]
do
        echo "$n * $i = `expr $i * $n`"
        i=`expr $i + 1`

done   

betway体育app 4

一对时候,由于传进来的参数带有点特殊字符,导致 BASH 剖判时不是服从我们预料的张开。这一年,把 -x 展开,就会在指令施行前,把扩充后的指令打字与印刷出来。比方依照前边写的函数:

二.编译gdb和gdbserver工具
下载最新版本的gdb-6.8.tar.gz,能够到ftp://ftp.gnu.org/gnu/gdb下载.
预备好温馨的做事目录,如下示
/home/user/gdb
            |--gdb-6.8
            |--obj-gdb
                    |--build
            |--obj-gdbserver
                    |--build
            |--bin
                    
脚本obj-gdb/build内容如下:
#!/bin/sh

另外利用 sh 命令去试行四个 shell 脚本的时候是足以加-x 选项来查阅那些剧本实施进度的,那样方便大家调节和测验那个本子哪个地方出了难点:

<3>. shell中的变量 

trap [-lp] [[arg] sigspec ...]

hell 简单题清楚,正是系统跟Computer硬件交互时选取的中档介质,它只是系统的贰个工具。客商直接面临的不是Computer硬件而是 shell,客户把指令告诉 shell,然后 shell 再传输给系统基本,接着内核再去调节Computer硬件去执行各样操作。Redhat/CentOS 系统暗许安装的 shell 叫做 bash,即 Bourne Again Shell,它是 sh(Bourne Shell)的拉长版本

4.2 组合决断 

逻辑运算符:

! : not

exp1 -a exp2 : a && b

exp1 -o exp2 : exp1 || exp2 

然后就可以看看如下输出:

用,比如 cat, less, head, tail, grep, cut, sort, wc, uniq, tee, tr, split, sed, awk 等等,当中 grep,sed, awk 为正则表明式务必精通的工具

4.1 条件决断

在shell中原则判定是透过test命令只怕是[ ]贯彻, 评定楷模如下:

数学生运动算: 

a -eq b :a == b
a -ne b : a != b
a -lt b : a < b
a -le b : a <= b
a -gt b : a > b
a -ge b : a >= b

string比较:
string1 = string2
string1 != string2
string1 : string1 不是NULL,只怕是未曾概念

do

当运转三个进度时,您能够使它搁浅(按Ctrl+z),然后选取 fg 命令恢复生机它,利用 bg 命令使

<5>. 函数 

    echo $i

系统暗许的 alias 指令也就那多少个而已,您也得以自定义您想要的一声令下小名。alias 语法很简

4.6 case 

betway体育app 5

#!/bin/bash

#
# script to test case statement
#
action="update"
case $action in
        "update")
                echo "update the db"
                ;;
        "select")
                echo "select from db"
                ;;
        "delete")
                echo "delete from db"
                ;;
        *)
                echo "no action"
                ;;

esac  

betway体育app 6

trap 'echo $BASH_COMMAND return err' ERR

别名

5.2 函数调用(函数参数)

shell中向函数字传送递参数是经过向来在函数调用后边增加参数达成,在函数中,传递的参数通过$1得到。

    echo "Critical: $1" >&2

 ~ 客户的家目录,即便是 root 则是 /root ,普通客商则是 /home/username

<4>. 调整结构 

set +x

行四个或八个以上的指令如何呢?则须求在指令之间加一个 ”;” 了。

4.3 if-else结构:

betway体育app 7

!/bin/sh#
# see whether arguments is positive
#
if [ $# -ne 1 ]
then
        echo "$0 : you must give/supply one integers"
        exit 1
fi

if test $1 -gt 0
then
        echo "$1 number is postivie"
else
        echo "$1 number is negative"
fi

betway体育app 8

 

betway体育app 9

#!/bin/sh                               

osch=0

echo "1. unix(sun os)"
echo "2. linux(red hat)"
echo -n "select your os choice [1 or 2] ?"
read osch

if [ $osch -eq 1  ]
then
        echo "you pick up unix"
else
        #
        # nested if
        if [ $osch -eq 2 ]
        then
                echo "you pick up linux"
        else
                echo "what you donot like unix/linux"
        fi
fi

betway体育app 10

 

 

betway体育app 11

#!/bin/sh
#
# test the if .. elif .. else
#
if [ $1 -gt 0 ] ; then
        echo "$1 is positive"
elif [ $1 -lt 0 ] ; then
        echo "$1 is negative"
elif [ $1 -eq 0 ] ; then
        echo "$1 is zero"
else
        echo "$1 is not a number"
fi

betway体育app 12

ERROR "this is a error log"

echo "Hello world!"

3.1 系统变量

linnux下的shell脚本中的变量分为“系统变量”和“客户自定义变量”,能够通过set命令查看那系统变量。

xuqiang@ubuntu:~/shell$ set

... 略去内容

xuqiang@ubuntu:~/shell$ echo $HOME

/home/xuqiang

 

| 管道符,前边数次涌出过,它的成效在于将符号前边命令的结果丢给标识后边的通令。

 4.4 for

betway体育app 13

!/bin/sh

#
# test for
#

for i in 1 2 3 4 5
do
        echo "welcome $i times"
done

betway体育app 14

betway体育app 15

#!/bin/bash

for (( i = 0; i <= 5; i++ ))
do
        echo "welcome $i times"

done  

betway体育app 16

 

betway体育app 17 Tip 1. 只顾程序中动用的shell脚本的连串

 

betway体育app 18

#!/bin/bash

for(( i = 1; i <= 5; i++  ))
do
        for(( j = 1; j <= 5; ++j ))
        do
                echo -n "$i"
        done

# print a new line
        echo ""
done

betway体育app 19

[ $_loglevel -ge 1 ] && echo -e "33[31m ERROR:33[0m $1" >&2

个标记正是这里的 2> 和 2>> 分别代表错误重定向和谬误追加重定向,当我们运营一

0

遭遇变量分为系统景况变量和客户遭受变量。系统意况变量,对具有客户起效率,而客商环

[ $_loglevel -ge 1 ] && echo "ERROR: $1" > /var/log/xxx_log.$BASHPID

Shell 特殊符号

本文由必威发布于必威-运维,转载请注明出处:shell扮演者操作系统内核和用户的中间人的角色,

TAG标签:
Ctrl+D 将本页面保存为书签,全面了解最新资讯,方便快捷。