Shell编程——基本命令及使用

本文详细介绍了Linux中一些常用的命令行工具,如awk用于处理文本,seq生成数字序列,xargs将命令输出作为其他命令的参数,tr进行字符转换和删除,cut截取字符串和字段,sort进行排序,uniq去除重复行,grep进行过滤,以及sed进行文本替换和过滤。文中还提供了多个示例和练习,帮助读者理解和掌握这些工具的用法。
摘要由CSDN通过智能技术生成

awk   截取字段

1.输入分隔符
    默认是空白(空格和tab)
    -F  选项:指定输入分隔符
    FS   输入分隔符的变量

2.输出分隔符 

    默认是一个空格
    OFS 指定输出分隔符  输出分隔符的变量
  OFS         The output field separator, a space by default. 

3.指定 -F

[root@sc-server 3-20]# awk -F: '{print $1,$3}' /etc/passwd |head 
root 0
bin 1
daemon 2
adm 3
lp 4
sync 5
shutdown 6
halt 7
mail 8
operator 11
[root@sc-server 3-20]# awk -F: 'OFS="#" {print $1,$3}' /etc/passwd |head 
root#0
bin#1
daemon#2
adm#3
lp#4
sync#5
shutdown#6
halt#7
mail#8
operator#11

 经典的变量
   NF          The number of fields in the current input record.   一行里有多少个字段(列)
   NR          The total number of input records seen so far.  行号

   FS  输入字段分隔符

   OFS 输出字段分隔符

[root@sanchuang ~]# cat /etc/passwd|awk -F: '{print $1}'  >username.txt
varname=$(命令)  --》命令替换,优先执行命令,然后将结果赋值varname这个变量
[root@sc-server 3-20]# awk   -F:  'BEGIN{num=0;print "开始处理文件/etc/passwd"} $1 ~ /feng/ || $3>1005 {print NR,NF,$1,length($1),$NF,$(NF-1),$3;num++} END{print "total:" num}'  /etc/passwd
[root@sc-server 3-20]# awk -F: '$1 ~/a/{print $1;num++ }END{print "共计: "num" 用户"}' /etc/passwd
[root@sc-server 3-20]# awk -F: '$1 ~/a/&& OFS="###"{print $1,$3;num++ }END{print "共计: "num" 用户"}' /etc/passwd

[root@sc-server 3-20]# cat  /etc/passwd|awk -F: '{u[$1]=$3}END{for(i in u) print i,u[i]}'

[root@sc-server 3-20]# cat bill.txt |awk 'NR>1{game[$1]+=$2}END{for(i in game) print i,game[i]}'|sort -nr -k 2
liu 99999000000
li 9001329
feng 8650
zhang 450

[[  -n string ]] 判断string 的长度大于0  nonzero
[[ -z string  ]] 判断string 的长度为0  zero

双引号  使用shell变量的使用,使用双引号,但是$1, $2等的$符号前面要接\

[root@sc-nginx ~]# cat /etc/passwd|awk -F: "/^$name/{print \$1,\$3}"
zhangrenjie 8930
zhangrenjie1 8931
zhangrenjie2 8932

小数运算的支持

[root@www 6-2]# a=2.34
[root@www 6-2]# b=67.89
[root@www 6-2]# echo|awk "{print $a/$b}"
0.0344675
[root@www 6-2]# echo|awk "{print $b/$a}"
29.0128

练习

用NF变量显示passwd文件倒数第二列的内容
awk -F: '{print $(NF-1)}' /etc/passwd

显示passwd文件中第5到第10行的用户名
awk -F: 'NR>=5 && NR<=10{print $1}' /etc/passwd

显示passwd文件中第7列不是bash的用户名
awk -F: '$7 ~ /[^bash]/{print $1}' /etc/passwd

显示passwd文件中行号是5结尾的行号和行
awk -F: 'NR%2!=0 && NR%5==0{print NR,$0}' /etc/passwd

用ip add只显示ip(不能使用tr或者cut命令)
ip add|awk -F" " '$2 ~ /[0-9]\./ || $2 ~ /\:[0-z]/  {print $2}'


使用awk显示ens33的入站流量和出站流量)
ifconfig|awk -F" " 'NR>=39 && NR<=41 && $4 ~ /byte/ {print $5}'


使用awk命令统计以r开头的用户数目,显示如下效果
查找结果
root
rpc
rftkit
rppcuser
4
awk -F: 'BEGIN{print "查找结果";num=0} $1 ~ /^r/ {print $1;num++}END{print num}' /etc/passwd

seq    产生数字序列

[root@sanchuang 312]# seq  5
1
2
3
4
5
[root@sanchuang 312]# seq  5 10
5
6
7
8
9
10
[root@sanchuang 312]# seq   1  +2 10
1
3
5
7
9
[root@sanchuang 312]# seq   2  +2 10
2
4
6
8
10
[root@sanchuang 312]# seq -w  2  +2 10
02
04
06
08
10

xargs     将前面命令的输出送到后面的命令作为参数使用

[root@sanchuang 312]# which useradd
/usr/sbin/useradd
[root@sanchuang 312]# which useradd|ls -l
总用量 40
-rw-r--r-- 1 root root  141 3月  12 16:57 for.sh
-rw-r--r-- 1 root root  124 3月  12 16:20 grade.txt
-rw-r--r-- 1 root root   10 3月  12 19:29 old_name.txt
-rw-r--r-- 1 root root 2313 3月  12 16:08 pwd.txt
-rw-r--r-- 1 root root  195 3月  12 19:50 sc.sh
-rw-r--r-- 1 root root  726 3月  12 16:00 username.txt
-rw-r--r-- 1 root root   78 3月  12 16:05 while2.sh
-rw-r--r-- 1 root root  134 3月  12 16:13 while3.sh
-rw-r--r-- 1 root root  212 3月  12 16:48 while_read.sh
-rw-r--r-- 1 root root   73 3月  12 16:02 while.sh
[root@sanchuang 312]# which useradd|xargs ls -l
-rwxr-xr-x. 1 root root 137616 8月   9 2019 /usr/sbin/useradd

tr       1.字符转换 2.删除字符串

-s    去除连续重复的字符

-d    删除

[root@sanchuang 312]# df -Th
文件系统                类型      容量  已用  可用 已用% 挂载点
devtmpfs                devtmpfs  898M     0  898M    0% /dev
tmpfs                   tmpfs     910M     0  910M    0% /dev/shm
tmpfs                   tmpfs     910M  9.7M  901M    2% /run
tmpfs                   tmpfs     910M     0  910M    0% /sys/fs/cgroup
/dev/mapper/centos-root xfs        17G  2.5G   15G   15% /
/dev/sda1               xfs      1014M  151M  864M   15% /boot
tmpfs                   tmpfs     182M     0  182M    0% /run/user/0
[root@sanchuang 312]# df -Th|egrep "/$"
/dev/mapper/centos-root xfs        17G  2.5G   15G   15% /
[root@sanchuang 312]# df -Th|egrep "/$"|awk  '{print $6}'
15%
[root@sanchuang 312]# df -Th|egrep "/$"|awk  '{print $6}'|tr -d "%"
15
[root@sanchuang 312]# echo 123456333355555555 | tr 345 abc
12abc6aaaacccccccc
[root@sanchuang 312]#
[root@sanchuang 312]# cat /etc/hosts|tr [a-z]  [A-Z]
127.0.0.1   LOCALHOST LOCALHOST.LOCALDOMAIN LOCALHOST4 LOCALHOST4.LOCALDOMAIN4
::1         LOCALHOST LOCALHOST.LOCALDOMAIN LOCALHOST6 LOCALHOST6.LOCALDOMAIN6

[root@sanchuang 312]# cat /etc/hosts
127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
::1         localhost localhost.localdomain localhost6 localhost6.localdomain6
[root@sanchuang 312]# cat /etc/hosts|tr [a-z]  [A-Z] >hosts2  大小写替换
[root@sanchuang 312]# cat hosts2 
127.0.0.1   LOCALHOST LOCALHOST.LOCALDOMAIN LOCALHOST4 LOCALHOST4.LOCALDOMAIN4
::1         LOCALHOST LOCALHOST.LOCALDOMAIN LOCALHOST6 LOCALHOST6.LOCALDOMAIN6
[root@sanchuang 312]# cat /etc/hosts|tr -d  "[0-9]"  删除数字
...   localhost localhost.localdomain localhost localhost.localdomain
::         localhost localhost.localdomain localhost localhost.localdomain
[root@sanchuang 312]# cat /etc/passwd|tr ":"  "\n"

cut     截取字符串和字段

-c:从指定提取范围中提取字符  character
-f:从指定提取范围中提取字段  field
-d :指定分隔符,默认的分隔符号是tab 

切片操作

root@sanchuang 312]# echo 123abcd|cut -c 4
a
[root@sanchuang 312]# echo 123abcd|cut -c 4-
abcd
[root@sanchuang 312]# echo 123abcdefg|cut -c 4-
abcdefg
[root@sanchuang 312]# echo 123abcdefg|cut -c 4-7
abcd
[root@sanchuang 312]# echo 123abcdefg|cut -c -7
123abcd


[root@sanchuang 312]# df -Th|tr -s " "|cut -d " " -f 1,6  截取第1和第6个字段,默认的分隔符号是tab  

截取字段

[root@sanchuang 312]# df -Th|tr -s " "|cut -d " " -f 1,6  截取第1和第6个字段,默认的分隔符号是tab  
文件系统 已用%
devtmpfs 0%
tmpfs 0%
tmpfs 2%
tmpfs 0%
/dev/mapper/centos-root 15%
/dev/sda1 15%
tmpfs 0%
[root@sanchuang 312]# 
[root@sanchuang 312]# df -Th|awk '{print $1,$6}'
文件系统 已用%
devtmpfs 0%
tmpfs 0%
tmpfs 2%
tmpfs 0%
/dev/mapper/centos-root 15%
/dev/sda1 15%
tmpfs 0%

sort     排序

默认为升序   , -r    降序

-n    按数字进行排序

-k     按字段进行排序,默认的分隔符是空白,空白包括回车、空格、tab键

[root@sanchuang 312]# tail -n +2 grade.txt |sort -k 2 -rn
rose  90     english  21
feng  80     chinese  20
jack  76     english  19
jarry 60     chinese   35
tom   55     math     18
jack2  9     english  19

uniq    去除重复的连续的行


    需要先对行进行排序 
    -c  count 次数
    -u:只显示唯一的行
    -d:只显示重复的行
[root@sanchuang 312]# cat abc.txt |sort|uniq -c

grep     过滤

egrep = grep -E 使grep支持正则表达式

常用命令选项:

-i:忽略字母大小写

-v:条件取反

-c:统计匹配的行数

-q:静默、无任何输出,一般用于检测及脚本(看$?返回值,0则匹配,非0则无匹配)

-n:显示出匹配结果所在的行号

--color:标红显示匹配字串

sed      过滤/替换

      1.文本的过滤查找   text  filtering
      2.文本的转换/替换  transforming text 

sed 查找方式:
    1.根据行号
    2.根据模式-->正则表达式=字符+特殊符号
    3.根据字符串  -->根据日志的日期去查找 

选项: 

-n  只显示匹配处理的行(不然会全部输出)

 -i   直接在原文件里进行修改

-r  支持扩展正则表达式

 -e 执行多个编辑命令时(一般用;代替)

-i[SUFFIX], --in-place[=SUFFIX]  给原文件先进行备份,备份的文件名后面加一个后缀名

加后缀名.bak

-f  从脚本文件中读取内容并执行(文件中的编辑命令每行一个,不同;隔开)

[root@docker lianxi]# sed  -i.bak  's/cao/liu/' hehaotian.txt  s是替换命令 substitute

[root@docker lianxi]# ls
 hehaotian.txt  hehaotian.txt.bak  

sed 常用的编辑命令

p  是sed内部的命令  输出内容到屏幕  print

/longyi/ p查找到包含字符串longyi的行,然后显示出来 --》默认是整行输出

[root@docker lianxi]# sed -n '100,200p' test_big_file.txt 
[root@docker lianxi]# head -200 test_big_file.txt |tail -101
[root@docker lianxi]# sed -n '2,+3p' test_big_file.txt 
welcome  to  sanchuang  fengdeyong  hehaotian zhouxi  zhenyani lianyu 2
welcome  to  sanchuang  fengdeyong  hehaotian zhouxi  zhenyani lianyu 3
welcome  to  sanchuang  fengdeyong  hehaotian zhouxi  zhenyani lianyu 4
welcome  to  sanchuang  fengdeyong  hehaotian zhouxi  zhenyani lianyu 5

[root@docker lianxi]# cat -n hehaotian.txt|sed -n '1~2p' 
     1	hehaotian   luqianjun zhanglinfeng  zhangyi
     3	hehaotian   luqianjun zhanglinfeng  zhangyi
     5	liujb  lipengfei
     7	liujb  lipengfei wuhao gaohui
[root@docker lianxi]# cat -n hehaotian.txt|sed -n '2~2p' 
     2	hehaotian   luqianjun zhanglinfeng  zhangyi
     4	hehaotian   luqianjun zhanglinfeng  zhangyi
     6	liujb  lipengfei wuhao

使用双引号,变量建议使用花括号括起来
[root@docker lianxi]# num1=10
[root@docker lianxi]# num2=20
[root@docker lianxi]# sed -n "${num1},${num2}p"  test_big_file.txt 
welcome  to  sanchuang  fengdeyong  hehaotian zhouxi  zhenyani lianyu 10
welcome  to  sanchuang  fengdeyong  hehaotian zhouxi  zhenyani lianyu 11
welcome  to  sanchuang  fengdeyong  hehaotian zhouxi  zhenyani lianyu 12
welcome  to  sanchuang  fengdeyong  hehaotian zhouxi  zhenyani lianyu 13
welcome  to  sanchuang  fengdeyong  hehaotian zhouxi  zhenyani lianyu 14
welcome  to  sanchuang  fengdeyong  hehaotian zhouxi  zhenyani lianyu 15
welcome  to  sanchuang  fengdeyong  hehaotian zhouxi  zhenyani lianyu 16
welcome  to  sanchuang  fengdeyong  hehaotian zhouxi  zhenyani lianyu 17
welcome  to  sanchuang  fengdeyong  hehaotian zhouxi  zhenyani lianyu 18
welcome  to  sanchuang  fengdeyong  hehaotian zhouxi  zhenyani lianyu 19
welcome  to  sanchuang  fengdeyong  hehaotian zhouxi  zhenyani lianyu 20

 sed 可以根据字符串进行时间段的匹配

Apr  2 14:23:36
Apr  2 15:01:01
sed   -n  '/Apr  2 14:23:36/,/Apr  2 15:01:01/ p' messages  

c  整行替换
    selinux文件
s 字符串替换(匹配正则表达式)substitution (删除和修改内容)
    修改ip地址
    加注释

d 删除指定行 delete

sed '3,5d' /etc/fstb 删除3到5行
sed '/2/d' /etc/fstab  删除包含数字2的行
sed '/ext3/!d /etc/fstab  除了包含ext3的行都删除
sed -r '/^$|^#/d' /etc/inittab  删除空行和注释

r  讲文件的内容读入  read

w  将文件的内容写入 write

a 在匹配行后面追加 append

= 输出行号
&  代表前面查找匹配的内容  代表旧的字符串
        's/luqianjun/&sanchuang/g'

标签的使用: 使用(正则) --》小圆括号括起来
标签引用  \1  \2 
[root@web-server 5-19]# cat /etc/passwd|sed -r -n 's/(^[0-Z]+)(.*)/\2 \1/gp'

非常有用的功能:                                                    
1.在删除某一行里的部分字符串,还是非常有价值的
2.或者增加部分内容
3.颠倒顺序


	[root@docker lianxi]# echo  aaafdfd bbb ccc |sed -nr 's/([a-z]+) ([a-z]+) ([a-z]+)/\3 \2 \1/p'
	ccc bbb aaafdfd
	[root@docker lianxi]# echo  aaafdfd bbb ccc |sed -nr 's/([a-z]+) ([a-z]+) ([a-z]+)/\3/p'
	ccc
[root@docker lianxi]# sed  -i '$c  NOBOOT="no"'  ifcfg-ens33 
[root@docker lianxi]# sed  -i '/^NOBOOT/c  NOBOOT="yes"'  ifcfg-ens33 


[root@docker lianxi]# sed  -i  '/zhangyi/  s/hehaotian/liuna/' hehaotian.txt  替换第一个hehaotian
[root@docker lianxi]# sed  -i  '/zhangyi/  s/hehaotian/liuna/g' hehaotian.txt 替换所有的
[root@docker lianxi]# sed  -i  '/zhangyi/  s/liuna/hehaotian/2' hehaotian.txt  替换第2个
[root@docker lianxi]# sed  -i  '/zhangyi/  s/hehaotian/liuna/2g' hehaotian.txt  从第2个开始替换

模式空间:sed处理文本内容行的一个临时缓冲区,模式空间中的内容会主动打印到标准输出,并自动清空模式空间

保持空间:sed处理文本内容行的另一个临时缓冲区,不同的是保持空间内容不会主动清空,也不会主动打印到标准输出,而是需要sed命令来进行处理。可以使用高级命令h,H,g,G与模式空间进行交互。

   d      Delete pattern space.  Start next cycle.
          删除pattern space的内容,开始下一个循环

   h H    Copy/append pattern space to hold space.
          复制/追加pattern space的内容到hold space.(复制会覆盖原内容)

   g G    Copy/append hold space to pattern space.
          复制/追加hold space的内容到pattern space.复制会覆盖原内容)

   x      Exchange the contents of the  hold  and  pattern
          spaces.
          交换hold space和pattern space的内容.
 

 练习

练习1:
1.删除zhangyi
[root@docker lianxi]# sed -i.backup  's/zhangyi//g' hehaotian.txt 

2.删除每行里的数字,或者特殊符号
[root@docker lianxi]# sed -i.backup  's/[0-9]//g' hehaotian.txt 
[root@docker lianxi]# sed -i.backup  's/[^0-Z ]//g' hehaotian.txt 

3.将3行注释,前面加一个#号
[root@docker lianxi]# sed -i.backup  '3 s/^/#/' hehaotian.txt 

4.包含lipengfei的行前面加注释
[root@docker lianxi]# sed -i.backup  '/lipengfei/ s/^/#/' hehaotian.txt 

5.在luqianjun字符串后面加一个sanchuang
[root@docker lianxi]# sed -i.backup  's/luqianjun/&sanchuang/g' hehaotian.txt 

6.以wuhao结尾的行,在末尾加一个zhengyani
[root@docker lianxi]# sed -i.backup  '/wuhao$/ s/$/zhengyani/' hehaotian.txt 

===

练习1:
	新建一个cs.txt,内容如下:
	hehaotian   luqianjun zhangyi lianyu
	hehaotian   luqianjun lipengfei zhangyi wuhao
	hehaotian   lipengfei luqianjun zhangyi lianyu
	sanchuang 34567 feng
	changsha@12345 sanchuang

1.删除zhangyi
[root@master 4-2]# sed -i 's/zhangyi//' cs.txt

2.删除每行里的数字,或者特殊符号
[root@master 4-2]# sed -i -r 's/([0-9]|[^0-Z ])//g' cs.txt 
使用-r选项能够避免使用\(\)

3.将3行注释,前面加一个#号
[root@master 4-2]# sed -i '3 s/^/#/' cs.txt 

4.包含lipengfei的行前面加注释
[root@master 4-2]# sed -i '/lipengfei/ s/^/#/' cs.txt

5.在luqianjun字符串后面加一个sanchuang
[root@master 4-2]# sed -i 's/luqianjun/&sanchuang/g' cs.txt

6.以wuhao结尾的行,在末尾加一个zhengyani
[root@master 4-2]# sed -i '/wuhao$/ s/$/zhengyani/' cs.txt 

练习2:
1./etc/hostname 文件里的名字修改为dengjianguo
[root@master 4-2]# sed -i 'c/^$/dengjianguo/' hostname

2.复制/etc/hosts文件到当前目录下,然后进行操作
  在每行前面加一个字符串sanchuang
[root@master 4-2]# sed -i 's/^/sanchuang/' hosts

3.自己编辑一个文件test.txt,内容如下:
0.0.0.0
1.1.1.1
2.2.2.2
使用sed或者awk或者编写脚本(shell,python,go等)实现输出以下形式:
0.0.0.0:80,1.1.1.1:80,2.2.2.2:80
[root@master 4-2]# sed -i 'N;N;s/\n/:80,/g;s/$/:80/p' test.txt
N命令简单来说就是追加下一行到模式空间,同时将两行看做一行,但是两行之间依然含有\n换行符,如果命令未执行成功(并非跳过:前端条件不匹配),则放弃之后任何命令,并对新读取的内容,重头执行sed。

[root@master 4-2]# sed -i 's/$/:80/;:a;N;$!ba;s/\n/,/g' test.txt   
# :a;N;$!ba;是一个sed的高级用法,表示将整个文件读入到模式空间中,以便进行多行处理
N是把下一行加入到当前的hold space模式空间里,使之进行后续处理,最后sed会默认打印hold space模式空间里的内容。也就是说,sed是可以处理多行数据的。
:a和ta是配套使用,实现跳转功能。t是test测试的意思。
另外,还有:a和ba的配套使用方式,也可以实现跳转功能。b是branch分支的意思。

[root@localhost /shel1/lianxi] cat ./sed_shuzi.txt
0.o.e.0
1.1.1.1
2.2.2.2
#1
[ root@localhost /shell/lianxi]# cat sed_shuzi.txt | sed -n -e 's/.*[0-1]$/&:80,/p' -e 's/.*2$/&:80/p’ xargs| tr -d ""
0.e.e.0:80,1.1.1.1:80,2.2.2.2:80
#2
[root@localhost /shell/lianxi]# cat sed _shuzi.txt | sed -n 's/$/:80/;H;${X;s/in/,/2g;p}'
0.0.0.0:80,1.1.1.1:80,2.2.2.2:80
#3
跟2异曲同工之妙,都是把三个一起放到模式空间进行更改替换
[root@localhost /shell/1ianxi]# cat sed_shuzi.txt | sed -n 'N;N;s/\n/: 80,/g;s/$/:80/p'


4.新建一个文本文件sc.txt,内容如下:
abcdSdddde
islHishbxld
goBkefji
daanshXxge
使用sed去处理sc.txt给含有大写字母的行,在大写字母后追加数字2023 
sed -i ' s/[A-Z]/&2023/g' sc.txt 

5.复制/etc/passwd文件到当前目录下,对当前目录下的passwd文件进行操作  --》请不要直接对/etc/passwd操作
	请将所有的非root用户的uid后面加一个0,gid前面加一个1
[root@master 4-2]# sed -r '/^[^root]/ s/:/1:0/3' passwd
sed -i -r '/^root/! s/^(.*:.*:)([0-9]+):([0-9]+)/\1\20:1\3/' passwd


练习:3:
1.复制/etc/ssh/sshd_config到当前目录下,修改里面的端口号修改为8899,将#Port 22 配置修改为Port 8899 要求去掉前面的#号,将22修改为8899
[root@master 4-2]# sed -i 's/#Port 22/Port 8899/' sshd_config

注意:所有的文件建议复制到当前目录下操作,不然重新启动系统会导致系统启动不起来。


1.sed取出/etc/passwd文件的第一列


2.sed将PATH环境变量中的冒号换成换行  ->可以将PATH变量的内容重定向到一个文件里,例如path.txt
sed -n 's#:#\ngp' path.txt

3.sed将PATH环境变量斜杠/换成斜杠\
sed -i 's/\//\\/g' path.txt

4.sed修改SELINUX配置文件从开启(enforcing)变成禁用(disabled)
		/etc/sysconfig/selinux
sed -i '/^SELINUX=/ s/enforcing/disabled/p' config

5.去掉/etc/passwd文件中第二个字段的x
sed -n 's/:x:/::pg' passwd

6.将/etc/sysconfig/network-scripts/ifcfg-ens33里的ONBOOT=no修改为yes或者修改下IPADDR后面的ip地址,具体ip自己定义
sed -i '/ONBOOT=/ s/on/yes/' ifcfg-ens33

7.只显示ip add的ip地址
sed -i '3~6 s/\//\n/' iipp.txt
sed -n '3~7 s/inet//p' iipp.txt

8.复制/etc/ssh/sshd_config到当前目录下,修改里面的端口号修改为8899
		将#Port 22 配置修改为Port 8899 要求去掉前面的#号,将22修改为8899
sed -i '/s/^#Port 8899/' sshd_config

9.给下列含有大写字母的行,在大写字母后追加数字2020  --》sed
   abcdSdddde
   islHishbxld
   goBkefji
   daanshXxge
sed -i '/[A-Z]/&2020/gp' alpha.txt
不要直接对上面的源文件进行操作,建议复制到当前文件夹里进行

tee     在屏幕上输出,同时也写到文件里

-a或--append  附加到既有文件的后面,而非覆盖它

read 接受从键盘输入然后可以赋值给变量 

  格式: read  [选项]  变量名
-p:提示信息  prompt 
-s:隐藏输入  
-t:指定超时时间
-n:指定读取的长度


如何获取变量长度 ?

   1. ${#city}
   2. wc  -L

判断变量是否为空?

    [ -z $city ] 
    test -z  $city


流程控制

if判断语言

1.数学比较算法

运算符解释:

-eq 等于

-gt  大于

-lt 小于

-ge 大于或者等于

-le  小于或者等于

-ne 不等于

2.字符串比较运输

运算符解释,注意字符串一定别忘了使用引号引起来

== 等于

!= 不等于

-n 检查字符串的场地是否大于0

-z 检查字符串的长度是否为0

3.文件比较与检查

-d 检查文件是否存在且为目录

-e 检查文件是否存在

-f 检查文件是否存在且为文件

-r 检查文件是否存在且可读

-s 检查文件是否存在且不为空

-w 检查文件是否存在且可写

-x 检查文件是否存在且可执行

-o 检查文件是否芝并且被当前用户拥有

file1 -nt file2 检查file1是否比file2新

file1 -ot file2 检查file1是否比file2旧

-ef 检查两个文件是否有i相同的inode节点

特殊参数变量

$0 获取文件名,地址路径

$n 获取第n个参数

$# 获取参数的个数

$* 不加引号,获取参数。加引号,把所有参数看作一份数据

$@ 不加引号,获取参数。加引号,把每个参数看作一份数据。

shift 删除第一个参数,再将所有参数左移一格

$*和$@的区别:

$*和$@的作用没有什么区别,是获取所有参数的。

加了引号后:

"$*" 会将所有的参数从整体上看作一份数据,而不是把每个参数都看作一份数据

"$@" 仍然将每个参数都看作一份数据,彼此之间都是独立的。 

特殊状态变量

$?   获取脚本最后一次的返回值

$$   获取当前脚本的PID

$!   获取上一次后台执行进程的PID

$_   获取上一次命令的最后一个参数

预定义变量
$#:命令行中位置变量的个数
$*:所有位置变量的内容(较少使用)
$@:所有位置变量的内容
$0:当前执行的脚本文件名
$$ :当前shell的PID值, echo $$; ps $$, 常用作临时变量的后缀
$?:上一条命令执行后返回的状态,当返回状态值为0时表示执行正常,非0值表示执行异常或出错
$RANDOM :随机数,可以作为临时文件名
    touch  abc$RANDOM.txt

bash内置的字符串处理工具 

1.字符串变量切片: 
        ${var:offset:number} 
            取字符串的子串 
        name=jerry 
        echo ${name:2} //前2个不要  
        echo ${name:2:2} //前2个不要,拿出来2个 
        echo ${name: -4} //从右往左,取出4个,注:空白不能少 
2.查找删除: 
        1.自左往右: 
             #{var#*word} :其中word是指定的分隔符;功能:自左向右,查找var变量所存储的字符串中,第一次出现的word分隔符,删除字符串开头至此分隔符之间的所有字符 
                //开头到word不要 
             #{var##*word} :其中word是指定的分隔符;功能:自左向右,查找var变量所存储的字符串中,最后次出现的word分隔符,删除字符串开头至此分隔符之间的所有字符 
                //只要最后word之后。最后一个word之前都删除 
            [root@MT scripts]# path="/etc/init.d/fucntion/sdf" 
            [root@MT scripts]# echo ${path#*/} 
                etc/init.d/fucntion/sdf 
            [root@MT scripts]# echo ${path##*/} 
                sdf 
            注意:分隔符为“/" 
       2.自右往左 //*在word的左还是右,取决于从哪里开始匹配 
             #{var%word*} :其中word是指定的分隔符;功能:自右向左,查找var变量所存储的字符串中,第一次出现的word分隔符,删除字符串开头至此分隔符之间的所有字符 
                //尾部到word不要 
             #{var%%*word*} :其中word是指定的分隔符;功能:自右向左,查找var变量所存储的字符串中,最后次出现的word分隔符,删除字符串开头至此分隔符之间的所有字符 
                //只要最后word之后 
            [root@MT scripts]#  path="/etc/init.d/fucntion/sdf" 
            [root@MT scripts]# echo ${path%/*} 
                /etc/init.d/fucntion 
            [root@MT scripts]# echo ${path%%/*} 
                //为空,什么都没有 
 3.小结 
            ##*word 
            %%word* //记录这两种用法即可 
             
            #:自左向右*在word前 
            %:自右往左*在word后 
            //:全部替换 
            #行首 
            %行尾  

函数

#!/bin/bash

#定义的加法函数
add()
{
	sum=$(( $1 + $2 ))
	local sg="jiangda"
	echo  "$sum"
}
sub()
{
	echo "$sg sanchuang"
}
main()
{
	echo -e "1.add \n2.sub\n3.quit"
	read -p "请输入你的选项: 输入1|2|3: " num
	case  $num in
	1)
		add 20 30
		;;	
	2)
		sub
		;;	
	3)
		exit
		;;
	*)
		echo "请输入1 2 3 "
		;;
	esac
}
#调用main函数
main
func(){
	echo "$1"
	return 10
}

#调用函数的时候,然后将函数的执行结果赋值给变量,不是返回值,而是输出的值
num1=$(func 200 )

echo  $num1

在当前终端里运行--》父进程,不产生子进程去运行脚本
source /etc/init.d/functions
. /etc/init.d/functions

产生子进程去运行脚本
bash  /etc/init.d/functions
./etc/init.d/functions     需要授予可执行权限

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值