本文全是自己积累的基础知识,如果有不正确的地方请指正
Linux 通过网络传输文件:scp 本机文件路径 另一台Linux账户@ip:端口号:文件存放位置
一,初步了解
1,echo 输出信息 加入参数-e后可以实现字符转义
2,第一个脚本:
vi hello.sh
#!/bin/Bash ----------->此处不是注释,是一个标识,标识以下所写为shell程序,这个不可以省略
#The first program ----------->此处的为注释,包括以后的#标识的都是注释
#The first program
#Author:Renpengying(QQ:954507155)
echo -e "wo ren peng ying is the most clearver man in the Team\!"
3,关于脚本执行:
1,赋予执行权限直接运行
chmod 755 hello.sh
./hello.sh [.] +shell脚本的绝对路径
2,通过Bash调用执行脚本 bash hello.shell
4,dos2unix shell脚本名称,可以实现:将window上编写的shell脚本进行格式转换使其可以在Linux上执行
5,每一个用户所敲过的命令:history 后跟参数[-c]可以进行清除,默认保存1000条,这个限制可以修改vim /etc/profile 修改HISTSIZE
6,不论是命令,还是文件名再输入时可以按Tab键进行补全,如果有多个是无法显示的,连续按两次Tab键,可以把他们全部列出来
7,命令的别名和常用快捷键
给命令起别名:alias 新的命令名称='系统的命令'例子:alias rm = 'rm -i' 删除别名:unalias
alias 定义的别名命令的执行优先级高于bash中命令的命令优先级和环境变量中定义的优先级
8,输出重定向:可以用>,>>执行:命令 > 文件 可以将命令的输出结果保存到文件中【>】是覆盖【>>】是追加,错误输出是在【>或>>】前加2
把正确输出和错误输出同时保存的命令:命令 &>> 文件 覆盖或追加通过控制【>】个数即可
9,wc 统计键盘输入用法:wc 回车 输入内容 ctrl+d 统计单词个数,字符个数以及行数
9-1,输入重定向:命令 < 文件
10,多命令顺序执行
多命令执行符:【;】 格式:命令1;命令2 多个命令顺序执行,不论是否出错(不止可以是两个)
多命令执行符:【&&】 格式:命令1&&命令2 多个命令之间有逻辑关系 只有1执行正确2才会执行
多命令执行符:【||】 格式:命令1||命令2 多个命令之间有逻辑关系 只有1执行出错2才执行
判断一个命令正确执行:命令&&echo yes || echo no 分析:命令正确执行与逻辑执行输出yes,命令错误与逻辑不执行,走到或逻辑,由于前命令(输出yes的命令)出错所以执行输出no
11,管道符:| 用法:用于连接命令,前命令的正确执行结果作为后命令的操作对象
精妙用例:对于文件非常多的文件夹在查看时很麻烦,但是more只能操作文件,所以可以通过管道符,将ls -a 的命令执行结果通过more以查看文件的形式展示
ls -la /etc/ | more 回车即可
但是管道符后命令执行的前提,必须前命令正确执行
12,grep 参数 "搜索内容" 文件名 可选参数:-i忽略大小写 -n输出行号 -v反向查找
13,通配符:【?】匹配任意一个字符 【*】匹配任意个任意字符 【[]】匹配中括号中的任意一个字符 【[^0-9]】匹配一个非数字的字符
14,bash中的其他特殊符号:单引号中的所有字符都没有特殊意义,双引号中特殊字符是有特殊意义的,反引号【`】反引号括起来的内容是系统命令
$() 和反引号的作用一样,用来调用系统命令
# 在shell脚本中,#开头的行代表注释,第一行除外
$ 用于调用变量的值
\ 转义符,让特殊符号失效,当作普通字符
15,bash变量,定义变量由字母数字下划线组成首字母不能为数字,所有的变量默认都是字符串类型
变量用等号连接之间不能有空格
变量叠加:变量名a="$变量名a"asdasd 这里基本上可以理解为还是利用了$的用于调用变量的值,然后拼接保存
用此方法可以实现环境变量path的路径添加(临时的,永久的需要写入配置文件):PATH="$PATH":新的脚本路径
在linux中环境变量用【:】分隔
16,环境变量配置:
申明变量:export 变量名=变量值
查询变量:env
删除变量:unset 变量名
17,位置参数变量:
$n n为数字,$0代表命令本身 $1 $2....$9 代表这条命令后的第n(1-9)个参数,第10个及以上的参数需要用大括号${10}
$* 这个变量代表命令行中所有的参数,把后面整个的所有参数看成一个整体
$@ 这个变量代表命令行中所有的参数,把后面的每一个参数区分对待
$# 这个变量代表命令行中所有的参数,返回参数的个数
18,预定义变量
$? 最后一次执行的命令的返回状态。如果那个命令正确执行,则这个变量的值为0否则为非0具体是几由错误信息决定
$$ 当前进程的进程号(PID)
$! 后台运行的最后一个进程的进程号(PID)
19,接受键盘输入:read 参数 变量名
参数:-p "提示信息" 在等待read输入时,输出提示信息
-t 秒数 指定等待用户输入的等待时间
-n 字符数 read命令只接受指定的字符数,就会执行
-s 隐藏输入的数据,适用于机密信息的输入
20,数值运算与运算符,在linux中声明的变量,默认是字符串类型
1),declare 声明变量类型:declare [+/-][参数] 变量名
其中 -参数 给变量设置类型 + 取消变量类型
-i 将变量申明为整数类型(integer) -x 将变量申明为环境变量 -p 显示指定的变量的被申明的类型
2)$((运算式)) 或 $[运算式] 也可以进行运算
例如:cc=$(($aa + $bb)) 这样就可以将两个数进行相加
21,测试变量是否存在:
x=${y-新值} 如果x=新值 则变量y不存在,x为空则y为空 否则x等于y的值
22,环境变量配置文件
1,source 命令:source 配置文件 作用:让配置文件立即生效
23,Shell登录信息
本地终端登录信息:etc/issue文件
\d 显示当前系统日期 \s 显示操作系统名称
\l 显示登录的终端号,常用 \m 显示硬件结构
\n 显示主机名 \o 显示域名
\r 显示内核版本 \t 显示当前系统时间
-----------------------------------------重点shell编程知识---------------------------------------
24,正则表达式:(正则是包含匹配,通配符是完全匹配)
注意【*】代表前一个字符出现任意次,不是任意字符【.】匹配出换行外的任意字符 【\{n\}】匹配前一个字符出现n次n为数字
例子:【.*】匹配任意字符
25,字符截取命令:
grep 正则规则 文件 获取文件中符合匹配要求规则的行
cut 参数 文件 根据参数提取文件中的列,cut -f 2,3 文件 提取文件的第2和3列(也可以通过参数-d指定分隔符)
cut在遇到空格分隔时无效,必须要制表符或特定符号分隔
26,sort 文件 可以给文件内容进行排序 加 -r 参数可以反向排序
27,判断式:-d 文件是否存在且是否为目录 -f文件是否为普通文件 -e 文件是否存在
-z 判断变量是否为空 例子: [ -d /etc/passwd ] 注意,中括号里面表达式前后有空格
== 用于判断字符串是否相等
两个整数之间比较:
整数1 -eq 整数2 判断整数1与整数2是否相等,相等为真
整数1 -ne 整数2 判断整数1与整数2是否不等,不等为真
整数1 -gt 整数2 判断整数1是否大于整数2,大于为真
整数1 -lt 整数2 判断整数1是否小于整数2,小于为真
大于等于:-ge
小于等于:-le
28,多重条件判断
判断1 -a 判断2 两个判断都成立才为真
判断1 -a 判断2 两个判断有一个为真就为真
29,条件判断语句:
if语句:
if [ 条件判断式 ]
then
程序
else
程序(条件判断为false)
fi
30,多分支if条件语句
if [ 条件判断 ]
then
程序
elif [ 条件判断2 ]
then
程序
fi
当对用户输入进行判断,所输入不符合程序要求需要程序终止:exit n
exit 跳出程序 n为数字,返回执行结果 可以通过 $? 查询
31,for循环1
for 变量 in 值1 值2 值3
do
程序
done
每次循环将后面值得集合中的数据依次传给变量,然后再程序中操作变量
for循环2
for((初始值;循环控制条件;变量变化))
do
程序
done
32,Linux系统定时执行shell脚本
实现方法:
crontab -e //这样可以以编辑的方式打开个人的crontab配置文件
以下是 crontab 文件的格式:
{minute} {hour} {day-of-month} {month} {day-of-week} {full-path-to-shell-script}
对应数值区间 0-59 0-23 0-31 1-12 0-7
例如:已经写好一个启动apache服务的shell
在xshell中执行: crontab -e
然后在文件中写入 0 0 * * * shell所在位置(shell首先得具有执行权限)
“*”代表取值范围内的数字,
“/”代表”每”,
“-”代表从某个数字到某个数字,
“,”分开几个离散的数字
新增:
1字符串切割:${字符串变量%/*} 删除字符串从右起第一个【/】及后面的字符
测试指定IP的指定端口是否可以连通:
nc -v -w 1 IP -z 端口
修改指定行的文件内容:
sed -i '3a XXXX' 文件
Linux自动交互式脚本: expect 详情参考:http://www.cnblogs.com/autopenguin/p/5918717.html
#!/usr/bin/expect 该行在脚本的第一行,告知操作系统用expect作为shell执行脚本
set timeout 设置超时时间,为-1时永不超时,其他值则代表每一条指令最大等待时长的秒数
spawn 以子进程的方式,开启执行一条命令,该命令是在expect环境下才可执行
expect 此命令也是在expect环境下才可执行,用于判断spawn所执行的命令的输出结果是否为指定的字符串(没有输出时会等待,等待时长为设置的timeout时长)
send 用于与spawn开启的子进程命令进行交互,传递子进程继续的下一步操作
interact 通俗讲就是关掉spawn子进程继续脚本往下执行,该命令可以由 expect eof,这两个命令一般必须有,否则影响send使用,网上常用expect eof
exp_continue 附加在摸个expect判断项之后,可以使该项被匹配后继续该expect判断语句内的其他项
传递参数:[lindex $argv n] n为参数组的下标,用法示例:
set canshu [lindex $argv 0] 获取传递的第一个参数
脚本的执行方式:./脚本 bash 脚本执行是错误的
交互式脚本需要先进性expect命令的安装:(有环境可以直接yum的可以直接yum安装)
需要先安装编译环境gcc
wget http://nchc.dl.sourceforge.net/sourceforge/tcl/tcl8.4.11-src.tar.gz
tar xfvz tcl8.4.11-src.tar.gz
cd tcl8.4.11/unix
./configure --prefix=/usr/tcl --enable-shared
make
make install
将该目录下的tclUnixPort.h 复制到 外一级的同级目录generic中
下载exoect源码包
http://sourceforge.net/projects/expect/files/Expect/5.45/expect5.45.tar.gz/download
tar xzvf expect5.45.tar.gz
cd expect5.45
./configure --prefix=/usr/expect --with-tcl=/usr/tcl/lib --with-tclinclude=../tcl8.4.11/generic
make
make install
ln -s /usr/tcl/bin/expect /usr/expect/bin/expect
cp /usr/expect/bin/expect /usr/bin/