目录
一、什么是shell脚本
shell脚本简单来说就是Shell命令的有序集合。Shell是一个命令行解释器,它为用户提供了一个向Linux内核发送请求以便远程远程程序的界面系统级程序,用户可以用Shell来启动、挂起、停止甚至是编写一些程序。
换句话说,shell 脚本是使用 shell 的功能编写的程序。该程序使用纯文本文件,在其中写入一些 shell 语法和指令,然后使用常规符号、管道命令和数据流。
二、shell脚本的使用
1.首先创建脚本文件
终端指令为:
touch a.sh
这里新建一个命名为a的脚本文件(.sh)
shell文件内部,可以写入命令,该命令可直接在终端运行。
2.修改文件权限为777
终端指令为:
chmod 777 a.sh
3.执行脚本文件
终端指令为:
./a.sh
这里简单写一个小脚本,该脚本实现将固定文件直接编译运行。
a.sh
#!/bin/bash
gcc text.c -o text
./text
text.c
#include<stdio.h>
int main()
{
printf("kira\n");
printf("111\n");
return 0;
}
终端执行结果:
三、shell变量
Shell允许用户建立变量存储数据,但不支持数据类型(整型、字符、浮点型),
将任何赋给变量的值都解释为一串字符。
1)用户自定义变量
在shell编程中通常使用全大写变量,方便识别
变量的调用:在变量前加$
Linux Shell/bash从右向左赋值
使用unset命令删除变量的赋值
2)预定义变量
$0 与键入的命令行一样,包含脚本文件名
$1,$2,……$9 分别包含第一个到第九个命令行参数
${10}, ${11} 打印第十个、十一个命令行参数
$# 包含命令行参数的个数(不包含脚本文件)
$@ 包含所有命令行参数:“$1,$2,……$9”
$? 包含前一个命令的退出状态(0为真 1为假)
$* 包含所有命令行参数:“$1,$2,……$9”
3)环境变量
一般是指在操作系统中用来指定操作系统运行环境的一些参数,如:临时文件夹位置和系统文件夹位置等。
HOME: /etc/passwd文件中列出的用户主目录
PATH :shell搜索路径;比如交叉编译工具的安装使用,在/etc/bash.bashrc文件中添加的内容。
四、shell文件的构成
shell语句包括三类:说明性语句、功能性语句和结构性语句。、
1)说明性语句:
以#号开始到该行结束,不被解释执行
在shell脚本中经常会在第一行写到:#!/bin/bash ,解释如下:第一行的内容指定了shell脚本解释器的路径,而且这个指定路径只能放在文件的第一行。第一行写错或者不写时,系统会有一个默认的bash解释器进行解释。
2)功能性语句:
任意的shell命令、用户程序或其它shell程序。
3)结构性语句:
条件测试语句、多路分支语句、循环语句、循环控制语句等。
五、shell里的功能语句
1.read
read var1 var2 var3
把读入行中的第一个单词(word)赋给var1, 第二个单词赋给var2,
……把其余所有的词赋给最后一个变量.
2.expr
算术运算命令expr主要用于进行简单的整数运算,包括加(+)、
减(-)、乘(\*)、整除(/)和求模(%)等操作。
如:
$ expr 12 + 5 \* 3
$ sum=`expr 2 \* 6 `
$ echo $sum
注意
1)不能直接使用(),如果使用需加上\(\),用作转意,如expr /( 3 + 3 /) / 3
2)运算符和数字之间需要加上空格,如果有括号括号前后也有空格
3)实现自加运算:
a=`expr $a + 1` 或 ((a++))
3.test
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 是否为普通文件
-e name 测试文件是否存在
4.结构性语句
1.if…then…fi
1)基本结构:
if 表达式
then
命令表
fi
2)多层结构:
if 表达式1
then
命令表1
elif 表达式2
then
命令表2
fi
3)嵌套结构:
if 表达式
then
命令表1
else
if 表达式
then
命令表
fi
fi
注意:
如果表达式为真, 则执行命令表中的命令; 否则退出if语句,
即执行fi后面的语句。
if和fi是条件语句的语句括号, 必须成对使用;
命令表中的命令可以是一条, 也可以是若干条。
2.case...esac
case 字符串变量 in
模式1)
命令表1
;;
模式2)
命令表2
;;
……
模式n)
命令表n
;;
esac
注意:
1)case语句只能检测字符串变量
2)命令表以单独的双分号行结束,退出case语句
3)模式 n常写为字符* 表示所有其它模式
4)case匹配项中可以存在多个模式,每种模式之间用|隔开
3.for..do..done
格式:
for 变量名 in 单词表
do
命令表
done
变量依次取单词表中的各个单词, 每取一次单词, 就执行一次
循环体中的命令. 循环次数由单词表中的单词数确定. 命令表中的
命令可以是一条, 也可以是由分号或换行符分开的多条。
for语句的几种书写格式:
1)for i in 1 2 3 4 do....done :
变量i从单词表中取值
2)for i do...done:
变量i从命令行取值,可以省略in 单词表
3)for i in {1..10} do...done:
变量i从1-10个数中取值
4)for ((i = 0; i < 10; i++)) do...done:
书写格式类似c语言
5.shell数组
1)数组的赋值
a.array=(10 9 8 7 6 5)
b.array=($1 $2 $3...)
c.read a b c
array=($a $b $c)
d.read -a array
2)数组的调用
${array[i]} //数组下标从0开始到n-1结束
array[i]=3 //对数组元素重新赋值
${array[@]} //遍历数组
${#array[@]} //计算数组中元素的个数
6.关于shell脚本的使用
练习1:使用shell脚本完成如下操作
1)在当前路径下创建file_1到file_5,5个普通文件
2)删除 file_2和file_3文件,(使用通配符)
3)将剩下的file文件用tar压缩成bz2的格式
4)将压缩文件复制到家目录下
5)进入到家目录解压压缩文件
6)删除压缩包
shall指令:
#!/bin/bash
rm file_*
touch file_1
touch file_2
touch file_3
touch file_4
touch file_5
rm file_2
rm file_3
tar -cvjf file.tar.bz2 file_*
cp file.tar.bz2 ~/23021/
cd ~/23021/
tar -xjvf file.tar.bz2
rm file.tar.bz2
练习2:用shell实现计算器功能
计算表达式值a*b+c-d/b,a=2,b=3,c=15,d=18
要求:
1)从终端读入4个数a,b,c,d
2)进行运算
3)打印结果输出到终端
#!/bin/bash
read a b c
case $b in
+)
echo $a $b $c "=" `expr $a + $c`
;;
-)
echo $a $b $c "=" `expr $a - $c`
;;
\*)
echo "$a $b $c = `expr $a \* $c`"
;;
/)
echo $a $b $c "=" `expr $a / $c`
;;
*)
echo "error"
;;
esac
注意其中case里面乘法部分,\*会被认为是打印所有的文件名,故要使用双引号将其限制。
练习3:用shell实现比较三个数的大小
从终端输入3个整数;从小到大排序
做法一:
用if嵌套
#!/bin/bash
read a b c
if test $a -eq $b
then
if test $a -eq $c
then
echo "三者相等"
elif test $a -gt $c
then
echo $c $b $a "其中ab相等"
else
echo $b $a $c "其中ab相等"
fi
fi
if test $b -eq $c
then
if test $a -eq $c
then
echo " "
elif test $a -gt $c
then
echo $c $b $a "其中bc相等"
else
echo $a $b $c "其中bc相等"
fi
fi
if test $a -eq $c
then
if test $b -eq $c
then
echo " "
elif test $b -gt $c
then
echo $c $a $b "其中ac相等"
else
echo $b $a $c "其中ac相等"
fi
fi
if test $a -gt $b
then
if test $b -gt $c
then
echo $c $b $a
fi
if test $c -gt $a
then
echo $b $a $c
fi
if test $c -gt $b
then
if test $a -gt $c
then
echo $b $c $a
fi
fi
fi
if test $b -gt $a
then
if test $a -gt $c
then
echo $c $a $b
fi
if test $c -gt $b
then
echo $a $b $c
fi
if test $c -gt $a
then
if test $b -gt $c
then
echo $a $c $b
fi
fi
fi
做法二:引入中间变量
#!/bin/bash
read a b c
if [ $a -gt $b ]
then
t=$a
a=$b
b=$t
fi
if [ $a -gt $c ]
then
t=$a
a=$c
c=$t
fi
if [ $b -gt $c ]
then
t=$b
b=$c
c=$t
fi
echo $a $b $c
练习4:用shell实现1-10求和运算
方法一:使用for实现
#!/bin/bash
for i in 1 2 3 4 5 6 7 8 9 10
do
sum=`expr $sum + $i`
done
echo $sum
方法二:使用while实现
#!/bin/bash
i=1
sum=0
while [ $i -lt 11 ]
do
sum=`expr $sum + $i`
((i++))
done
echo $sum
练习5:用shell实现冒泡排序
用冒泡排序实现10个数的从小到大排序
#!/bin/bash
arr=()
a=0
for ((;;))
do
read arr[a]
((a++))
if [ $a -eq 10 ]
then
break
fi
done
i=0
j=0
for((i=0;i<10;i++))
do
for((j=0;j<10-i;j++))
do
a=`expr $j + 1`
#echo $a
if [[ ${arr[j]} -gt ${arr[a]} ]]
then
t=${arr[$j]}
arr[j]=${arr[$a]}
arr[a]=$t
fi
done
done
echo ${arr[@]}