0.shell脚本编程
在正式开始介绍shell编程之前,我们先来简单的了解一下什么是解释型语言和编译型语言。
- 解释型:Java、Python、Shell编程
- 运行时,需要解释器 解释执行
- 特点:跨平台,设计解释器(win-PE格式、Linux-ELF格式)
- 编译型:C、C++
- 直接编译生成二进制指令,可以直接执行
- 特点:运行效率高
Shell 脚本(shell script),是一种为 shell 编写的脚本程序。业界所说的 shell 通常都是指 shell 脚本。shell编程作为解释型语言,shell程序在运行时需要shell提供解释,比如bash解释器。
1.运行 Shell 脚本有两种方法:
- 对写好的shell脚本增加执行权限,直接执行(实际上还是通过shell完成的)
第一种:
chmod u+x my.sh
./my.sh
- 指定解释器执行
第二种:
bash my.sh
2.基本语法:
#!#
#!/bin/bash #指定用/bin/bash作为解释器
echo "Hello World !" #echo 命用于向窗口输出文本
说明:Linux平台不以后缀名区分文件类型,一般shell脚本文件通常取名为 *.sh
此外,作为一个解释型语言shell脚本也只能在Linux等平台运行,就通用而言没有另一款解释型语言Python强。但shell脚本也具有自身的优点,比如在Linux平台上进行批量操作时,或是其他一些对文件的操作时,虽然前者可以手动输入命令执行,后者可以用c语言等的高级编程语言实现,但对于shell脚本或者说shell命令来说也许只要一个命令就可以搞定。
3.变量
nameabcstr
- 命名只能使用英文字母,数字和下划线,首个字符不能以数字开头。
- 中间不能有空格,可以使用下划线(_)。
- 不能使用标点符号。
- 不能使用bash里的关键字(可用help命令查看保留关键字)。
3.1 变量的使用
以下三种赋值方式没有区别
str=hello
str1=“hello”
str2='hello'
$
$$str=$str' '" "
echo str=$str
echo "str=$str"
echo 'str=$str'
保存上述代码,执行
这次我们使用了对文件增加执行权限的方法运行shell脚本程序,可以看到运行结果和我们预期的一致。
3.2 本地变量
readline
echo "input:"
read line
echo "line=$line"
3.3 环境变量
当一个shell脚本程序开始执行时,一些变量会根据环境设置中的值进行初始化。这些变量通常用 ,大写字母做名字,以便把它们和用户在脚本程序里定义的变量区分开来,后者按惯例都用小写字母做名字。具体创建的变量取决于你的个人配置。在系统的使用手册中列出了许多这样的环境变量
环境变量:
| $HOME | 当前用户的家目录 |
|---|---|
| $PATH | 以冒号分隔的用来搜索命令的目录列表 |
| $PS1 | 命令提示符,通常是$字符 |
| $PS2 | 二级提示符,用来提示后续的输入,通常是 > 字符 |
| IFS | 输入域分隔符。当shell读取输入时,它给出用来分隔单词的一组字符,通常是空格、制表符和换行符 |
| $0 | shell脚本的名字 |
| $# | 传递给脚本的参数的个数 |
| $$ | shell脚本的进程号 |
3.4 参数变量:
在要执行脚本程序后跟上相应的参数,在执行脚本时会把相应的参数保存在这些变量中。
| 参数变量 | 说明 |
|---|---|
| $1,$2,$3, ··· | 脚本程序的参数 |
| $* | 在一个变量中列出所有参数,各个参数之间使用环境变量IFS中的第一个字符分隔开 |
| $@ | 是$*的一种精巧的变体,不使用IFS环境变量,使用时加引号,在引号中返回每个参数 |
| $! | 后台运行的最后一个进程的ID号 |
| $- | 显示shell使用的当前选项,与set命令功能相同 |
| $? | 显示最后命令的退出状态,0表示没有错误,其他值表明出现相应错误。 注:在shell脚本函数中,可以使用 $? 获取函数的返回值。 |
测试:
# 环境变量
echo "PATH=$PATH" #目录列表
echo "HOME=$HOME" #家目录
#
echo "\$0=$0" #shell脚本名字
echo "\$#=$#" #传递给脚本名字
echo "\$$=$$" #脚本进程号
# 参数,最多9个
echo "\$1=$1"
echo "\$2=$2"
echo "\$3=$3"
echo "\$9=$9"
保存上述代码,执行
输入参数测试:
$1$9$1=hello$2=world$1$21010{10}
改变解释器提示符:
PS1
PS1='System error: '
PS1PS1
4.多行注释:
<<<
<<EOF
echo hello world!
EOF
5.if条件判断
基本语法:
if [ 条件 ] #以 if 开头,注意用的是 [ ] 而不是我们熟悉的()
then #如果if成立,then
语句:
elif [ 条件 ] #else if 的缩写,这是语法规定,不可以写成else if
then
语句:
else #else
语句:
fi #以 if 开始 以 fi 结束
test[[][
test[
test
test -f
if test -f test_file.txt
then
echo "Find file test_file with the contents:"
cat test_file.txt
else
echo "File not found!"
fi
[
if [ -f test_file.txt ]
echo "Find file test_file with the contents:"
cat test_file.txt
else
echo "File not found!"
fi
效果测试
1.创建测试文件 test_file.txt
2.编写shell脚本,这里可以使用cat命令,**>**以覆盖的方式重定位到文件,输入ctrl+D结束输入。
这里我们用参数来替换文件名:
test 命令整理
test命令可以使用的条件类型可以归为3类:字符串比较、算术比较和与文件有关的条件测试 。
=真!=真-n真-z真
-eq真-ne真-gt真-ge真-lt真-le真!真
-d真-e真-f真-g真-r真-s真-u真-w真-x真
if
123
#!/bin/bash
echo "input:"
read line #读取键盘输入的一行
if [ "$line" = "123" ] #字符串与等号之间留空格,比较字符串相等
then
echo "input==123"
else
echo "input!=123"
fi
exit 0
2.输入数字,比较算数相等
#!/bin/bash
echo "input:"
read line #读取键盘输入的一行
if [ "$line" -eq 10 ] #用 -eq 比较算数相等
then
echo "相等"
else
echo "不相等"
fi
exit 0
6.循环
for
for 条件 #条件满足就执行
do
语句:
done
while
while 条件 #条件满足就执行
do
语句:
done
until
until 条件 #直到条件满足,否则一直执行
do
语句:
done
6.1 编写循环测试实例
i
#!/bin/bash
for i in 1 2 3
do
echo "i=$i"
sleep 1
done
# 写成下面这样也可以
#for((i=1;i<=10;i++))
#{
# echo $i
# sleep 1
#}
exit 0
ls
$(ls)`ls`
#!/bin/bash
# 命令 $(ls) `ls`
#for i in $(ls)
for i in `ls`
do
echo "i=$i"
done
exit 0
while1 = 1:echo hello world
while [ 1 = 1 ] # while [ : ] 或 while [ echo "死循环" ]
do
done
4.在当前目录下寻找a.c文件,如果没找到,一直循环,直到找到为止
#!/bin/bash
until [ -f a.c ]
do
echo "not find a.c"
sleep 1
done
echo "find a.c"
exit 0
a.ca.cfind a.c
6.2 算数运算
letexpr
#!/bin/bash
i=1
let "$i + 1" #取 i的值加一
i=`expr $i + 1` # i赋值为 变量i的值加一
echo $i
exit 0
编写测试实例:
- 循环打印 1~9
#!/bin/bash
i=1
while [ "$i" -lt 10 ]
do
echo "i=$i"
i=`expr $i + 1`
done
exit 0
7.测试实例
7.1 编写一个程序,实现输入成绩(0~100)转换成对应等级(A~E)
#!/bin/bash
# 输入成绩显示等级 A~E
echo "请输入成绩(0~100)"
read line
if [ $line -ge 0 ] && [ $line -lt 60 ]
then
echo "E 不及格"
elif [ $line -ge 60 ] && [ $line -lt 70 ]
then
echo "D 及格"
elif [ $line -ge 70 ] && [ $line -lt 80 ]
then
echo "C 良好"
elif [ $line -ge 80 ] && [ $line -lt 90 ]
then
echo "B 优秀"
elif [ $line -ge 90 ] && [ $line -le 100]
then
echo "A 非常优秀"
else
echo "输入成绩错误"
fi
exit 0
7.2 实现简单的密码验证检测机制,即,连续输入三次错误,视为登录失败。
#!/bin/bash
# 密码检测,三次输入检测机制
echo "input passwd:"
i=0
while [ $i -lt 3 ]
do
read passwd
if [ $passwd = "wq" ] #默认密码 wq
then
echo "密码正确"
break
else
echo "密码错误,请重新输入"
fi
let "i+=1"
continue
done
if [ $i -eq 3 ]
then
echo "错误次数过多,登录失败"
fi
exit 0