嵌入式linux对shell脚本的基本掌握

2019-07-12 14:34发布

对于嵌入式linux开发者而言,shell脚本的要求基本上能看懂就可以。不用像运维人员那样写出非常强悍的shell脚本
shell:
在计算机科学中,Shell俗称壳(用来区别于核)
是指“提供使用者使用界面”的软件(命令解析器)
它类似于DOS下的command和后来的cmd.exe
它接收用户命令,然后调用相应的应用程序
同时它又是一种程序设计语言
作为命令语言
它交互式解释和执行用户输入的命令或者自动地解释和执行预先设定好的一连串的命令
作为程序设计语言,它定义了各种变量和参数
并提供了许多在高级语言中才具有的控制结构,包括循环和分支

bash / sh / ksh / csh(Unix/linux 系统) Bourne shell (包括 sh,ksh,and bash) Bourne shell ( sh) Korn shell ( ksh) Bourne Again shell ( bash) POSIX shell ( sh) C shell (包括 csh and tcsh) C shell ( csh) TENEX/TOPS C shell ( tcsh)
shell脚本:
windows 批处理脚本.bat   cmd
linux   shell脚本 .sh/空 shell
Shell Script,Shell脚本与Windows/Dos下的批处理相似
也就是用各类命令预先放入到一个文件中
方便一次性执行的一个程序文件
主要是方便管理员进行设置或者管理用的
但是它比Windows下的批处理更强大
比用其他编程程序编辑的程序效率更高
它使用了Linux/Unix下的命令
下面就列举一些shell基本用法和基本语句
sh格式要求:
sh文件格式开头:#!/bin/sh  #!特殊格式要求指定用哪种shell
在bin目录下执行
[root@localhost bin]# ls *sh* bash cgsnapshot csh dash sh tcsh可以查看系统所具有的解析器类别
shell脚本可以定义变量
格式:变量名=变量内容
引用:$+变量名

例如下面的例子:
#!/bin/sh ZC=123456 echo $ZC
运行sh
[root@localhost shell]# ./test.sh 123456
消除变量的含义将变量用单引号括住即可,看下面的例子:
#!/bin/bash ZC=shell LJJ=haha echo '$ZC+$LJJ'
执行sh
[root@localhost shell]# ./test.sh $ZC+$LJJ
删除变量使用unset+变量名  看一下下面这个例子:
#!/bin/bash ZC=shell LJJ=haha echo $ZC+$LJJ unset ZC unset LJJ echo $ZC+$LJJ

执行sh
[root@localhost shell]# ./test.sh shell+haha +打印结果中第二次打印变量已经被释放掉,没有打印


看下面的例子:
#!/bin/bash NUM1=3 NUM2=5 echo $(($NUM1+$NUM2))执行sh:
[root@localhost shell]# ./test.sh 8
读取标准输入命令read linux中标准输入默认为键盘输入,代码如下:
#!/bin/bash echo "请输入第一个数:" read NUM1 echo "请输入第二个数:" read NUM2 echo "两数相加的结果:" echo $(($NUM1+$NUM2))执行sh:
[root@localhost shell]# ./test.sh 请输入第一个数: 23 请输入第二个数: 45 两数相加的结果: 68
加法还可以这样写:
#!/bin/bash echo $(($1+$2))

执行sh:
[root@localhost shell]# ./test.sh 23 65 88
这么神奇!!那么这个神奇的$究竟是怎样的神通广大的呢?看下面
$1,$2…$n 传入的参数, $0 表示 shell 程序名称 每一项相当于 main 函数中 argv[i]. $#传递到脚本的参数列表,或表示参数个数 等价于 main 函数中的 argc-1. $@传入脚本的全部参数 argv[1] ---- argv[n-1]. $* 显示脚本全部参数 $? 前个命令执行情况 0 成功 1 失败 $$ 脚本运行的当前进程号 $! 运行脚本最后一个命令
综合演示一下:
#!/bin/bash echo $(($1+$2)) echo "脚本命令执行情况:" $? echo “"传入参数为:"$@ echo “"脚本执行进程号:"$$
执行sh:
[root@localhost shell]# ./test.sh 56 87 143
脚本命令执行情况: 0
“传入参数为:56 87
“脚本执行进程号:28632


判断命令 test 用法如下:
test 表达式 1 –a 表达式 2 两个表达式都为真 test 表达式 1 –o 表达式 2 两个表达式有一个为真 test –n 字符串 字符串的长度非零 –z 字符串长度为零 ==字符串相等 != 字符串不等 test 整数 1 –eq 整数 2 整数相等 -ge 大于等于 –gt 大于 –le 小于等于 –lt 小于 –ne 不等于 test File1 –ef File2 两个文件具有同样的设备号和 i 结点号 test File1 –nt File2 文件 1 比文件 2 新 test File1 –ot File2 文件 1 比文件 2 旧 test –b File 文件存在并且是块设备文件 test –c File 文件存在并且是字符设备文件 test –d File 文件存在并且是目录 test –e File 文件存在 test –f File 文件存在并且是普通文件 test –g File 文件存在并且是设置了组 ID test –G File 文件存在并且属于有效组 ID test –h File 文件存在并且是一个符号链接(同-L) test –k File 文件存在并且设置了 sticky 位 test –L File 文件存在并且是一个符号链接(同-h) test –o File 文件存在并且属于有效用户 ID test –p File 文件存在并且是一个命名管道 test –r File 文件存在并且可读 test –s File 文件存在并且是一个套接字 test –t File 文件描述符是在一个终端打开的 test –u File 文件存在并且设置了它的 set-user-id 位 test –w File 文件存在并且可写 test –x File 文件存在并且可执行
举一个小例子简单说明一下简单的用法:
#!/bin/bash test $1 -eq $2 echo $?

执行sh:
[root@localhost shell]# ./test.sh 1 3 1 [root@localhost shell]# ./test.sh 1 1 0通常判断语句test 与 if语句配合使用


shell脚本中的if语句结构如下
if [ 条件 ]
then
  [相关任务1]
else
  [相关任务2]
fi
如果条件为真执行then后面语句,如果条件为假执行else后面的语句,不要忘记if语句结束时加上fi
简单的小例子示意一下if用法:
#!/bin/bash if test $1 -eq $2 then echo "两个数相等" else echo "两个数不相等" fi
执行sh:
[root@localhost shell]# ./test.sh 1 1 两个数相等 [root@localhost shell]# ./test.sh 23 5 两个数不相等
shell中的while语句结构如下
while(条件)
do
  执行指令
done
举一个小例子说明一下while的用法:
#!/bin/bash c=0; while [ $c -lt 3 ] do echo "Value c is $c" c=`expr $c + 1` done

执行sh:
[root@localhost shell]# ./test.sh Value c is 0 Value c is 1 Value c is 2

while条件为c<3 执行循环条件为 c+1;
在shell脚本中执行算术运算通常用expr空格+运算体  做后用TAB键上方的点括起来使用。在进行乘法运算时需要用屏蔽其特殊含义
用于计算的命令还有let 用法如下:
#!/bin/bash c=100 let c=$c+1 echo $c

shell中的for语句结构如下:
for 变量 in 列表
do
  语句···
done
简单的小例子说明其用法
#!/bin/bash for int in 1 2 3 4 do echo $int done
执行sh:
[root@localhost shell]# ./test.sh 1 2 3 4

case分支语句相当于c语言中的switch case语句,case结构如下:
case 变量 in
“变量类型A”)执行语句;;
“变量类型B”)执行语句;;
“变量类型C”)执行语句;;
`````
esac
下面写一个小例程说明简单用法:
#!/bin/bash grade=$1 case $grade in "A") echo "Very Good!";; "B") echo "Good!";; "C") echo "Come On!";; *) echo "You Must Try!" echo "Sorry!";; esac

执行sh:
[root@localhost shell]# ./test.sh A Very Good! [root@localhost shell]# ./test.sh B Good! [root@localhost shell]# ./test.sh C Come On! [root@localhost shell]# ./test.sh F You Must Try! Sorry!
shell脚本中数组定义如下
变量名 =(元素1 元素2······元素n)
下面的小例程简单说明一下数组的用法:
#!/bin/bash int=(1 2 3 4 5) s=${int[2]} echo $s
执行sh:
[root@localhost shell]# ./test.sh 3
基本的shell指示就介绍到这里