linux-06 shell基础
一、shell基础
echo -e 支持反斜线控制的字符转换
控制字符
\\输出\本身\b退格键\eESCAPE键\f换页符\n换行符\r回车符\t制表符(tab键)\0nnn(nnn三位八进制)\xhh按照十六进制
输出颜色
echo -e "\e[1;31m abcd \e[0m"
30m黑色、31m红色、32m绿色、33m黄色、34m蓝色、35m洋色 、36m青色、37m白色
输入内容到文件
- 覆盖:
echo 'content' > a.txt - 追加:
echo 'string' >> a.txt
执行shell脚本
chmod 755 hello.sh./hello.shbash hello.sh
输出重定向
命令 > 文件 2>&1以覆盖方式 把正确和错误输入到一个文件命令 >> 文件 2>&以追加方式 把正确和错误输入到一个文件命令 &> 文件以覆盖方式 把正确和错误输入到一个文件命令 &>> 文件以追加方式 把正确和错误输入到一个文件命令>>文件1 2>>文件2把正确追加到1 错误追加到2
输入重定向
wc 选项 文件名 -c统计字节 -w统计单词 -l统计行数
多命令顺序
命令 ; 命令 ; 命令 多命令执行
bash
date ; dd if=输入文件 of=输出文件 bs=字节数 count=个数 ; date 计算复制速度&&:逻辑与,第一条执行再执行第二条||:逻辑或 ,第一条错误执行第二条 第一条正确不执行第二条- 判断命令是否正确:命令 && echo yes || echo no
- 命令1的正确输出作为命令2的操作对象:命令 | 命令2
通配符
?单个字符*包含任意字符[a-z]a-z的字符[^a-z]只有数字 没有字母''没有特殊意义""有特殊含义- ``直接执行命令
$()和反引号一样#注释$调用变量\转意符
本地变量(只在当前变量生效)
本地变量定义:name=sc
- 变量叠加
aa="$aa"456aa=${aa}789
set变量查看unset 变量变量删除echo $name调用变量 变量前加$
如果想获取一条命令的执行结果,需要使用反引号``
bash
name=`git pull`
echo $name环境变量(在所有变量生效)
pstree查看当前变量等级export age=18定义环境变量env查看环境变量echo $PATH查找系统命令路劲PS1定义系统提示符的变量PS1='[\u@\t \W]\$ '-t时间 -u用户 -h主机名 -W显示最后一个目录 $提示符
位置参数变量
$n$0代表命令本身 $1-$9代表第1-9个参数 十以上的表达$$*所有参数 看成整个参数$@所有参数 看成单个参数$#代表多少个参数
预定义变量
$?返回结果0正确执行 返回非0错误执行$$当前进程的进程号pid$!最后一个进程后台pid&放入后台
接收键盘输入
read 选项 变量名 -p "提示信息" 输入提示信息 -t 秒数 -n 字符数 -s 隐藏字符
数值运算符
declare [+/-]选项 变量名
-设定变量属性+取消变量属性-i声明变量整形-x声明环境变量-p查看变量类型
bash
declare -i cc=$aa+$bbexpr或let数值运算工具
bash
dd=$(expr $aa+$bb)
let hh=$aa+$bb
ff=$(( $aa+$bb ))
gg=$[ $aa+$bb ]
bb=$(( 14%3 )) # 得余数
cc=$(( 1&&0 )) # 逻辑与运算二、字符截取命令
student.txt内容如下:
bash
vi student.txt
ID Name PHP Linux MySQL Average
1 Liming 82 95 86 87.66
2 Sc 74 96 87 85.66
3 Gao 99 83 93 91.66cut字段提取命令
cut [选项] 文件名
-f 列号:提取第几列-d 分隔符:按照指定分隔符分割列
bash
cut -f 2 student.txt
cut -f 2,3 student.txt
cut -d ':' -f 1,3 /etc/passwd
#cut命令的局限
df -h | cut -d " " -f 1,3printf命令
printf '[输出类型输出格式]' 输出内容
%ns:输出字符串,n指代输出几个字符%ni:输出整数n指代输出几个字符%m.nf:输出浮点数,m和n是数字,指代输出的整数和小数,%8.2f代表共输出8位数,2位小数,6位整数;
输出格式:
\a:输出警告声音\b:输出退格键\f:清除屏幕\n:换行\r:回车\t:水平输出退格,tab键\v:垂直输出退格,tab键
bash
printf '%s %s %s \n' 1 2 3 4 5 6在awt命令的输出中支持print和printf命令:
- print:print会在每个输出之后自动加入一个换行符(linux默认没有print命令)
- printf:printf是标准格式输出命令,并不会自动加入换行符,如果需要换行需要手工加入换行符;
awk命令
awk '条件1{动作1} 条件2{动作2}...' 文件名
条件:一般使用关系表达式作为条件
- x > 10 :判断变量x是否大于10
- x >= 10
- x <= 10
动作:
- 格式化输出
- 流程控制语句
bash
awk '{printf $2 "\t" $6 "\n"}' student.txt
df -h | awk '{print $1 "\t" $3}'BEGIN
bash
awk 'BEGIN{printf "This is a transcript \n"} {printf $2 "\t" $6 "\n"}' student.txtEND
bash
awk 'END{printf "the end \n"}{printf $2 "\t" $6 "\n"}' student.txtFS内置变量
bash
cat /etc/passwd | grep "/bin/bash" | \
awk 'BEGIN {FS=":"} {printf $1 "\t" $3 "\n"}'关系运算符
bash
cat student.txt | grep -v Name | \
awk '$6 >= 87 {printf $2 "\n"}'sed命令
sed是一种几乎包括在所有UNIX平台(包括Linux)的轻量级流编辑器,sed主要是用来将数据进行选取、替换、删除、新增的命令
sed [选项] '[动作]' 文件名
-n:一般sed命令会把所有的数据都输出到屏幕,如果加入此选择,则只会把经过sed命令处理的行输出到屏幕-e:允许对输入数据应用多条sed命令编辑-i:用sed的修改结果直接修改读取数据的文件,而不是屏幕输出
动作:
a \: 追加,在当前行后添加一行或多行。添加多行时,除最后 一行 外,每行末尾需要用“\”代表数据未完结。c \: 行替换,用c后面的字符串替换原数据行,替换多行时,除最 后一行外,每行末尾需用“\”代表数据未完结。i \: 插入,在当期行前插入一行或多行。插入多行时,除最后 一行 外,每行末尾需要用“\”代表数据未完结。d: 删除,删除指定的行。p: 打印,输出指定的行。s: 字串替换,用一个字符串替换另外一个字符串。格式为“行范 围s/旧字串/新字串/g”(和vim中的替换格式类似)
学生成绩表
bash
vi student.txt
ID Name PHP Linux MySQL Average
1 Liming 82 95 86 87.66
2 Sc 74 96 87 85.66
3 Gao 99 83 93 91.66行数据操作
bash
# 查看第2行
sed '2p' student.txt
sed -n '2p' student.txt
# 删除第二行到第四行的数据,但不修改文件本身
sed '2,4d' student.txt
# 在第二行后追加hello
sed '2a hello' student.txt
# 在第二行前插入两行数据
sed '2i hello world' student.txt
# 数据替换
sed '2c Nosuch person' student.txt
# sed操作的数据直接写入文件
sed -i '3s/74/99/g' student.txt
#同时把“ Liming ”和“ Gao ”替换为空
sed -e 's/Liming//g ; s/Gao//g' student.txt三、字符处理命令
排序命令sort
sort [选项] 文件名
-f: 忽略大小写-n: 以数值型进行排序,默认使用字符串型排序-r: 反向排序-t: 指定分隔符,默认是分隔符是制表符-k n[,m]: 按照指定的字段范围排序。从第n字段开始, m字段结束(默认到行尾
bash
sort /etc/passwd
sort -r /etc/passwd
# 指定分隔符是“:”,用第三字段开头,第三字段结尾排序,就是只用第三字段排序
sort -t ":" -k 3,3 /etc/passwd统计命令wc
wc [选项] 文件名
-l: 只统计行数-w: 只统计单词数-m: 只统计字符数
判断字符串是否包含
利用字符串运算符
bashstrA="helloworld" strB="low" if [[ $strA =~ $strB ]] then echo "包含" else echo "不包含" fi利用通配符
bashA="helloworld" B="low" if [[ $A == *$B* ]] then echo "包含" else echo "不包含" fi