Linux软件包安装
二进制软件包管理:RPM与YUM
RPM软件包例子:jdk-7u80-linux-x64.rpm
其中包括软件名(jdk),版本号(7u80),适用平台(linux-x64)
RPM管理
1、卸载
# rpm -e jdk
注:如果其他软件包有依赖关系,卸载时会产生提示信息,可使用--nodeps强行卸载
2、安装
# rpm -ivh jdk-7u80-linux-x64.rpm
3、查询是否安装
#rpm -q jdk
#rpm -qa | grep jdk 列出所有已经被安装的,名字中包含jdk字符串的RPM包
|表示将输出结果转向到后面的命令处理,grep jdk表示在当前结果搜索包含jdk字样的字符串
其他选项:
--excludedocs
不安装软件包中的文档文件
--prefix path
将软件包安装到由path指定的路径下
--test
只对安装进行测试,并不实际安装
安装常见问题:
情况1 软件包已经被安装
#rpm -ivh jdk-7u80-linux-x64.rpm
提示:package jdk-7u80-linux-x64.rpm is already installed
如果想覆盖此软件包,可以在命令行上使用--replacepkgs选项
情况2:文件冲突
#rpm -ivh jdk-7u80-linux-x64.rpm
提示:conflicts with file from ... Connot be installed
如果想让rpm忽略该错误信息,可以在命令行上使用--replacefiles选项
情况3:未解决依赖关系
rmp软件包可能依赖于其他软件包,在安装了特定的软件包才能安装该软件包
提示:failed dependencies .... ls needed by ....
你必须安装完所依赖的软件包,才能解决这个问题,或者使用--nodeps选项强制安装
情况4:升级
#rpm -Uvh jdk-7u80-linux-x64.rpm
YUM包管理
应用yum的优势:
(1)自动解决软件包的依赖关系
(2)方便软件包升级
安装 yum install
检测升级 yum check-update
升级 yum update
软件包查询 yum list
软件包信息 yum info
卸载 yum remove
帮助 yum -help、 man yum
4、查询
-a 查询所有已安装的软件包
-f 查询文件所属软件包
-p 查询软件包
-i 显示软件包信息
-l 显示软件包中的文件列表
-d 显示被标注为文档的文件列表
-c 显示被标注为配置文件的文件列表
rpm查询都有q 如rpm -qf
软件包文件提取
解压所有文件到当前目录
Rpm2cpio 软件包 | rpio -idv
解压制定文件到当前目录
Rpm2cpio 软件包 | cpio -idv ./etc/inittab
----------------------------------------------------------------------------------
Shell脚本编程
Shell概念:
一、Shell是一个用C语言编写的程序,这个应用程序提供了一个界面,用户通过这个界面访问操作系统内核的服务。Ken Thompson的sh是第一种Unix Shell,Window Explorer 是一个典型的图形界面Shell。
二、Shell脚本
是一种为shell编写的脚本程序。业界所说的shell通常都是指shell脚本,shell和shell script是两个不同的概念。
Shell环境:
Shell编程和java、php编程一样,只要有一个能编写代码得文本编辑器和一个能解释执行的脚本解释器就可以了。
Linux的Shell种类众多,常见的有:
(1) Bourne Shell (/usr/bin/sh或bin/sh)
(2) Bourne Again Shell (/bin/bash)
(3) C Shell (/usr/bin/csh)
(4) K Shell (/usr/bin/ksh)
(5) Shell for Root (/sbin/sh)
注:一般情况下,人们并不区分Bourne Shell 和Bourne Again Shell,所以想#!bin/sh,他同样也可以改为#!/bin/bash。#!告诉系统其后路径所指定的程序即是解释此脚本文件的Shell程序。
Shell程序步骤
1、创建一个文件,扩展名为.sh
2、修改文件的权限为可执行文件
3、执行
Shell结构
1、#!用来指定执行脚本的Shell
2、#注释
3、命令和控制结构
Shell变量:
命名规则:
1、命名只能使用英文字母,数字和下划线,首个字符不能以数字开头
2、中间不能有空格,可以使用下划线(_)。
3、不能使用标点符号
4、不能使用bash里的关键字(可用help命令查看保留关键字)
使用规则:
1、习惯用大写字母来命名变量
2、赋值时,“=”前后不能有空格
3、命令的执行结果赋值给变量时使用返单引号 如:TIME=`date`
4、使用变量时,使用$变量名/${变量名}
只读变量:使用readonly,此命令可以将变量定义为只读变量,只读变量的值不能被改变
删除变量:使用unset,变量删除后不能再次被使用,unset不能删除只读命令。
变量类型:
①临时变量:也叫局部变量,在脚本或命令中定义,仅在当前shell实例中有效,其他shell启动的程序不能访问局部变量。
②永久变量:也叫环境变量,所有的程序,包括shell启动的程序,都能访问环境变量,有些程序需要环境变量来保证其正常运行,必要的时候shell脚本也可以定义环境变量。
Shell字符串(可以用单引号也可用双引号)
单引号:
(1)单引号里的任何字符都会原样输出,单引号字符串中的变量是无效的;
(2)单引号字串中不能出现单引号(对单引号使用转义符后也不行)。
双引号:
(1)双引号里可以有变量
(2)双引号里可以出现转义字符
一、拼接字符串
两种方式:
1、无缝拼接
2、双引号内直接使用变量
二、获取字符串长度
语法1:${#name}
语法2:expr length ${name}
三、提取子字符串
语法: ${name:startindex:length}
${name:startindex}
${name:0-index:length}
${name:0-index}
注:还可以使用#、##、%、%%进行删除后保留子串
#、##:表示从左边开始删除。
#:表示从左边删除到第一个指定的字符;
##:表示从左边删除到最后一个指定的字符。
%、%%:表示从右边开始删除
%:表示从右边删除到第一个指定的字符;
%%:表示从右边删除到最后一个指定的字符。
注:删除包括指定的字符本身
从左边删除不知道左边的个数所以*加指定字符,右边删除不知道右边
的个数,指定字符加*
${url#*.}
${url%.*}
四、查找子字符串:
使用命令expr(使用改命令加` `)
ex: url="this is a good man"
index=`expr index "${url}" is`
echo $index -----输出2
Shell数组
使用规则
1、bash仅仅支持一维数组,并且没有限定数组的大小。
2、数组元素的下标从0开始。
3、获取数组中的元素要利用下标
4、下标使用不当,会报错
一、定义数组
语法1:arrayName=(值1 值2 ... 值n)
语法2:arrayName=(
值1
值2
..
值n
)
注意:元素间使用空格分隔开或者换行符
或者直接定义数组的各个元素
name[0]=值1
name[1]=值2
...
name[n]=值n
二、读取数组
格式:${name[index]}
三、获取数组所有元素
格式:${name[*]}或{name[@]}
四、获取数组长度
格式:${#name[*]}或{#name[@]}
Shell解释用户执行的命令时,会将命令行的一串字符进行解析划分成部分。每个部分都有一个固定的变量名$n,不能自定义。
$n: n从0开始,依次往后+1。从$1开始 叫位置参数变量。大于等于10时,必须使用{}将数字括起来
Ex:ls –la file1 file2 file3 ….. file10
$0 的值为:ls -la
$1 的值为file1
…….
${10} 的值为file10
$* 获取所有参数,合并一个字符串
$# 参数个数
$$ 当前进程ID
$! 后台运行的最后一个进程的ID
$? 显示最后一个命令的退出状态。0表示没有错误
Shell命令
一、read命令
从键盘读取数据,赋值给变量 Ex: read username
注:当输入的词组个数大于需要的参数个数,则多出的词组将被作为整体为最后一个参数接收。
Ex: read –p “请输入密码:” –n 6 -t 5 password
echo -e “\npassword is $password”
参数说明:
-p:输出提示文字
-n 输入字符串长度,达到此长度,自动结束
-t 输入限制时间
-s 隐藏输入内 -e 处理特殊字符
二、expr命令
对整数型变量进行算术运算
Ex: 复杂计算:
expr 3 + 5 expr ` expr 5 - 1` / 2
expr 3 \* 5 num=` expr $var / 2`
三、echo命令
用于字符串的输出显示
echo $var
echo It is a test file
开启转义 : -e
echo -e “ hello \n world”
echo -e “hellokitty \c”
\n #换行
\c #不换行
四、printf命令 (注:在此命令中转义时要加双引号否则无效)
与echo功能相同,用来输出,功能更强大,如格式化字符串,指定字符串的宽度,左右对齐
方式,默认不换行,可以手动添加\n
语法:
printf format-string [arguments……...]
说明:
format-string: 格式控制字符串
arguments: 参数值列表
%d %s %c %f 格式替代符详解:
d: Decimal 十进制整数 -- 对应位置参数必须是十进制整数,
否则报错!
s: String 字符串 -- 对应位置参数必须是字符串或者字符型,
否则报错!
c: Char 字符 -- 对应位置参数必须是字符串或者字符型,否则
报错!
f: Float 浮点 -- 对应位置参数必须是数字型,否则报错!
Ex:
printf “HelloWorld” #不会换行
printf “HelloWorld\n” #才会换行
printf “%-20s %-16s %-8s\n” 姓名 性别 体重
printf “%-20s %-16s %-8.2f\n” 张三 男 45.1234
printf “%-20s %-16s %-8.2f\n” 李四 男 76.5678
printf “%-20s %-16s %-8.2f\n” 王五 女 40.6543
Ex:
printf “%d %s\n” 1 “abc”
printf %s abcdef
printf %s abc def #此格式只指定了一个参数,但是多出的参数仍然会按照该格式输出,格式被重用
printf “%s %s %s\n” a b c d e f g h I j
结果:a b c
d e f
h i j
printf “%s and %d” #没有参数时,%s为空,%d为0
\b:推格
\f:换页显示
\n:换行
\r:回车
\t:水平制表符
\v:垂直制表符
\\:转义斜杠
五、test命令(用于测试变量是否相等,是否为空、文件类型等)
格式:test 测试条件
测试范围:整数测试、字符串测试、文件测试
整数测试
test v1 -eq v2 测试两个数是否相等
test v1 -gt v2 测试是否 v1>v2
test v1 -ge v2 测试是否 v1>=v2
test v1 -lt v2 测试是否 v1
test v1 -ne v2 测试两个数是否不相等
字符串测试
test str1 = str2 测试字符串是否相等
test str1 != str2 测试字符串是否不相等
test str1 测试字符串是否不为空
test -n str1 测试字符串是否不为空
test -z str1 测试字符串是否为空
文件测试
test -d file 指定文件是否目录
test -f file 指定文件是否是常规文件
test -x file 指定文件是否可执行
test -r file 指定文件是否可读
test -w file 指定文件是否可写
test -a file 指定文件是否存在
test -s file 文件的大小是否非0
注1:通常test命令不单独使用,而是与if语句连用
注2:使用中括号代替test,中括号两边及逻辑都需要空格空开
使用i++这等,需要使用let "i++",将这个字符串运行
列表用集合表示{1..100}
流程控制语句
一、if-else分支结构
if 条件1
then 逻辑块(通常都是命令)
elif 条件2
then 逻辑块
else 逻辑块
fi
写成一行:适用于终端
if 条件;then 逻辑;fi
1、分支结构也可以进行嵌套
2、多个条件联合
-a 逻辑与 当两个条件都成立时,结果为true
-o 逻辑或 两个条件只要有一个成立,结果为真
二、case多选择语句
Case语句会匹配一个值和一个模式,匹配成功,执行相应逻辑块
语法:
case 值 in
模式1) 逻辑块
;;
模式2) 逻辑块
;;
esac
三、for循环结构
格式:
for 变量 in 名字表
do 逻辑
done
写成一行:
for 变量 in 列表;do 逻辑; done;
Ex:
for day in Sunday Monday Tuesday
WednesDay Thursday Friday SaturDay
do
echo “The day is:$day”
done
四、select表单循环
语法:
select 变量 in 列表
do
逻辑块
done
写成一行:
Select 变量 in 列表;do 逻辑 ; done;
五、while循环
语法:
while 条件
do
逻辑块
done
六、无限循环
语法:
while :
do
逻辑块
done
或
while true
Do
逻辑块
done
七、until循环(执行逻辑直到ture时停止)
util 条件
do
逻辑块
done
八、break与continue
如果想要提前结束循环(即想跳出循环)使用关键字break
如果想结束当次循环,进行下一次循环使用关键字continue
九、shift指令
作用:
参数左移,每执行一次,参数序列顺次左移一个位置,$#的值少一个,多数用于分别处理每一个参数,移出去的参数不再可用
函数应用
语法:
[function] functionName()
{
逻辑
}
调用时,不带()
说明:
1、关键字function,可以忽略不写
2、return关键字,可加可不加,看需求
(1)加: 返回值只能是0~255的数字
(2)不加: 最后一条命令结果作为返回值
注意:
1、 函数内的变量,都是全局变量(整个脚本都可以使用)
2、函数的参数: 调用函数时,可以向函数中传递参数,必须通过$n的形式来获取参数的值。
注:在给函数传递参数时,必须在调用是传递 method $1 $2
Shell输出/输入重定向
通常情况下: 系统命令会从你的终端接收输入数据,再将需要输出的信息发送给你的终端。
有时:我们可能会需要指定 输入的位置,或者指定输出的位置,这就是”重定向”的概念。
Shell文件引入外部脚本
概念:
Shell脚本内部也可以引用其他外部脚本这样可以很方便的封装一些公用的代码作为一个独立的文件。
Shell脚本引用外部脚本语法如下:
. fileName # .与文件之间一定要有空格(. 脚本路径) 或者 source fileName
Shell脚本调试
1、sh -x script
这将执行该脚本并显示所有变量的值
2、sh -n script
不执行脚本只是检查语法的模式,将返回所有语法错误
awk命令应用
awk -F 域分隔符 ‘命令’
示例:
1、检测系统中UID为0的用户
awk –F: ‘$3==0 {print $1}’ /etc/passwd
2、检测系统中密码为空的用户
awk –F: ‘length($2)==0 {print $1}’ /etc/shadow