【学习笔记】程序员
Shell 脚本(Shell Script)与Windows/DOS 下的批处理类似,也就是将各种命令预先放入其中,方便一次性执行的一个程序文件,主要用以方便管理员进行设置或者管理。可是Shell 脚本比Windows 下的批处理更强大,比用其余编程程序编辑的程序效率更高,毕竟它使用了Linux/UNIX 下的命令。shell
可使用任何一种编辑器来编辑数据库
gedit、kedit、emacs、vi等等编程
#!/bin/bash #表示系统用bash来执行程序 ……
编辑该文件后不能当即执行它,需给文件设置可执行程序权限bash
chmod [权限] [文件名] #添加可执行程序权限(如权限777)
而后可使用./[filename]来运行程序编辑器
有三种方法函数
./test.sh
bash test.sh
export PATH=/home/pyma/Shell:$PATH #添加到环境变量中 ./test.sh #执行
在进行Shell 编程时,以#开头的句子表示注释,直到这一行的结束学习
(1)首个字母必须位字母(az,AZ)或者下划线(_)测试
(2)中间不能有空格,可使用下划线(_)this
(3)不能使用其余标点符号
变量名=值 #DATA=2
这里要注意:变量赋值时,等号两边都没有空格。在Shell 编程中一般使用全大写变量,方便识别。
从右向左赋值
#!/bin/bash Y=y X=$Y echo X=$X
要取用一个变量的值,只需在变量名前面加一个$
#!/bin/bash # 对变量赋值: VAR="hello world" #等号两边均不能有空格存在 # 打印变量VAR 的值: echo "VAR is:" $VAR
可使用花括号来告诉Shell 咱们要打印的是num 变量
num=2 echo "this is the ${num}nd"
Z=hello echo $Z #输出会打印hello #在命令行里边输入 unset Z #再打印Z将会为空
位置参数的值能够用$N 获得,N 是一个数字,若是为1,即$1
$0 与键入的命令行同样,包含脚本文件名 $1,$2,…,$9 分别包含第一个到第九个命令行参数
预约义变量是在Shell 一开始时就定义了的变量,全部预约义变量都是由$符和另外一个符号组成的。
·$#:包含命令行参数的个数。 ·$@:包含全部命令行参数:“$1,$2,…,$9”。 ·$?:包含前一个命令的退出状态,正常退出返回0,反之为非0 值。 ·$*:包含全部命令行参数:“$1,$2,…,$9”。 ·$$:包含正在执行进程的ID 号。
环境变量用于全部的用户进程。在Linux 中,登陆进程称为父进程,Shell 中执行的用户程序均称为子进程。环境变量能够在命令行中设置,但用户注销时这些值将丢失,所以最好在$HOME/目录下的.profile 中定义,传统上环境变量均为大写。
·HOME: /etc/passwd 文件中列出的用户主目录。 ·IFS:内部字段分隔符(Internal Field Separator), 默认为空格,tab 及换行符。 ·PATH :shell 搜索路径。 ·PS1,PS2:默认提示符($)及换行提示符(>)。 ·TERM:终端类型,经常使用的有vt100、ansi、vt200、xterm 等。 ·HISTSIZE:保存历史命令记录的条数。 ·LOGNAME:当前用户登陆名。 ·HOSTNAME:主机名称,若应用程序要用到主机名的话,通常是从这个环境变量中取得。 ·SHELL:当前用户用的是哪一种Shell。 ·LANG/LANGUGE:和语言相关的环境变量,使用多种语言的用户能够修改此环境变量。 ·MAIL:当前用户的邮件存放目录。 ·TMOUT :用来设置脚本过时的时间,好比TMOUT=3,表示该脚本3 秒后过时。 ·UID : 已登陆用户的ID。 ·USER :显示当前用户名字。 ·SECONDS:记录脚本从开始到结束耗费的时间。
·echo:显示指定环境变量。 ·export:设置新的环境变量。 ·env:显示全部环境变量。 ·set:显示全部本地定义的Shell 变量。 ·unset:清除环境变量。
export PATH=[代码所在路径]:$PATH
注意:必定要加$PATH(表示应用PATH变量之前的内容),不然,以前的环境变量会被覆盖掉
说明性语句即注释行
一、键盘读入变量值
存放目录的变量为DIRECTORY,其读入语句为read DIRECTORY
#!/bin/bash echo “please input name of directory” read DIRECTORY ls $DIRECTORY -a
二、算数运算命令
算术运算命令expr 主要用于进行简单的整数运算,包括加(+)、减(-)、乘(*)、整除(/)和求模(%)等操做。
#!/bin/bash echo "please input tow numbers:" read var1 read var2 add=`expr $var1 + $var2` sub=`expr $var1 - $var2` mul=`expr $var1 \* $var2` div=`expr $var1 / $var2` mod=`expr $var1 % $var2` echo '$var1+$var2'=$add echo '$var1-$var2'=$sub echo '$var1*$var2'=$mul echo '$var1/$var2'=$div echo '$var1%$var2'=$mod
【注意】表达式z=expr $x + $y
中的符号“”为键盘左上角的“
”键,即反引号
三、test命令
(1)字符串测试
s1 = s2 测试两个字符串的内容是否彻底同样 s1 != s2 测试两个字符串的内容是否有差别 -z s1 测试s1 字符串的长度是否为0 -n s1 测试s1 字符串的长度是否不为0
(2)整数测试
a -eq b 测试a 与b 是否相等 a -ne b 测试a 与b 是否不相等 a -gt b 测试a 是否大于b a -ge b 测试a 是否大于等于b a -lt b 测试a 是否小于b a -le b 测试a 是否小于等于b
(3)文件测试
-d name 测试name 是否为一个目录 -f name 测试name 是否为普通文件 -L name 测试name 是否为符号连接 -r name 测试name 文件是否存在且为可读 -w name 测试name 文件是否存在且为可写 -x name 测试name 文件是否存在且为可执行 -s name 测试name 文件是否存在且其长度不为0 f1 -nt f2 测试文件f1 是否比文件f2 更新 f1 -ot f2 测试文件f1 是否比文件f2 更旧
四、tput命令
tput 命令主要用于设置终端工做模式,或读出终端控制字符。tput 命令与终端控制代码数据库terminfo 相连, 根据Shell 环境变量TERM 的值, 读出这种终端的指定功能控制代码
一、条件测试语句
if 表达式 then 命令表1 else 命令表2 fi #若是表达式为真, 则执行命令表1 中的命令, 并退出if 语句;不然执行命令表2 中的语句, 再退出if 语句
二、多路分支语句
多路分支语句case 用于多重条件测试, 语法结构清晰天然
case 字符串变量 in #(case 语句只能检测字符串变量) 模式1) #(各模式中可用文件名元字符,以右括号结束) 命令表1 ;; #(命令表以单独的双分号行结束,退出case 语句) 模式2) 命令表2 ;; …… 模式n) #(模式n 常写为字符* 表示全部其余模式) 命令表n ;; #(最后一个双分号行能够省略) esac
三、循环语句
循环体由语句括号do 和done 来限定
(1)for循环
for 变量名 in 单词表 do 命令表 done
(2)while循环
while 命令或表达式 do 命令表 done
四、循环控制语句
Shell 脚本中,循环控制语句有break 和continue。break n 表示跳出n 层;continue 语句表示立刻转到最近一层循环语句的下一轮循环上,continue n 则转到最近n 层循环语句的下一轮循环上。
#!/bin/bash for i in 1 2 3 4 5 6 7 8 9 10 do if [ $i -eq 5 ] then continue fi echo "$i" done
在Shell 程序中, 经常把完成固定功能、且屡次使用的一组命令(语句)封装在一个函数里,每当要使用该功能时只需调用该函数便可。
函数在调用前必须先定义,即在顺序上函数说明必须放在调用程序的前面。
调。
调用程序可传递参数给函数, 函数可用return 语句把运行结果返回给调用程序。
函数只在当前Shell 中起做用, 不能输出到子Shell 中。
方式一:
function_name ( ) { command1 …… commandn }
方式二:
function function_name ( ) { command1 …… commandn }
方式一:
value_name=`function_name [arg1 arg2 …]` #函数的全部标准输出都传递给了主程序的变量。
方式二:
function_name [arg1 arg2 …] echo $? # $?表示获取函数的返回的状态。
在Shell 脚本的执行过程当中,支持调用另外一个Shell 脚本,调用的格式为
脚本名
注意:
(1)在Linux 编辑中命令区分大小写字符;
(2)在Shell 语句中加入必要的注释,以便之后查询和维护,注释以#开头;
(3)对Shell 变量进行数字运算,使用乘法符号“*”时,要用转义字符“\”进行转义;
(4)因为Shell 对命令中多余的空格不进行任何处理,所以程序员能够利用这一特性调整程序缩进,达到加强程序可读性效果;
(5)在对函数命名时最好能使用有含义且容易理解的名字,即便函数名可以比较准确地表达
函数所完成的任务,同时建议对于较大的程序要创建函数名和变量命名对照表。
选自华清远见《嵌入式操做系统》