【1】链接文件:
1)分类:
硬链接是利用Linux中为每个文件分配的物理编号——inode建立链接。
因此,硬链接不能跨越文件系统。
软链接(符号链接)是利用文件的路径名建立链接。通常建立软链接
使用绝对路径而不是相对路径,以最大限度增加可移植性。
2)命令:
硬链接:ln 原文件 链接文件名
软链接:ln -s 原文件 链接文件名
3)注意:
硬链接:删除或移动目标文件链接依然有效
只能操作普通文件
软链接:删除或移动目标文件链接失效,但是在此创建时链接依然有效
建立软链接使用绝对路径而不是相对路径,以最大限度增加可移植性
【2】shell脚本:
1.本质:
Shell命令的有序集合
2.创建步骤:
1)创建shell脚本文件
touch a.sh
2)修改文件权限
chmod 777 a.sh
3)执行脚本文件
./a.sh
练习:
1)在当前路径下创建file_1到file_5,5个普通文件
2)删除 file_2和file_3文件,(使用通配符)
3)将剩下的file文件用tar压缩成bz2的格式
4)将压缩文件复制到家目录下
5)进入到家目录解压压缩文件
6)删除压缩包
tar -cvf 文件名.tar 要归档的文件
-c:归档
-v:显示过程
-f:必须接文件名,-f参数只能放在参数的最后
-z:借助于gzip工具,打包并压缩 .tar.gz
-j:借助于bzip2工具,打包并压缩 .tar.bz2
-J:借助于xz工具,打包并压缩 .tar.xz
如果借助于压缩文件,对文件进行归档并压缩时,生成的文件名后缀,一定要和参数一致。
-x:万能的拆包和解压缩指令,
tar -xvf 要拆包/解压缩的文件
tar -xzvf .gz ---->拆包并解压缩
tar -xjvf .bz2 ---->拆包并解压缩
tar -xJvf .xz ---->拆包并解压缩
3.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文件中添加的内容
4. shell 程序由零或多条shell语句构成。 shell语句包括三类:说明性语句、功能性语句和结构性语句。
1)说明性语句:
以#号开始到该行结束,不被解释执行
在shell脚本中经常会在第一行写到:#!/bin/bash ,解释如下:第一行的内容指定了shell脚本解释器的路径,而且这个指定路径只能放在文件的第一行。第一行写错或者不写时,系统会有一个默认的bash解释器进行解释。
2)功能性语句:
任意的shell命令、用户程序或其它shell程序。
3)结构性语句:
条件测试语句、多路分支语句、循环语句、循环控制语句等。
【3】功能性语句
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++))
实例:计算表达式值a*b+c-d/b,a=2,b=3,c=15,d=18
要求:
1)从终端读入4个数a,b,c,d
2)进行运算
3)打印结果输出到终端
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是条件语句的语句括号, 必须成对使用;
命令表中的命令可以是一条, 也可以是若干条。
实例:从终端输入3个整数;从小到大排序
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语言
实例:1-10求和运算
4.while..do..done:
格式:
while 命令或表达式
do
命令表
done
while语句首先测试其后的命令或表达式的值,如果为真,就执行一次
循环体中的命令,然后再测试该命令或表达式的值,执行循环体,直到该
命令或表达式为假时退出循环。
5.break和continue:
break:结束本次循环
break n 则跳出n层;
continue:结束本次循环继续下次循环
continue n 则转到最近n层循环语句的下一轮循环上.
【3】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[@]} //计算数组中元素的个数
实例:用冒泡排序实现10个数的从小到大排序