1.定义变量、使用变量以及取消定义的变量
定义变量(普通变量):变量名(字母数字下划线组成,但是不能以数字开头)=数值(如果有空格,用单引号引起来) //a=1
使用变量:一定加上美元符号 //echo $a
取消定义: unset a //unset a
定义变量(环境变量):
declare -x a//变成环境变量
declare +x a//取消环境变量
2.用vim编辑器写脚本文件:
vim xx.sh
#!/bin/bash(开头一定要写的)
echo “这个程序的名字是$0”
echo “first $1”//第一个变量
echo “first2 $2”
echo “first3 $3”
echo “first4 $4”
echo “first5 $5”
echo “first6 $6”
echo “一共有$#个参数,分别是$*”
执行脚本前必须先赋予权限:chmod +x xx.sh
输出脚本文件并且给变量赋值
./xx.sh 1 2 3 4 5 6
代码中的重点:
*:将所有参数输出来
$0:程序的名字
3.shell语法
<1>read
获取键盘输入的内容 ,相当于JAVA中的Scanner函数 ,下面举一个例子说明它的用法:
#!/bin/bash
echo “请输入您的名字”
read name //程序运行到这一行的时候就会自动停下来接收name变量的值
echo “欢迎您$name”
<2>数组
定义数组:xx = (aa bb cc dd)
输出数组:
echo ${xx[i]}//数组中的某一个元素
echo ${xx[*]}//数组中的所有元素
echo ${!xx[*]}//数组中的所有下标
echo ${#xx[*]}//数组中元素个数
如果我们需要让数组中的元素变为常量: declare -r aa
<3>双引号、单引号的使用
echo “$aa”//正常输出 --->输出一个数组
echo ‘$aa’ //原模原样输出$aa ----->$aa
需要注意输出内容时变量要放正在大括号中进行输出
eg:
echo “我买了十本$xxs”
我买了十本 //因为将xxs整体当成变量解析,但是这个变量不存在
echo “我买了十本${book}s”
我买了十本books//这样的话正常解析,所以以后一定要写在大括号里面
<4>删除命令
r=${path(变量)#(删除首次出现的)*(匹配要删除的前面的所有内容)bin}
//从头开始删,删到最近的一个关键字
//r=${path#*bin} 删除path中首次出现bin的内容以及bin之前的内容
//echo $r 就可以查看其中的内容
r=${path(变量)##(删除远的出现的)*(匹配要删除的前面的所有内容)bin}
//从头开始删,删到最远的一个关键字
//r=${path##*bin} 删除path中最后出现bin的内容以及bin之前的内容
r=${path%bin*}//从后往前删,删到最近的
r=${path%%bin*}//从后往前删,删到最远的
<5>判断某个变量值是否存在:
r=${xx-“aaaaa”}
echo $r
如果存在的话输出的是xx ,如果不存在的话输出的是aaaa
r=${xx-“aaaa”}//只会判断xx有没有定义
如果存在且为空值的话,会没有内容输出
r=${xx:-“aaaa”}//不仅判断是不是定义,还判断是不是空值
加了一个冒号,如果存在且为空值的话,会输出aaa
r=${xx:=“aaaa”}换成等号后,如果xx没定义或者空值,不仅会将aaaa赋值给r,还会将aaaa赋值
<6>别名
别名:
alias aa=”ifconfig eth0”//aa就代表ifconfig eth0
alias //会显示系统中有别名的变量
unalias aa //取消别名
<7>想要以后输入echo不换行可以使用别名
alias echo=”echo -n”
想要修改登录前的信息:vim /etc/issue
修改登录后的信息:vim /etc/motd
<8>两个写代码时候的好命令
开启提醒功能:如果没有赋值的话就会显示出来
set -u set +u 不提示
进行代码跟踪(编写程序的时候用的多):
set -x
<9>通配符
(一对中括号一个字母)
[a-z]//26个字母的一个
[0-9] //数字中的一个
? //是任意一个字符
[!0-9] //不是数字。表示否定
*//匹配任意多个字符
<10>重定向( 本来该出现在屏幕上的结果,去了某一个文件里面了)
1.cal > xx //导入到xx文件里面了
注意 : 如果之前存在的话就会覆盖,如果不存在就会创建新的文件
如果不想让其覆盖的话,两个大于
2. cal >> xx //追加不是覆盖
3. 2> //只重定向错误的
4. 2>> //只追加错误的
5. &> //不管是正确的还是错误的都会导入
<11>管道
管道命令:命令1| 命令2
//命令一的结果通过管道传到命令2,是命令2的执行参数,我们看到的是一个最终的结果
想要看某个中间的结果的时候:
tee
命令1|tee xx|命令2
//命令1执行完通过管道传到tee ,tee保存在xx文件里面 ,tee再通过管道传到命令2里面
//这个依然是一个覆盖的命令
//命令1|tee -a xx|命令2 //中间的结果就会追加在里面,而不是覆盖
<12>
cut:切割
cut -d(指明分隔符) -f(想要查看第几部分) file
cut -d: -f1 aa //以冒号分隔,想要查看第一部分,查看的文件是aa
<13>grep(过滤)
grep 关键字 file //在file 当中查找关键字的行
grep root passwd //在passwd中查找含有root的行
grep root passwd –color //关键字高亮显示
grep -i root passwd –color //忽略大小写高亮显示
grep -in root passwd –color //显示行号
grep -inv root passwd –color //加了一个v就是反向过滤,排除有root的
行
grep -A3 root passwd –color //除了过滤出来关键字,还过滤出来下面三行
<14> sort(排序)
cut -d: -f3 passwd |sort //传过来的数据进行排序
cut -d: -f3 passwd |sort -n //按数字递增顺序来排序
cut -d: -f3 passwd |sort -n -r //递减排序
sort -u //排除重复地行 -u相当于uniq
<15>字符转换命令://不改变源文件中的内容
tr(tr命令可以对来自标准输入的字符进行替换、压缩和删除。)
echo “HELLO WORLD” | tr ‘A-Z’ ‘a-z’ hello world //小写变成大写
tr ‘a-z’ ‘A-Z’ < hosts> //小写变成大写
cat passwd | tr -d ‘:’ //删除里面的冒号
小于号:命令默认从键盘获得的输入,改成从文件,或者其它打开文件以及设备输入
<16>将源文件的内容改变分两步:
tr ‘a-z’ ‘A-Z’ < hosts > xxx //先改变,然后在重定向到某个文件里面
mv xxx hosts //之后再移动到hosts中
<17>col -x //将里面的tab键全部换成空格
col -x 和expand的结果一样
<18>cat -A//可以查看里面的标识符(^I是制表符)
eg:cat xx | col -x |cat -A //查看里面的内容并且通过管道将tab换成空格之后显示出来里面的标识符
<19>paste
paste(将两个文件直接全部粘贴到一起)
paste aa bb //将aa 和 bb粘贴到一起
<20>
join
join(将两个文件粘贴到一起,第一部分一样的才进行粘贴)
//join -t “:” aa bb //默认是以空格做为分隔符,但是这个是以冒号作为分隔符
如果第一行重复地,将忽视首字母
aa bb
a 123 a 456
b 123 b 456
c 123 c 456
paste:
a123a456
join:
a123456
join -t “:” -1 4 aa -2 3 bb //以冒号分隔,将第一个文件分割后的第四部分和第二个文件的第三部分进行比较
<21>split(将大文件分割成小的小文件)
split(分隔) -b(以块分) 10k(大小为10k) /etc/services xxx(前缀) //将services分隔成10k大小的块
split(分隔) -l(以行分)100(每个文件100行) /etc/services xxx(前缀) //将services分隔成100行的多个文件