工程中编写自己的makefile---7 shell学习
2017-06-05 16:35
351 查看
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
当条件判断式1,2不成立时,可以进行的指令工作内容
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 #从2到10,间隔默认是1
#seq 1 3 10 #从1到10,间隔为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
相关文章推荐
- 工程中编写自己的makefile---3 交叉编译工具
- 工程中编写自己的makefile---4 库文件
- 工程中编写自己的makefile---5 在实例2中使用库文件
- 工程中编写自己的makefile---6 makefile学习
- 工程中编写自己的makefile---8 编写Arm开发板的makefile
- 工程中编写自己的Makefile---1 一些基本概念
- 工程中编写自己的makefile---2 实例
- 大型工程的makefile编写及其维护管理
- 如何自己编写Makefile
- 如何自己编写Makefile(高级篇)
- Linux相关-------简单工程Makefile的编写
- Eclipse中使用自己的makefile管理工程
- 编写自己的makefile文件
- 如何自己编写Makefile
- 简单工程Makefile的编写
- 如何自己编写Makefile
- 如何自己编写Makefile
- 自己如何编写makefile
- Eclipse中使用自己的makefile管理工程
- makefile编写---多目录工程范例