linux 基础篇
- 查看linux 支持的shell cat /etc/shells
- 历史记忆功能
!number 执行历史命令
!find 执行上一个以find 开头的命令
!$ 上一条命令的最后一个参数
!+ctrl 上一个命令的第一个参数
!! 执行上一个命令
ctrl +r 检索历史命令
- 快捷键
ctrl+【
R 检索历命令
D 相当于exit
A 光标移动到行首
E 光标移动到行尾
L 清空屏幕
U 撤销输入
K 撤销当前光标到行尾内容
W 擦除光标前的单词
Y 粘贴擦除的文本
S 暂停该终端
Q 恢复该终端
P 查看上一个命令
N 查看下一个命令
C 中断前台任务
Z 挂起前台任务 fg/bg 恢复前台后台任务】
前后台作业控制
&、nohup、^C、^Z、bg %1、fg %1、kill %3、screen
输入输出重定向
0,1,2 >
>>
2>
2>>
2>&1 &
cat < /etc/hosts
cat >file1 <<EOF
管道|tee 输出到多个文件
ip addr |grep 'inet ' |tee test |grep eth0 覆盖
ip addr |grep 'inet ' |tee -a test |grep eth0 -a 追加
命令排序 ;隔开 && 前一条命令执行成功才执行下一个 || 前一条命令执行失败执行
shell 通配符
- 匹配任意多个字符ls in* rm -rf * rm -rf .pdf find / -iname "-eth0"
? 匹配任意一个字符touch love loove live l7ve; ll l?ve
[] 匹配括号中任意一个字符[abc] [a-z] [0-9] [a-zA-Z0-9] [^a-zA-Z0-9] ll l[io]ve ll l[^a-z]ve ll
/dev/sd[a-z]
() 在子shell 中执行(cd /boot;ls) (umask 077; touch file1000)
{} 集合touch file{1…9}
mkdir /home/{111,222} mkdir -pv /home/{333/{aaa,bbb},444}
\ 转义符 回归本意
echo
echo -e “OK! \n” 显示转义 开启换行
echo ‘’ 原样输出
echo “” 输出可包含变量
echo -n 取消行末尾默认的换行符
echo -e “\e[1;31mThis is a red text.\e[0m” 输出带颜色
printf 可以控制输出格式。–
shell 变量
- 自定义变量
定义变量:变量名=变量值变量名必须以字母或下划线开头,区分大小写
ip1=192.168.2.115
引用变量: 变量名或 变量名或 变量名或{变量名}
查看变量:echo $变量名set(所有变量:包括自定义变量和环境变量)
取消变量:unset 变量名
作用范围:仅在当前shell 中有效
- 环境变量
定义环境变量:方法一export back_dir2=/home/backup
方法二export back_dir1 将自定义变量转换成环境变量
引用环境变量: 变量名或 变量名或 变量名或{变量名}
查看环境变量:echo $变量名env 例如env |grep back_dir2
取消环境变量:unset 变量名
变量作用范围:在当前shell 和子shell 有效
- 位置变量
$1 $2 $3 $4 $5 $6 $7 $8 $9 ${10}
- 预定义变量
$0 脚本名
$* 所有的参数 --字符串
$@ 所有的参数 --列表
$# 参数的个数
$$ 当前进程的PID
$! 上一个后台进程的PID
$? 上一个命令的返回值0 表示成功
- read 从键盘读入变量值
read 变量名
read -p "提示信息: " 变量名
read -t 5 -p "提示信息: " 变量名 -t 指定时间 秒
read -n 2 变量名 -n 指定接收的字符数量
" " 弱引用
’ ’ 强引用 不解析变量
命令替换等价于$() 反引号中的shell 命令会被先执行
数学运算
$(()) echo $((5-3*2))
let let sum=2+3; echo $sum
let i++; echo $i
变量"内容"的删除和替换(扩展)
url=www.sina.com.cn
echo ${#url} 获取变量值的长度
echo ${url#*.} 从前往后,最短匹配 sina.com.cn
echo ${url##*.} 从前往后,最长匹配贪婪匹配
cn
echo ${url%.*} 从后往前,最短匹配 www.sina.com
echo ${url%%.*} 从后往前,最长匹配贪婪匹配 www
索引及切片
echo ${url:0:5}
echo ${url:5:5}
echo ${url:5}
变量替换
echo ${url/sina/baidu} 仅替换第一个
echo ${url//sina/baidu} 贪婪匹配 替换全部
变量嵌套
eval 需要执行的脚本 内部包含变量 变量套变量 eval hive -e ( e c h o ′ (echo ' (echo′'${i})
i++ 先赋值,再运算
++i 先运算,再赋值
条件测试及流程控制
Shell 条件测试
格式1:test 条件表达式
格式2:[ 条件表达式] -a 与 -o 或 !非
格式3:[[ 条件表达式]] 支持模式匹配 更强大 =~
[ -e dir|file ]
[ -d dir ] 文件为目录
[ -f file ] 是否存在,而且是文件
[ -r file ] 当前用户对该文件是否有读权限
[ -x file ]
[ -w file ]
[ -L file ] 如果该文件存在,且该文件是符号链接文件
[-z ] 空字符串
[-n ] 非空字符串
[- s ] 文件大小非0 时为真
数值比较
[ 1 -gt 10 ] 大于
[ 1 -lt 10 ] 小于
[ 1 -eq 10 ] 等于
[ 1 -ne 10 ] 不等于
[ 1 -ge 10 ] 大于等于
[ 1 -le 10 ] 小于等于
字符串比较 " "
[ “$USER” = “root” ];echo $?
判断变量是不是数字:
[[ " n u m 10 " = [ 0 − 9 ] + num10" =~ ^[0-9]+ num10"= [0−9]+ ]];echo $?
流程控制 if
单分支结构
if 条件测试
then 命令序列
fi
双分支结构
if 条件测试
then 命令序列
else 命令序列
fi
多分支结构
if 条件测试1
then 命令序列
[elif 条件测试2
then 命令序列
elif 条件测试3
then 命令序列]…
else 命令序列
fi
循环及并发控制
一、case 语法结构
case 变量in
模式1)
命令序列1
;;
模式2)
命令序列2
;;
模式3)
命令序列3
;;
*)
无匹配后命令序列
esac
一、for 语法结构
Shell:
for 变量名[ in 取值列表]
do
循环体
done
一、while 语句结构
while 条件测试
do
循环体
done
==当条件测试成立(条件测试为真),执行循环体
shell 并发控制
ls /proc/$$/fd
[root@tianyun ~]# touch /file1
[root@tianyun ~]# exec 6<> /file1 //打开文件
[root@tianyun ~]# ll /proc/$$/fd
[root@tianyun ~]# echo “tianyun” > /proc/$$/fd/6
[root@tianyun ~]# cat /proc/$$/fd/6
tianyun
[root@tianyun ~]# cat /file1
tianyun
[root@tianyun ~]# rm -rf /file1
[root@tianyun ~]# ll /proc/$$/fd
lrwx------ 1 root root 64 Sep 6 13:32 6 -> /file1 (deleted)
[root@tianyun ~]# cp -rf /proc/$$/fd/6 /file1 恢复
[root@tianyun ~]# exec 6<&- 关闭 文件描述符
[root@tianyun ~]# ll /proc/$$/fd
案例1:多文件处理
#!/bin/bash
exec 7<> /etc/hosts
exec 8<> /etc/sysconfig/network
while read -u 7 line
do
echo $line
read -u 8 line2
echo $line2
done
exec 7<&-
exec 8<&-
#! /bin/bash
#author by guangzhi
thread=5
tmp_fifofile=/tmp/$$.fifo
mkfifo $tmp_fifofile
exec 8<> $tmp_fifofile
rm $tmp_fifofile
for i in `seq ${thread}`
do
echo >&8
done
for i in {1..200}
do
read -u 8
{
需要并发的代码
echo >&8
}&
done
wait
echo "all finish...."
非交互式expect函数
F:\技能提升\linux\5-非交互expect函数.pdf
数组的应用
普通数组:只能使用整数作为数组索引
关联数组:可以使用字符串作为数组索引
一、普通数组
定义数组:
方法一:一次赋一个值
数组名[下标]=变量值
array1[0]=pear
array1[1]=apple
#array1[2]=orange
#array1[3]=peach
方法二:一次赋多个值
array2=(tom jack alice)
array3=(cat /etc/passwd
) 希望是将该文件中的每一个行作为一个元数赋
值给数组array3
array4=(ls /var/ftp/Shell/for*
)
array5=(tom jack alice “bash shell”)
colors=($red $blue $green $recolor)
array5=(1 2 3 4 5 6 7 “linux shell” [20]=puppet)
查看数组:
declare -a
declare -a array1=‘([0]=“pear” [1]=“apple” [2]=“orange” [3]=“peach”)’
declare -a array2='([0]=“tom” [1]=“jack” [2]=“alice”)
访问数组元数:
echo ${array1[0]} 访问数组中的第一个元数
echo ${array1[@]} 访问数组中所有元数等同于echo ${array1[*]}
echo ${#array1[@]} 统计数组元数的个数
echo ${!array2[@]} 获取数组元数的索引
echo ${array1[@]:1} 从数组下标1 开始
echo ${array1[@]:1:2} 从数组下标1 开始,访问两个元素
遍历数组:
方法一:通过数组元数的个数进行遍历
for(( i=0;i<${#array[@]};i++))
do
echo ${array[i]}
done
for i in ${array[@]}
do
echo $i
done
方法二:通过数组元素的索引进行遍历
二、关联数组
定义关联数组:
申明关联数组变量
declare -A ass_array1
declare -A ass_array2
方法一:一次赋一个值
数组名[索引]=变量值
ass_array1[index1]=pear
ass_array1[index2]=apple
ass_array1[index3]=orange
ass_array1[index4]=peach
方法二:一次赋多个值
ass_array2=([index1]=tom [index2]=jack [index3]=alice
[index4]=‘bash shell’)
查看数组:
declare -A
declare -A ass_array1='([index4]=“peach” [index1]=“pear”
[index2]=“apple” [index3]=“orange” )’
declare -A ass_array2='([index4]=“bash shell” [index1]=“tom”
[index2]=“jack” [index3]=“alice” )’
访问数组元数:
echo ${ass_array2[index2]} 访问数组中的第二个元数
echo ${ass_array2[@]} 访问数组中所有元数等同于echo ${array1[*]}
echo ${#ass_array2[@]} 获得数组元数的个数
echo ${!ass_array2[@]} 获得数组元数的索引
函数传参及返回值
一、定义函数
方法一:
函数名() {
函数要实现的功能代码
}
方法二:
function 函数名{
函数要实现的功能代码
}
二、调用函数
函数名
函数名参数1 参数2
AWK
时间同步:systemctl start chronyd
getenforce 查看selinux 状态
关闭防火墙 :systemctl stop firewalld.service
systemctl disable firewalld.service #禁止firewall开机启动
FTP 登陆:
lftp ip地址 -p 端口号 -u 用户名,‘密码’ -e’命令’
查看最大打开文件描述符数量: ulimit -Sn ulimit -Hn