经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » 数据库/运维 » Linux/Shell » 查看文章
Shell编程
来源:cnblogs  作者:AkiyamaYusuke  时间:2021/5/17 9:11:36  对本文有异议

Shell编程

【学习笔记】

认识Shell脚本

Shell 脚本(Shell Script)与Windows/DOS 下的批处理相似,也就是将各类命令预先放入其中,方便一次性执行的一个程序文件,主要用以方便管理员进行设置或者管理。但是Shell 脚本比Windows 下的批处理更强大,比用其他编程程序编辑的程序效率更高,毕竟它使用了Linux/UNIX 下的命令。

Shell脚本的基本语法

开头

可以使用任何一种编辑器来编辑

gedit、kedit、emacs、vi等等

  1. #!/bin/bash #表示系统用bash来执行程序
  2. ……

编辑该文件后不能立即执行它,需给文件设置可执行程序权限

  1. chmod [权限] [文件名] #添加可执行程序权限(如权限777)

然后可以使用./[filename]来运行程序

执行

有三种方法

方法一:

  1. ./test.sh

方法二:

  1. bash test.sh

方法三:

  1. export PATH=/home/pyma/Shell:$PATH #添加到环境变量中
  2. ./test.sh #执行

注释

在进行Shell 编程时,以#开头的句子表示注释,直到这一行的结束

变量

用户自定义变量

(1)首个字母必须位字母(az,AZ)或者下划线(_)

(2)中间不能有空格,可以使用下划线(_)

(3)不能使用其他标点符号

变量赋值
  1. 变量名=值 #DATA=2

这里要注意:变量赋值时,等号两边都没有空格。在Shell 编程中通常使用全大写变量,方便识别。

从右向左赋值

  1. #!/bin/bash
  2. Y=y
  3. X=$Y
  4. echo X=$X
变量调用

要取用一个变量的值,只需在变量名前面加一个$

  1. #!/bin/bash
  2. # 对变量赋值:
  3. VAR="hello world" #等号两边均不能有空格存在
  4. # 打印变量VAR 的值:
  5. echo "VAR is:" $VAR
用花括号区分变量和字母

可以使用花括号来告诉Shell 我们要打印的是num 变量

  1. num=2
  2. echo "this is the ${num}nd"
unset 命令可删除变量的赋值
  1. Z=hello
  2. echo $Z
  3. #输出会打印hello
  4. #在命令行里边输入
  5. unset Z
  6. #再打印Z将会为空

位置参数及命令行参数

位置参数的值可以用$N 得到,N 是一个数字,如果为1,即$1

  1. $0 与键入的命令行一样,包含脚本文件名
  2. $1,$2,…,$9 分别包含第一个到第九个命令行参数

预定义变量

预定义变量是在Shell 一开始时就定义了的变量,所有预定义变量都是由$符和另一个符号组成的。

  1. ·$#:包含命令行参数的个数。
  2. ·$@:包含所有命令行参数:“$1,$2,…,$9”。
  3. ·$?:包含前一个命令的退出状态,正常退出返回0,反之为非0 值。
  4. ·$*:包含所有命令行参数:“$1,$2,…,$9”。
  5. ·$$:包含正在执行进程的ID 号。

环境变量

环境变量用于所有的用户进程。在Linux 中,登录进程称为父进程,Shell 中执行的用户程序均称为子进程。环境变量可以在命令行中设置,但用户注销时这些值将丢失,因此最好在$HOME/目录下的.profile 中定义,传统上环境变量均为大写。

常见环境变量
  1. ·HOME /etc/passwd 文件中列出的用户主目录。
  2. ·IFS:内部字段分隔符(Internal Field Separator), 默认为空格,tab 及换行符。
  3. ·PATH shell 搜索路径。
  4. ·PS1PS2:默认提示符($)及换行提示符(>)。
  5. ·TERM:终端类型,常用的有vt100ansivt200xterm 等。
  6. ·HISTSIZE:保存历史命令记录的条数。
  7. ·LOGNAME:当前用户登录名。
  8. ·HOSTNAME:主机名称,若应用程序要用到主机名的话,一般是从这个环境变量中取得。
  9. ·SHELL:当前用户用的是哪种Shell
  10. ·LANG/LANGUGE:和语言相关的环境变量,使用多种语言的用户可以修改此环境变量。
  11. ·MAIL:当前用户的邮件存放目录。
  12. ·TMOUT :用来设置脚本过期的时间,比如TMOUT=3,表示该脚本3 秒后过期。
  13. ·UID : 已登录用户的ID
  14. ·USER :显示当前用户名字。
  15. ·SECONDS:记录脚本从开始到结束耗费的时间。
设置环境变量
  1. ·echo:显示指定环境变量。
  2. ·export:设置新的环境变量。
  3. ·env:显示所有环境变量。
  4. ·set:显示所有本地定义的Shell 变量。
  5. ·unset:清除环境变量。
  1. export PATH=[代码所在路径]:$PATH

注意:一定要加$PATH(表示应用PATH变量以前的内容),否则,之前的环境变量会被覆盖掉

Shell程序和语句

说明性语句

说明性语句即注释行

功能性语句

1、键盘读入变量值

存放目录的变量为DIRECTORY,其读入语句为read DIRECTORY

  1. #!/bin/bash
  2. echo please input name of directory
  3. read DIRECTORY
  4. ls $DIRECTORY -a

2、算数运算命令

算术运算命令expr 主要用于进行简单的整数运算,包括加(+)、减(-)、乘(*)、整除(/)和求模(%)等操作。

  1. #!/bin/bash
  2. echo "please input tow numbers:"
  3. read var1
  4. read var2
  5. add=`expr $var1 + $var2`
  6. sub=`expr $var1 - $var2`
  7. mul=`expr $var1 \* $var2`
  8. div=`expr $var1 / $var2`
  9. mod=`expr $var1 % $var2`
  10. echo '$var1+$var2'=$add
  11. echo '$var1-$var2'=$sub
  12. echo '$var1*$var2'=$mul
  13. echo '$var1/$var2'=$div
  14. echo '$var1%$var2'=$mod

【注意】表达式z=expr $x + $y中的符号“”为键盘左上角的“”键,即反引号

3、test命令

(1)字符串测试

  1. s1 = s2 测试两个字符串的内容是否完全一样
  2. s1 != s2 测试两个字符串的内容是否有差异
  3. -z s1 测试s1 字符串的长度是否为0
  4. -n s1 测试s1 字符串的长度是否不为0

(2)整数测试

  1. a -eq b 测试a b 是否相等
  2. a -ne b 测试a b 是否不相等
  3. a -gt b 测试a 是否大于b
  4. a -ge b 测试a 是否大于等于b
  5. a -lt b 测试a 是否小于b
  6. a -le b 测试a 是否小于等于b

(3)文件测试

  1. -d name 测试name 是否为一个目录
  2. -f name 测试name 是否为普通文件
  3. -L name 测试name 是否为符号链接
  4. -r name 测试name 文件是否存在且为可读
  5. -w name 测试name 文件是否存在且为可写
  6. -x name 测试name 文件是否存在且为可执行
  7. -s name 测试name 文件是否存在且其长度不为0
  8. f1 -nt f2 测试文件f1 是否比文件f2 更新
  9. f1 -ot f2 测试文件f1 是否比文件f2 更旧

4、tput命令

tput 命令主要用于设置终端工作模式,或读出终端控制字符。tput 命令与终端控制代码数据库terminfo 相连, 根据Shell 环境变量TERM 的值, 读出这种终端的指定功能控制代码

结构性语句

1、条件测试语句

  1. if 表达式
  2. then 命令表1
  3. else 命令表2
  4. fi
  5. #如果表达式为真, 则执行命令表1 中的命令, 并退出if 语句;否则执行命令表2 中的语句, 再退出if 语句

2、多路分支语句

多路分支语句case 用于多重条件测试, 语法结构清晰自然

  1. case 字符串变量 in #(case 语句只能检测字符串变量)
  2. 模式1) #(各模式中可用文件名元字符,以右括号结束)
  3. 命令表1
  4. ;; #(命令表以单独的双分号行结束,退出case 语句)
  5. 模式2)
  6. 命令表2
  7. ;;
  8. ……
  9. 模式n) #(模式n 常写为字符* 表示所有其他模式)
  10. 命令表n
  11. ;; #(最后一个双分号行可以省略)
  12. esac

3、循环语句

循环体由语句括号do 和done 来限定

(1)for循环

  1. for 变量名 in 单词表
  2. do
  3. 命令表
  4. done

(2)while循环

  1. while 命令或表达式
  2. do
  3. 命令表
  4. done

4、循环控制语句

Shell 脚本中,循环控制语句有break 和continue。break n 表示跳出n 层;continue 语句表示马上转到最近一层循环语句的下一轮循环上,continue n 则转到最近n 层循环语句的下一轮循环上。

  1. #!/bin/bash
  2. for i in 1 2 3 4 5 6 7 8 9 10
  3. do
  4. if [ $i -eq 5 ]
  5. then
  6. continue
  7. fi
  8. echo "$i"
  9. done

Shell函数

在Shell 程序中, 常常把完成固定功能、且多次使用的一组命令(语句)封装在一个函数里,每当要使用该功能时只需调用该函数即可。

函数在调用前必须先定义,即在顺序上函数说明必须放在调用程序的前面。
调。

调用程序可传递参数给函数, 函数可用return 语句把运行结果返回给调用程序。

函数只在当前Shell 中起作用, 不能输出到子Shell 中。

函数定义格式

方式一:

  1. function_name ( )
  2. {
  3. command1
  4. ……
  5. commandn
  6. }

方式二:

  1. function function_name ( )
  2. {
  3. command1
  4. ……
  5. commandn
  6. }

函数调用格式

方式一:

  1. value_name=`function_name [arg1 arg2 …]` #函数的所有标准输出都传递给了主程序的变量。

方式二:

  1. function_name [arg1 arg2 …]
  2. echo $ # $?表示获取函数的返回的状态。

Shell脚本调用

在Shell 脚本的执行过程中,支持调用另一个Shell 脚本,调用的格式为

  1. 脚本名

注意:
(1)在Linux 编辑中命令区分大小写字符;
(2)在Shell 语句中加入必要的注释,以便以后查询和维护,注释以#开头;
(3)对Shell 变量进行数字运算,使用乘法符号“*”时,要用转义字符“\”进行转义;
(4)由于Shell 对命令中多余的空格不进行任何处理,因此程序员可以利用这一特性调整程序缩进,达到增强程序可读性效果;
(5)在对函数命名时最好能使用有含义且容易理解的名字,即使函数名能够比较准确地表达
函数所完成的任务,同时建议对于较大的程序要建立函数名和变量命名对照表。

选自华清远见《嵌入式操作系统》

原文链接:http://www.cnblogs.com/AkiyamaYusuke/p/14756879.html

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号