工程中编写自己的makefile---7 shell学习

来源:互联网 发布:windows字体库样式 编辑:程序博客网 时间:2024/05/21 09:11

1        shell

基于Fedora 10 编写

1.1             常用的几个指令

1.      echo [-en] “hello word! \n”

-e 引号内有 \n 将执行,否则直接打印

-n 不断行继续在同一行执行

可以加双引号或不加双引号,参考1.4.1;有区别!!!

 

2.      export

设置或显示环境变量,

添加环境变量

exportPATH="/opt/hisi-linux-nptl/arm-hisiv100-linux/target/bin:$PATH"

 

3.      unset

使用 unset 命令可以删除变量

MYNAME=”wzt”

unset MYNAME

echo ${ MYNAME}

没有任何输出

 

4.      read

从标准输入读取数据

read [-pt] 变量名

-p               后接提示符

-t               等待输入变量的时间(单位 秒)

例如:        read -p “please  input your  name: ” -t 30  _username

 

5.      shellscript 的追踪与debug

sh  [-nvx]         scripts.sh

         -n      不要执行 scripts ,仅查询语法的问题

         -v      再执行  scripts前,先将scripts的内容输出到屏幕上

         -x      将使用到的 scripts 内容显示到屏幕上,这很有用


 

1.2             用户变量

单引号:

  可以说是所见即所得:即将单引号内的内容原样输出,或者描述为单引号里面看见的是什么就会输出什么,仅作为一般字符的显示型态。

双引号:

把双引号内的内容输出出来;如果内容中有命令,变量等,会先把变量,命令解析出结果,然后在输出最终内容来,双引号内命令或变量的写法为`命令或变量`或$(命令或变量),` `为反单引号

反单引号` `

         在一串指令中,还需要藉由其他的指令提供信息,可使用`命令`;效果等同于$(命令)

1.2.1        定义变量

以字母和下划线开头,注意!!! 等号两边不能有空格,定义时变量名不加美元符号

MYNAME=”wzt”或MYNAME=wzt

注意!!!最好使用MYNAME=”wzt”,第二种无法识别 MYNAME=”wzt pc”,有空格!!!

1.2.2        使用变量

使用一个定义过的变量,只要在变量名前面加美元符号($)即可,

         MYNAME=”wzt pc”

         echo${MYNAME} 或者echo $MYNAME

注意!!!推荐给所有变量加上花括号

1.3             环境变量

$PATH

决定了shell将到哪些目录中寻找命令或程序,PATH的值是一系列目录,当要求系统运行一个程序而没有告诉它程序所在的完整路径时,系统除了在当前目录下面寻找此程序外,还应到由PATH变量定义的目录中去查找

         编辑PATH 声明,其格式为:

  PATH=$PATH:<PATH1>:<PATH 2>:<PATH 3>:------:<PATH N>

环境变量更改后,在用户下次登陆时生效,如果想立刻生效,则可执行下面的语句:source /etc/profile

永久添加环境变量(添加HI3520D交叉编译工具)

在/etc/profile文档最后添加如下指令

export PATH="/opt/hisi-linux-nptl/arm-hisiv100-linux/target/bin:$PATH"

source /etc/profile


 

1.4             编写sh脚本

第一行必须以#!/bin/bash 来宣告这个script使用的shell名称

注意!!!

在linux虚拟机中,可以使用#!/bin/bash#!/bin/sh但在开发板中必须使用#!/bin/sh

#!是特殊的表示符,其后面根的是此解释此脚本的shell的路径

1.4.1        常用内部变量

./sh01.sh   opt1  opt2  opt3 opt4

$0          $1    $2   $3    $4

含义解释

1.  $$  Shell本身的PID(ProcessID)

2.  $!  Shell最后运行的后台Process的PID

3.  $?  最后运行的命令的结束代码(返回值)

4.  $-  使用Set命令设定的Flag一览

5.  $*  所有参数列表, "$*"用(")括起来的情况,以"$1 $2 …$n"的形式输出所有参数,被作为一个单词;没有双引号情况和$@是一样的

6.  $@  所有参数列表, "$@"用(")括起来的情况,以"$1""$2"…"$n"的形式输出所有参数,每个参数都是一个独立的""引用字串,这就意味着参数被完整地传递,可以用在for循环中的in后面

7.  $#  添加到Shell的参数个数

8.  $0  Shell本身的文件名

9.  $n  添加到Shell的各参数值,$1是第1参数,$2是第2参数…

备注:参考1.4.2.3

编写test.sh

#! /bin/sh

echo -e '$$' is"$$"

echo -e '$!' is"$!"

echo -e '$?' is"$?"

echo -e '$*' is "$*"

echo -e '$@' is"$@"

echo -e '$#' is"$#"

echo -e '$0' is"$0"

echo -e '$1' is"$1"

echo -e '$2' is"$2"

 

echo -e "\n"

echo -e "'$2' is"$2""

echo -e '$2' is ${2}

echo -e "\n"

exit 0

运行:

$$ is 28390

$! is

$? is 0

$* is 12345 qq

$@ is 12345 qq

$# is 2

$0 is ./test.sh

$1 is 12345

$2 is qq

 

'qq' is qq

$2 is qq

注意区别!!!

echo -e '$2' is"$2"

echo -e "'$2' is"$2""

echo -e '$2' is ${2}

1.4.2        常用函数

1.4.2.1    if  then

if      [条件判断式1];then

                   当条件判断式1成立时,可以进行的指令工作内容

elif    [条件判断式2];then

                   当条件判断式2成立时,可以进行的指令工作内容

else 

         当条件判断式12不成立时,可以进行的指令工作内容

fi

编写shell如下

#! /bin/sh

name="wzt"

addr="gk"

read -p "pleaseinput cmd : " -t 90 cmd

if [ ${cmd} =="1" ] || [ ${cmd} == "wzt" ];then

         echo "the cmd is ${name}"

elif [ ${cmd} =="2" ] || [ ${cmd} == "gk" ];then

         echo "the cmd is ${addr}"

else

         echo "don't down your input"

         exit 0

fi

exit 0

注意!!!

判断符号;注意空格,若_为空格,则

         [_${HOME}_==_${MAIL}_]       判断两个变量是否相同

 

运行如下

[root@9527 2]# ./test1.sh

please input cmd : 1

the cmd is wzt

[root@9527 2]# ./test1.sh

please input cmd : wzt

the cmd is wzt

[root@9527 2]# ./test1.sh

please input cmd : 2

the cmd is gk

[root@9527 2]# ./test1.sh

please input cmd : gk

the cmd is gk

[root@9527 2]# ./test1.sh

please input cmd : unknow

don't down your input

 

1.4.2.2    case esac 以及 function

case 值 in

模式1)

Cmmand1

Cmmand2

;;

模式2)

Cmmand1

Cmmand2

;;

*)

Cmmand1

Cmmand2

;;

esac

case工作方式如上所示。取值后面必须为关键字 in,每一模式必须以右括号结束。取值可以为变量或常数。匹配发现取值符合某一模式后,其间所有命令开始执行直至;;

;;与其他语言中的 break 类似,意思是跳到整个 case 语句的最后。

取值将检测匹配的每一个模式。一旦模式匹配,则执行完匹配模式相应命令后不再继续其他模式。如果无一匹配模式,使用星号 * 捕获该值,再执行后面的命令

 

注意!!!使用之前必须先定义

function  fnname()

{

程序段;

}

如果调用时带参数的话,       fnname    a       2       3

                                               $0          $1     $2     $3

 

编写shell如下

#! /bin/sh

 

name="my"

 

echo "input a numberbetween 1 to 4"

echo -n "pleaseinput number:"

read -t 10 number

 

function usr_msg

{

    echo "$2 number is $1"

}

 

case ${number} in

"1") usr_msg 1${name}

    ;;

"2") usr_msg 2${name}

    ;;

"3") usr_msg 3${name}

    ;;

"4") usr_msg 4${name}

    ;;

*) echo "${name} number is undown"

    exit 0

    ;;

esac

 

exit 0

运行如下

[root@9527 2]# ./test2.sh

input a number between 1to 4

please input number:1

your number is 1

[root@9527 2]# ./test2.sh

input a number between 1to 4

please input number:2

your number is 2

[root@9527 2]# ./test2.sh

input a number between 1to 4

please input number:3

your number is 3

[root@9527 2]# ./test2.sh

input a number between 1to 4

please input number:4

your number is 4

[root@9527 2]# ./test2.sh

input a number between 1to 4

please input number:5

your number is undown

1.4.2.3   for  do  done

固定循环

已经知道要进行几次循环

for var  in  con1 con2  con3

do

         程序段

done

第一次循环时, $var 的内容为 con1

第二次循环时, $var 的内容为 con2

第三次循环时, $var 的内容为 con3

编写shell如下

#! /bin/sh

#seq 1000     #起始默认是1,间隔默认也是1

#seq 2 1000  #210,间隔默认是1

#seq 1 3 10    #110,间隔为3,结果是:1 4 7 10

 

for i in $(seq 0 520);

do

         echo $i;

done;

 

echo "";

 

for((i=1;i<=4;i++));

do

         echo $i;

done;

 

echo "";

 

for i in"$@";

do

         echo $i;

done;

 

echo "";

 

for i in"$*";

do

         echo $i;

done;

exit 0

运行如下

[root@9527 2]#./test3.sh a b c d e

0

5

10

15

20

 

1

2

3

4

 

a

b

c

d

e

 

a b c d e

 

原创粉丝点击