文章目录
前言
shell编程-变量
shell脚本的基础知识
shell脚本的本质
shell 编程的基本过程
shell变量
用户自定义变量
位置变量
常用shell环境变量
shell编程-功能语句
说明性语句(注释行)
常用功能性语句(命令)
read 读入数据
expr命令 用于算数运算
test语句 测试语句
shell编程-分支语句
条件语句
多路分支语句
shell编程-循环语句
循环语句for的用法
循环语句while的用法
循环控制语句
shell编程-函数
shell函数调用
函数变量作用域
写在最后
shell编程-变量
shell脚本的基础知识
shell脚本的本质
语言的分类:解释性语言、编译型语言
shell脚本语言是解释型语言
shell脚本的本质:shell命令的有序集合
shell 编程的基本过程
建立shell文件
包含任意多行操作系统命令或shell命令的文本文件;一般以.sh结尾
赋予shell文件执行权限
用chmod命令修改权限;一般用chmod u+x就是读和执行权限。
执行shell文件
直接使用命令行调用shell程序
shell变量
shell允许用户建立变量存储数据,但不支持数据类型(整型、字符、浮点型),将任何赋给变量的值都解释为一串字符
Variable=value
等号两边一定不能加空格
count=1 echo $count Datat
Bourne Shell有如下四种变量:
用户自定义变量
位置变量即命令行参数
预定义变量
环境变量
用户自定义变量
在shell编程中通常使用全大写变量,方便识别 $ COUNT=1
变量的调用:在变量前加$ $ echo $HOME
Linux Shell/bash从右向左赋值
$Y=y $ X=$Y $ echo $X y
使用unset命令删除变量的赋值 unset Z
位置变量
常用shell环境变量
HOME: /etc/passwd文件中列出的用户主目录
IFS:Internal Field Separator, 默认为空格,tab及换行符
PATH :shell搜索路径
PS1,PS2:默认提示符($)及换行提示符(>)
TERM:终端类型,常用的有vt100,ansi,vt200,xterm等
shell编程-功能语句
说明性语句:
以#号开始到该行结束,不被解释执行
功能性语句:
任意的shell命令、用户程序或其它shell程序。
结构性语句:
条件测试语句、多路分支语句、循环语句、循环控制语句等。
说明性语句(注释行)
注释行可以出现在程序中的任何位置,既可以单独占用一行, 也可以接在执行语句的后面. 以#号开始到所在行的行尾部分,都不被解释执行. 例如:# 下面程序段的说明
但是:#! /bin/sh需要告诉编译器使用哪个shell
常用功能性语句(命令)
read 读入数据
read var
read var1 var2 var3
把读入行中的第一个单词(word)赋给var1, 第二个单词赋给var2, ……把其余所有的词赋给最后一个变量.
如果执行read语句时标准输入无数据, 则程序在此停留等侯, 直到数据的到来或被终止运行。
如果输入的时候希望和提示信息同一行可以:
使用sh用/c来实现
使用bash利用echo -n实现
expr命令 用于算数运算
expr 12 + 5 \* 3
算数运算的时候不能省略空格!!!
sum=`expr $num \\* 6 `
$变量名表示变量的值
但是给变量赋值的时候两边不可以加空格!!!
test语句 测试语句
测试的三种类型:
字符串
整数
文件属性
test "$answer" = "yes" #变量answer值是否是yes test $num -eq 18 #判断num是否是整数18 test -d tmp #是否是一个目录
test的一些参数 (记不住。。学废了,没事回来看看吧0.0):
参数 使用 含义
字符串
= s1 = s2 测试字符串是否完全一样
!= s1 != s2 测试两个字符串的内容是否有差异
-z -z s1 测试s1字符串的长度是否为0
-n -n s1 测试s1字符串的长度是否不为0
整数
-eq a -eq b 测试a与b是否相等
-ne a -ne b 测试a与b是否不等
-gt a -gt b 测试a是否大于b
-ge a -ge b 测试a是否大于等于b
-lt a -lt b 测试a是否小于b
-le a -le b 测试a是否小于等于b
文件目录
-d -d name 测试name 是否为一个目录
-e -e name 测试一个文件是否存在
-f -f name 测试name 是否为普通文件
-L -L name 测试name 是否为符号链接
-r -r name 测试name 文件是否存在且为可读
-w -w name 测试name 文件是否存在且为可写
-x -x name 测试name 文件是否存在且为可执行
-s -s name 测试name 文件是否存在且其长度不为0
-nt f1 -nt f2 测试文件f1 是否比文件f2 更新
-ot f1 -ot f2 测试文件f1 是否比文件f2 更旧
-o a -le b -o a -le 100 测试两个条件是否至少一个满足条件