Shell编程-------------------Linux------------------(1)Shell基础

1.定义变量、使用变量以及取消定义的变量
定义变量(普通变量):变量名(字母数字下划线组成,但是不能以数字开头)=数值(如果有空格,用单引号引起来) //a=1
使用变量:一定加上美元符号 //echo $a
取消定义: unset a //unset a

定义变量(环境变量):
declare -x a//变成环境变量
declare +x a//取消环境变量

2.用vim编辑器写脚本文件:

vim xx.sh

  #!/bin/bash(开头一定要写的) 
echo “这个程序的名字是$0echo “first $1”//第一个变量
echo “first2 $2echo “first3 $3echo “first4 $4echo “first5 $5echo “first6 $6echo “一共有$#个参数,分别是$*”

执行脚本前必须先赋予权限: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行的多个文件









猜你喜欢

转载自blog.csdn.net/qq_41166135/article/details/81504931