shell变量+处理字符工具
\放在命令最后表示连接下一行
变量规则
- Bash中变量默认的是字符串型,如要进行数值运算,需要修改变量的类型,指定为数值型
- 变量赋值等号两边不能有空格
变量分类
- 用户自定义变量
- 环境变量,保存操作系统环境相关数据
- 预定义变量,(相当于脚本传入变量)
set打印系统所有变量unset name变量删除unset timePATH系统查找命令的路径
临时修改环境变量PATH="$PATH:/tmp",PATH是由冒号分割的PS1定义系统提示符的变量位置参数变量分类(预定义变量的一种)
$nn=0代表当前命令本身,其他的参数按顺序排,超过9用${10}$0:输出命令本身.$@:所有参数看成独立,$*:所有参数看成整体.1
2
3
4
5
6
7
8
9#!/bin/bash
for i in "$*"
do
echo $i
done
for i in "$@"
do
echo $i
done预定义变量
$?:命令的返回值.最后一次执行命令是否成功,0代表成功,其余表错误$\$\$$:当前进程的进程号$!:后台运行的最后一个进程号
read
-s:隐藏输入,-t:允许输入的时间-p:输入打印的字符-n:输入的字符数read [选项] [变量名]read -p "your name " -s -t 30read -n 2 -s -p "Pleasr enter your name" -t 30 name
数值运算(shell中变量默认为字符串类型)
1 | |
declare: 声明变量类型-p:显示变量类型declare -p PATH-i:声明为integer-x:声明为环境变量
- 声明为
int在运算1
2
3
4
5
6
7
8
9
10
11
12
13#!/bin/bash
a=1
b=2
declare -i c=$1+$2
echo $c
----
#!/bin/bash
a=1
b=1
c=$a+$b
echo $c
daclare -i c=$a+$b
echo $c - $((运算式)) 或者 $[运算式]
变量测试与变量替换
- abc这个变量名字可以任意替换,将abc这个变量理解为
x=${y-0}1
2x=${y-abc}
echo $x - 1
y为空,则x=abc - 2
y=1,则x=1 - 用的时候查表
一些配置文件
/root/.bash_logout注销时的配置文件/root/.bash_history历史命令保存的文件(注销之后才写入)- shell登录信息
- 本地终端的登录信息
/etc/issue - 远程登录
/etc/issue.net,配置文件不生效的原因是ssh的配置文件/etc/ssh/sshd_config决定,修改Banner /etc/issue.net这行,会显示/etc/issue.net
- 登录后的信息(远程或本地登录都会生效)
/etc/motd
通配符用来匹配文件名
- 通配符是完全匹配,
ls find cp这些命令不支持正则,ls -l f*
正则表达式匹配字符串
- 在文件中匹配符合条件的字符串
- 包括匹配
字符截取命令
cut:对比grep提取行,cut和awk是用来提取列中文字-d:默认分割符:列之间的换行符tab,修改分隔符-f:提取的列数cat /etc/passwd | grep /bin/bash | cut -d ":" -f 1,3
printf格式化输出,printf "%s %s\n" $(cat student)$(cat student)引用系统命令系统有
printf没有print命令,awk中2个都有,print比printf会自动加入换行符awkawk '[pattern1]{act1}[pattern2]{act2}' 文件名awk '模式1{动作1} 模式2(条件2){动作2}' 文件名- 可以从行中提取列
awk '{printf $2"\t"$4"\n""} student' df -h | awk '{printf $1 "\t" $2 "\t" $4 "\n"}'df -h | awk '{print $1 "\t" $3 "\t" $4}'
效果相同cut、awk、grep混用df -h | grep "vda1" | awk '{print $5}' | cut -d "%" -f 1,
用cut将7%中%作为分隔符,数字作为第1列提取出来
- 可以从行中提取列
BEGIN后的{}列出来的操作,在读入输入之前执行,END后的{}列出来的操作在读入输入完成后执行
awk默认识别的分隔符是制表符,或者空格FS内置变量,来指定分隔符,awk '{FS=":"}{print $2 "\t" $4}' /etc/passwd
- 在指定
FS=":"时,先读入第一行再来指定分隔符,使用BEGIN在读入之前修改分隔符awk 'BEGIN{FS=":"}{print $2 "\t" $5}' /etc/passwd
- 通过条件对数据进行筛选, 例:
cat student | grep -v "Name" | awk '$6>90{print $2}BEGIN{print "Who is best"}END{print "The end"}'
sed(轻量级流编辑器)
sed [option] 'command' filesed 选项 '命令' 文件名- 选项:
-n,sed一般会将所有的数据打印,-n只打印经过处理的行-i:同时修改源文件,不打印在屏幕上-e:多条sed命令编辑
- 命令:
sed -n '2,3p' student:2,3p表示第2行到第3行.
sed -n '1p' student:p打印第一行sed '1p' student,对比缺少-n的效果df -h | sed -n '2p'- `sed ‘2d’ studen
- 字符串替换
sed 'ns\原内容\新内容\g' student:n表示第n行,否则全部原内容被替换s:替换指定字符g:获得内存缓冲区的内容,代替当前模板(文件)内的文本sed '3s\84\90\g' student
-e多sed命令,中间是;sed -e 's\Gao\Anthony\g ; s\Sc\Sb\g' student
`sed -e 's\Gao\ \g ; s\Sc\ \g' student`
本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!