电影院网站建设方案,网站制作的重要流程,百度收录好的网站排名,东莞石龙网站建设文章目录 第一章 Shell编程【重点】1.1. Shell的概念介绍1.1.1. 命令解释器4.1.1.2. Shell脚本 1.2. Shell编程规范1.2.1. 脚本文件的结构1.2.2. 脚本文件的执行 1.3. Shell的变量1.3.1. 变量的用法1.3.2. 变量的分类1.3.3. 局部变量1.3.4. 环境变量1.3.5. 位置参数变量1.3.6. … 文章目录 第一章 Shell编程【重点】1.1. Shell的概念介绍1.1.1. 命令解释器4.1.1.2. Shell脚本 1.2. Shell编程规范1.2.1. 脚本文件的结构1.2.2. 脚本文件的执行 1.3. Shell的变量1.3.1. 变量的用法1.3.2. 变量的分类1.3.3. 局部变量1.3.4. 环境变量1.3.5. 位置参数变量1.3.6. 预定义变量 1.4. read命令1.4.1. 命令说明1.4.2. read的实例1.4.3. 注意事项 1.5. 运算1.5.1. expr1.5.2. 示例1.5.3. {} 1.6. 字符串1.6.1. 字符串的脚本用法1.6.2. 字符串的长度 1.7. Shell数组1.7.1. 数组的使用规则1.7.2. 数组的定义1.7.3. 读取数组 1.8. test测试命令 第一章 Shell编程【重点】
1.1. Shell的概念介绍
1.1.1. 命令解释器
Shell是命令解释器(command interpreter)是Unix操作系统的用户接口程序从用户接口得到输入信息shell将用户程序及其输入翻译成操作系统内核kernel能够识别的指令并且操作系统内核执行完将返回的输出通过shell再呈现给用户下图所示用户、shell和操作系统的关系 一个系统可以存在多个shell可以通过cat /etc/shells命令查看系统中安装的shell。
[rootqianfeng01 ~]# cat /etc/shells/bin/sh
/bin/bash
/usr/bin/sh
/usr/bin/bash操作系统内核kernel与shell是独立的套件而且都可被替换不同的操作系统使用不同的shell 同一个kernel之上可以使用不同的shell。 也可以查看当前shell环境是哪种
[rootqianfeng01 ~]# echo $SHELL4.1.1.2. Shell脚本
Shell也是一门编程语言即shell脚本。在此脚本中我们可以使用一些编程语法来进行一些任务操作。 如变量、类型、分支结构、循环结构、数组、函数等语法。 在shell脚本里必须指定一种shell命令解释器。
1.2. Shell编程规范
1.2.1. 脚本文件的结构
1 文件的扩展名必须是.sh
2 文件的首行必须使用#! 指定script的运行shell环境(即脚本解释器)如#!/bin/bash
3 脚本里的行注释符号为#
4 指令、选项、参数之间即使有多个空格仍会被视为一个空格。
5 tab键形成的空白也被视为一个空格键
6 空白行会被忽略1.2.2. 脚本文件的执行 使用bash程序调用执行只需要有读权限即可 [rootqianfeng01 ~]# sh *.sh
或者
[rootqianfeng01 ~]# bash *.sh直接写script必须要有rx权限才行 [rootqianfeng01 ~]# ./*.sh
绝对路径写法 /hadoop/*.sh
相对路径写法 ./*.sh借助变量PATH功能 将*.sh放入~/bin目录下因为PATH里拼接了~/bin目录。
注意~/bin目录必须自行创建1.3. Shell的变量
1.3.1. 变量的用法
1. 变量的命名规则 - 命名只能使用英文字母数字和下划线。首个字符不能以数字开头。- 字母习惯使用大写。- 中间不能有空格。- 不能使用标点符号。- 不能使用bash里的关键字可用help命令查看保留关键字2. 变量的使用规则- 直接定义变量名称没有类型需要强调类似于数学中:x1,y2,zxy- 赋值时前后不能有空格- 命令的执行结果赋值给变量时使用反单引号 如TIMEdate- 调用变量时必须使用$ 格式 $变量名 或 ${变量名}1.3.2. 变量的分类
Linux Shell中的变量可以分为三种变量: 局部变量、环境变量、特殊变量。可以通过set命令查看系统中存在的所有变量
局部变量也就是用户自定义的变量在脚本中或命令中定义
环境变量保存和系统操作环境相关的数据。$HOME、$PWD、$SHELL、$USER等等
特殊变量一种是位置参数变量主要用来向脚本中传递参数或数据变量名不能自定义变量作用固定。一种是预定义变量是Bash中已经定义好的变量变量名不能自定义变量作用也是固定的。1.3.3. 局部变量
用户自定义的变量由字母或下划线开头由字母数字或下划线序列组成并且大小写字母意义不同变量名长度没有限制。 定义变量 习惯上用大写字母来命名变量。变量名以字母表示的字符开头不能用数字。调用变量 在使用变量时要在变量名前加上前缀“$”.
使用echo 命令查看变量值
eg: [rootqianfeng01 ~]# echo $A变量赋值 第一种: 定义时赋值 # 变量值
# 注意: 在上述的定义方式中等号的左右两侧不能有空格
# eg:
[rootqianfeng01 ~]# STRhello qianfeng
[rootqianfeng01 ~]# A9第二种: 将一个命令的执行结果给变量赋值 [rootqianfeng01 ~]# Als -la 反引号运行里面的命令并把结果返回给变量A
[rootqianfeng01 ~]# A$(ls -la) 等价于反引号
[rootqianfeng01 ~]# AA$((45))
[rootqianfeng01 ~]# BBexpr 4 5 第三种: 将一个变量的值赋给另一个变量 [rootqianfeng01 ~]# A$STR变量叠加 # 变量叠加就是将两个字符串变量的值叠加在一起类似于Java中的字符串拼接操作。[rootqianfeng01 ~]# A123
[rootqianfeng01 ~]# C$A456
[rootqianfeng01 ~]# D${A}789# 单引号和双引号的区别
# 现象单引号里的内容会全部输出而双引号里的内容会有变化
# 原因单引号会将所有特殊字符脱意[rootqianfeng01 ~]# NUM10 [rootqianfeng01 ~]# SUM$NUM hehe
[rootqianfeng01 ~]# echo $SUM # 输出10 hehe[rootqianfeng01 ~]# SUM2$NUM hehe
[rootqianfeng01 ~]# echo $SUM2 # 输出$NUM hehe删除变量 # 删除之前已经定义过的变量之后就无法再使用这个变量了。# 撤销变量 A
[rootqianfeng01 ~]# unset A
# 声明静态的变量 B2 不能 unset
[rootqianfeng01 ~]# readonly B2
# 报错: -bash: unset: B: cannot unset: readonly variable
[rootqianfeng01 ~]# unset B注意事项 关于局部变量的作用域的问题: 用户自定义的局部变量作用于仅为当前的Shell环境。仅在当前的Shell示例中有效其他的Shell启动的程序不能访问局部变量。 [rootqianfeng01 ~]# echo #!/bin/bash test.sh
[rootqianfeng01 ~]# A22
[rootqianfeng01 ~]# echo echo $A test.sh
[rootqianfeng01 ~]# echo $A 结果:22
[rootqianfeng01 ~]# bash test.sh 结果:打印为空,因为bash会开启新的shell进程1.3.4. 环境变量
用户自定义的局部变量只能在当前的Shell中生效而环境变量会在当前Shell和其所有的子Shell中生效。如果把环境变量写入相应的配置文件那么这个环境变量就会在所有的Shell中生效。
作用域: 当前的Shell以及所有的子Shell
声明变量: export 变量名变量值
定义环境变量的常见配置文件:
/etc/profile - 针对系统所有的用户生效此文件应用于所有用户每次登录系统时的环境变量定义。每次用户登录的时候都会加载这个文件。$HOME/.bash_profile - 针对特定用户生效HOME/.bash_profile文件中的定义。
1.3.5. 位置参数变量
变量描述0表示命令本身9表示第1到第9个参数10以上的参数需要使用大括号包含例如${10}1 n的形式输出所有参数1 “n” 的形式输出所有参数$#参数的个数 的区别 他们都表示传递给函数或脚本的所有参数不被双引号包含时都以 $1$2$3...$n的形式输出所有参数。当他们被双引号包含时 $*会将所有的参数作为一个整体以 $1 $2 $3 ... $n 的形式输出所有的参数。$会将各个参数分开以 $1$2$3...$n 的形式输出所有参数。 Shell脚本执行测试 # 执行脚本 test1.sh
#!/bin/bash
echo test \$*
for i in $*
doecho $i
doneecho test \$
for i in $
doecho $i
doneecho test \\$*\
for i in $*
doecho $i
doneecho test \\$\
for i in $
doecho $i
done输出结果:
[rootqianfeng01 ~]# sh test1.sh a b
test $*
a
b
test $
a
b
test $*
a b
test $
a
b1.3.6. 预定义变量
变量描述$?执行上一个命令的返回值。执行成功返回0执行失败返回非0$$当前进程的进程号(PID)即当前脚本执行时生成的进程号$!后台运行的最后一个进程的进程号(PID)最近一个被放入后台执行的进程 测试 $? [rootqianfeng01 ~]# ls ; echo $?
# 分析: 这里的意思是依次顺序执行两个命令
# 如果分号前的命令可以执行$?会返回0; 否则会返回非0的一个数字测试 $$ [rootqianfeng01 ~]# pwd /dev/null
[rootqianfeng01 ~]# echo $$测试 $! [rootqianfeng01 ~]# ls /etc /dev/null
[rootqianfeng01 ~]# echo $!1.4. read命令
1.4.1. 命令说明
read命令可以从控制台读取用户输入的内容并且给指定的变量进行赋值。
命令的基本格式为: read [option] variable
常见的option:
-p : 提示语句在输入之前给用户提示的信息
-n : 限制输入的字符数量到达这个数量的字符的时候会自动的停止输入
-t : 等待时间单位为秒。当到达这个等待时间的时候会自动的结束输入并且不会读取任何输入的内容!即输入操作且回车必须在指定的时间内完成。
-s : 隐藏输入的内容。在控制台上不显示任何输入的内容常见于密码的输入1.4.2. read的实例
[rootqianfeng01 ~]# read -t 30 -p please input your name: NAME[rootqianfeng01 ~]# echo $NAME[rootqianfeng01 ~]# read -s -p please input your age : AGE[rootqianfeng01 ~]# echo $AGE 注意如果隐藏输入这里的结果是看不到的[rootqianfeng01 ~]# read -n 1 -p please input your sex [M/F]: GENDER[rootqianfeng01 ~]# echo $GENDER1.4.3. 注意事项
在输入的时候如果输错了需要删除的时候执行ctrldelete符号不要输入中文变量与之前的内容需要保持有空格
1.5. 运算
1.5.1. expr
格式 :expr m n 或$((mn)) 注意expr与运算符和变量间要有空格 sum$((mn)) 中与$之间没有空格expr命令对整数型变量进行算术运算(注意运算符前后必须要有空格)[rootqianfeng01 ~]# expr 3 5 [rootqianfeng01 ~]# expr 3 – 5[rootqianfeng01 ~]# echo expr 10 / 3 10/3的结果为3因为是取整[rootqianfeng01 ~]# expr 3 \* 10 \ 是转义符1.5.2. 示例
计算2 3 ×4 的值
1 .分步计算
[rootqianfeng01 ~]# Sexpr 2 3[rootqianfeng01 ~]# expr $S \* 42.一步完成计算
[rootqianfeng01 ~]# expr expr 2 3 \* 4
[rootqianfeng01 ~]# Sexpr \ expr 2 3 \ \* 4
[rootqianfeng01 ~]# echo $S或
[rootqianfeng01 ~]# echo $(((2 3) * 4))1.5.3. {}
$()与${}的区别$( )的用途和反引号一样用来表示优先执行的命令eg: [rootqianfeng01 ~]# echo $(ls /root)${ } 就是取变量了 eg[rootqianfeng01 ~]# echo ${PATH}$((运算内容)) 适用于数值运算eg: [rootqianfeng01 ~]# echo $((31*4))1.6. 字符串
1.6.1. 字符串的脚本用法
- 字符串不能单独出现必须要配合变量。
- 字符串可以使用单引号[ ]也可以使用双引号[ ]也可以不用引号
- 单引号内的任何字符没有任何意义都会原样输出
- 单引号内使用变量是无效的单引号内不能出现单引号
- 双引号内可以使用变量
- 双引号内可以使用转义字符
- 在字符串拼接操作时我们可以进行无缝拼接或者是在双引号里使用变量1.6.2. 字符串的长度
可以使用${#variable} 或者 expr length ${variable}。因为expr是指令所以别忘记使用反单引号或者是$()直接看案例[rootqianfeng01 ~]# vim test3.sh#!/bin/bash
varwelcome to china
length1${#var}
length2$(expr length ${var}) $()写法
length3expr length $var 反单引号写法1.7. Shell数组
1.7.1. 数组的使用规则
- 在/bin/bash这个shell中只有一维数组的概念并且不限定数组的长度。
- 数组的元素下标是从0开始的
- 获取数组的元素要使用下标
- 下标使用不当会报错1.7.2. 数组的定义
定义格式 variable(值1 值2 … 值n)
注意元素之间除了使用空格作为分隔符还可以使用换行符。或者 name[0]值1
name[1]值2
…
name[n]值n1.7.3. 读取数组
${variable[index]} 读取index索引上的元素
${variable[*]}或者${variable[]}读取所有元素
${#variable[*]}或者${#variable[]} : 读取数组的长度
[rootqianfeng01 ~]# vim test3.sh#!/bin/bash
citys(cc sh bj sd hlj)
hobby[0]book
hobby[1]film
hobby[2]musicecho ${citys[0]} cc
echo ${hobby[*]} book film music
echo ${#hobby[]} 3
[rootqianfeng01 ~]# bash test3.sh1.8. test测试命令 通常test命令不单独使用而是与if语句连用或是放在循环结构中 # 表示测试通过的处理逻辑
# || 表示测试不通过的处理逻辑
[rootqianfeng01 ~]# test -e file echo exists || echo not exists判断符号[] 除了好用的test之外我们还可以使用中括号来进行检测条件是否成立 [rootqianfeng01 ~]# [ -r filename ] 检测filename是否有可读权限
[rootqianfeng01 ~]# [ -f filename -a -r filename ] 检测filename是不是普通文件并且有可读权限