1. 流程控制

if 判断

()[ 条件判断式 ],中括号和条件判断式之间必须有空格
()if后要有空格 [kris@hadoop datas]$ vim if.sh
#!/bin/bash
if [ $ -eq "" ]
then
echo "one"
elif [ $ -eq "" ]
then
echo "two"
else
echo "other"
fi
-------------------
#!/bin/bash
if [ $ -eq "" ]; then echo "one"
fi

运算式$[4%2] 和表达式[ 4 -eq 3 ],注意区别

for循环和if的使用


表达式
[kris@hadoop datas]$ vi for.sh
#!/bin/bash for ((i=;i<;i++))
do
if [ $[$i%] -eq ]
then
echo $i
fi
done 或者这样写:
for ((i=;i<;i++))
do
if [ $(($i%)) = ]; then echo $i
     fi
done [kris@hadoop datas]$ sh for.sh #!/bin/bash
for((i=;i<;i++))
do
if [ $(($i%)) = ]; then echo $i
elif [ $(($i%)) = ]; then echo $i
else echo "我是奇数"
fi
done

case

#!/bin/bash
case $ in
"")
echo "Monday"
;;
"")
echo "Tuesday"
;;
"")
echo "Wednesday"
;;
"")
echo "Thursday"
;;
"")
echo "Friday"
;;
*)
echo "Weekend"
;;
esac [kris@hadoop datas]$ ./case.sh
Wednesday

while循环

[kris@hadoop datas]$ vim while.sh
#!/bin/bash
i=
s=
while [ $i -le ]
do
s=$[$s+$i]
i=$[$i+]
done
echo $s
[kris@hadoop datas]$ sh while.sh

read读取控制台输入

-p:指定读取值时的提示符;
-t:指定读取值时等待的时间(秒)。
参数
变量:指定读取值的变量名 #/bin/bash
read -p "Please input a num in 5 seconds:" a
echo $a

函数function

bash 可以进入子shell,exit是退出来,

source a.sh是在当前shell执行
./a.sh是在子shell中执行的 export 使得当前shell和子shell中定义的变量都起作用

 系统函数

basename [string / pathname] [suffix]
(功能描述:basename命令会删掉所有的前缀包括最后一个(‘/’)字符,然后将字符串显示出来。
suffix为后缀,如果suffix被指定了,basename会将pathname或string中的suffix去掉。 [kris@hadoop datas]$ basename /home/kris/datas/while.sh
while.sh
[kris@hadoop datas]$ basename /home/kris/datas/while.sh .sh
while dirname 文件绝对路径 (功能描述:从给定的包含绝对路径的文件名中去除文件名(非目录的部分),然后返回剩下的路径(目录的部分))
[kris@hadoop datas]$ dirname /home/kris/datas/while.sh
/home/kris/datas

自定义函数

必须在调用函数地方之前,先声明函数,shell脚本是逐行运行。不会像其它语言一样先编译。
函数返回值,只能通过$?系统变量获得,可以显示加:return返回,如果不加,将以最后一条命令运行结果,作为返回值。return后跟数值n(-) #/bin/bash
function sum()
{
s=$
echo $s
}
sum $ $
~
~
[kris@hadoop datas]$
[kris@hadoop datas]$ sh function.sh

2. shell工具

cut

cut的工作就是“剪”,具体的说就是在文件中负责剪切数据用的。cut 命令从文件的每一行剪切字节、字符和字段并将这些字节、字符和字段输出。

-f (列号,提取第几列)   -d(分隔符,按照指定分隔符分割列)    -c   (指定具体字符,如5--9个字符)


[root@kris datas]# ifconfig | grep Bcast
inet addr:192.168.1.100 Bcast:192.168.1.255 Mask:255.255.255.0
[root@kris datas]# ifconfig | grep Bcast | cut -c -
inet [root@kris ~]# ifconfig | grep Bcast | cut -d : -f
192.168.1.100 Bcast
[root@kris ~]# ifconfig | grep Bcast | cut -d : -f | cut -d " " -f
192.168.1.100
[root@kris datas]# ifconfig | grep Bcast > temp.log ##### > 是把原来的内容覆盖、>>是在原内容基础上追加;
[root@kris datas]# cat temp.log
inet addr:192.168.1.100 Bcast:192.168.1.255 Mask:255.255.255.0
[root@kris datas]# cut -d : -f temp.log
192.168.1.100 Bcast
[root@kris datas]# cat temp.log | cut -d : -f 2 #####与上边是的等效的,只是temp.log所放的位置不一样
192.168.1.100 Bcast
[root@kris datas]# ifconfig | grep Bcast | cut -d : -f | cut -d " " -f
Bcast

sed

sed按行处理;

sed是一种流编辑器,它一次处理一行内容。处理时,把当前处理的行存储在临时缓冲区中,称为“模式空间”,接着用sed命令处理缓冲区中的内容,处理完成后,把缓冲区的内容送往屏幕。接着处理下一行,这样不断重复,直到文件末尾。文件内容并没有改变,除非你使用重定向存储输出

-e(直接在指令列模式上进行sed的动作编辑;两个修改指令的方式)  -i (在文件中直接编辑修改文件)

a(新增,a的后面可以接字串,在下一行出现 '2axxxx' )  d (删除)

s(查找并替换 ‘s/Link/xxxx/’ 

ifconfig | sed '1d'    删除第一行

 ifconfig | sed '1,5d' 删除掉前5行

 ifconfig | sed '1akris'  在第一行后面(第二行)追加kris

ifconfig | sed 's/Link/XXX/' 查找并替换;注意是区分大小写的,最后的/符号不要忘记了;

 ifconfig | sed 's/Link/XXX/' temp.log  #并不会改变文件内容

 ifconfig | sed -i 's/Link/XXX/' temp.log  加上-i就可以在文件中修改成功了;前提是文件中的内容必须是ifconfig输出内容;
ifconfig | sed '/^ *R/aXXX' 前边有若干个空格,以R开头的 [root@kris datas]# ifconfig | sed -e '/^ *R/aXXX' -e'/^ *T/d'
以R开头的追加XXX,把以T开头的删掉;这是两个式子就不能通过一个式子搞定了,需加-e改变修改方式,只有一个时可以省略;

awk

一个强大的文本分析工具,把文件逐行的读入,以空格为默认分隔符将每行切片,切开的部分再进行分析处理。

按行处理,可以对行内的数据进行更细微的操作;

awk [选项参数] ‘pattern1{action1}  pattern2{action2}...’ filename

  pattern:表示AWK在数据中查找的内容,就是匹配模式

  action:在找到匹配内容时所执行的一系列命令

  选项参数:-F(指定输入文件折分隔符)、-v(赋值一个用户定义变量)

cp /etc/passwd ./
[root@kris datas]# cat passwd | awk '/^a/{print}' 把以a开头的打印出来
[root@kris datas]# cat passwd | awk '/^a/{print}'
  adm:x:::adm:/var/adm:/sbin/nologin
  avahi-autoipd:x:::Avahi IPv4LL Stack:/var/lib/avahi-autoipd:/sbin/nologin
  abrt:x::::/etc/abrt:/sbin/nologin
  apache:x:::Apache:/var/www:/sbin/nologin
[root@kris datas]# cat passwd | awk -F : '/^a/{print $1}' //-F指定输入文件折分隔符
  adm
  avahi-autoipd
  abrt
  apache [root@kris datas]# cat passwd | awk -F: '/^a/{print $1} /^adm/{print}' 如果匹配到了以a开头就把print $1打印出来; 如果又匹配到了adm就把print整行打印出;

  adm
  adm:x:3:4:adm:/var/adm:/sbin/nologin
  avahi-autoipd
  abrt
  apache
  alex

#如果不写模板它就把所有行都打印出
[root@kris datas]# cat passwd | awk -F : '{print $1}'
  ......
[root@kris datas]# cat passwd | awk -F: 'BEGIN{print "begin"} {print$1} END{print "end"}'
  #begin在数据输入之前先执行BEGIN这个块里边的;END是所有数据处理完了再执行这个块里边的东西;
  begin
  ...
  end

 [kris@hadoop datas]$ cat passwd
  root:x:0:0:root:/root:/bin/bash
  bin:x:1:1:bin:/bin:/sbin/nologin
  daemon:x:2:2:daemon:/sbin:/sbin/nologin
  adm:x:3:4:adm:/var/adm:/sbin/nologin
  lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
  sync:x:5:0:sync:/sbin:/bin/sync
  shutdown:x:6:0:sh.....

[root@kris datas]# cat passwd | awk -F: 'BEGIN{sum=0;print "Sum="sum} {sum+=$3} END{print "Sum="sum}'  #把第3列的数值加到sum上,对文件的第3列做累加;
  Sum=
  Sum=
[root@kris datas]# cat passwd | awk -F: 'BEGIN{sum=0;print "Sum="sum} {sum+=$3; print $3"Sum="sum} END{print "Sum="sum}' ###上面求和的过程 [root@kris datas]# which awk
/bin/awk
[root@kris datas]# ll /bin/awk
lrwxrwxrwx. root root 9月 /bin/awk -> gawk
[root@kris datas]# cat passwd | awk -F: -v sum= 'BEGIN{print "Sum="sum} {sum+=$3; print $3"Sum="sum} END{print "Sum="sum}' #-v就是引入一个变量 awk的内置变量
[root@kris datas]# cat temp | awk 'BEGIN{sum=0}{sum+=1}/^$/{print sum}' #打印出文件的所有空行的行号,下面这种方法更简单; [root@kris datas]# cat temp | awk '/^$/{print NR}' #NR就起到sum的作用; 也可这样写: awk '/^$/{print NR}' temp [root@kris datas]# awk '/^$/{print FILENAME}' temp ##每列输出文件名
temp
temp
temp [root@kris datas]# awk -F : '{print NF}' passwd #######NF是按:切割的列数,一共多少列; ... [root@kris datas]# awk -F: '{print "filename:" FILENAME ", linenumber:" NR ",columns:"NF}' passwd
filename:passwd, linenumber:,columns:
filename:passwd, linenumber:,columns:
filename:passwd, linenumber:,columns:
[root@kris datas]# ifconfig eth0 | grep "inet addr" | awk -F: '{print $2}'
192.168.1.100 Bcast
[root@kris datas]# ifconfig eth0 | grep "inet addr" | awk -F: '{print $2}' | awk -F " " '{print $1}'
192.168.1.100
一个目录下(包括子目录)一共有多少个java文件? 如何取得每一个文件的名称? 
[kris@hadoop ~]$ sudo find / -name "*.java"
/root/anaconda3/pkgs/spyder-3.3.-py37_0/lib/python3./site-packages/spyder/utils/tests/data/example.java
/root/anaconda3/lib/python3./site-packages/spyder/utils/tests/data/example.java
[kris@hadoop ~]$ sudo find / -name "*.java" | awk -F "/" '{print $NF}' 以/切割,NF这行一共有多少列,如一共8列,$NF表取第8列
example.java
example.java

 [kris@hadoop ~]$ basename /opt/module/hive
  hive

 

practice

使用Linux命令查询file1中空行所在的行号
[krs@hadoop101 datas]$ awk '/^$/{print NR}' file1.txt
.有文件chengji.txt内容如下:
张三
李四
王五 使用Linux命令计算第二列的和并输出
[kris@hadoop datas]$ cat chengji.txt | awk -F " " '{sum+=$2} END{print sum}' ######### -F " " $2 分割的列不是从0开始数的,从1开始 .用shell写一个脚本,对文本中无序的一列数字排序
[kris@hadoop datas]$ sort -n text.txt

[kris@hadoop datas]$ sort -n text.txt | awk '{sum+=$0; print $0} END{print "sum="sum}'

  1
  2
  3
  4
  5
  6
  7
  8
  9
  10
  sum=55

3 用shell脚本写出查找当前文件夹(/home)下所有的文本文件内容中包含有字符”kris”的文件名称
  [kris@hadoop datas]$ grep -r "kris" /home/ | cut -d : -f

sort

-n(依照数值的大小排序) 、  -r (以相反的顺序来排序) 、 -t (设置排序时所用的分隔字符) 、 -k(指定需要排序的列)

[root@kris datas]# cat passwd | grep ^a | sort -t : -k
avahi-autoipd:x:::Avahi IPv4LL Stack:/var/lib/avahi-autoipd:/sbin/nologin
abrt:x::::/etc/abrt:/sbin/nologin
adm:x:::adm:/var/adm:/sbin/nologin
apache:x:::Apache:/var/www:/sbin/nologin
[root@kris datas]# cat passwd | grep ^a | sort -t : -k -n
  adm:x:3::adm:/var/adm:/sbin/nologin
  apache:x:48::Apache:/var/www:/sbin/nologin
  avahi-autoipd:x:170::Avahi IPv4LL Stack:/var/lib/avahi-autoipd:/sbin/nologin
  abrt:x:173:::/etc/abrt:/sbin/nologin
[root@kris datas]# cat passwd | grep ^a | sort -t : -k -nr
abrt:x:173:::/etc/abrt:/sbin/nologin
avahi-autoipd:x:170::Avahi IPv4LL Stack:/var/lib/avahi-autoipd:/sbin/nologin
apache:x:48::Apache:/var/www:/sbin/nologin
adm:x:3::adm:/var/adm:/sbin/nologin [root@kris datas]# sort -t : -nrk sort.sh
bb::5.4
bd::4.2
cls::3.5
xz::2.3
ss::1.6

Shell工具| 流程控制的更多相关文章

  1. shell编程--流程控制for,do-while,if-then,break,continue,case等

    2.5 流程控制 2.5.1 if语法 1.语法格式 if condition then     statements [elif condition     then statements. ..] ...

  2. shell编程流程控制

    前言: 在linux shell中,通常我们将一些命令写在一个文件中就算是一个shell脚本了,但是如果需要执行更为复杂的逻辑判断,我们就需要使用流程控制语句来支持了. 所谓流程控制既是通过使用流程控 ...

  3. 10、shell编程+流程控制+分支嵌套

    SHELL 编程     shell 是一个命令解释器,侦听用户指令.启动这些指令.将结果返回给用户(交互式的shell)     shell 也是一种简单的程序设计语言.利用它可以编写一些系统脚本. ...

  4. linux shell 之流程控制 if if else while

    (1)流程控制不可以为空: (2)if [ $(ps -ef | grep -c "ssh") -gt 1 ]; then echo "true"; fi 条件 ...

  5. shell 10流程控制

    if 判断 if #shell #!/bin/sh a=5 if [[ $a > 3 ]];then echo "$a>3" fi #写成一行 if [[ $a < ...

  6. shell之流程控制

    一.if语句.while.for循环各种小例题 1.用户验证 [root@bogon ~]# cat buer.sh #!/bin/bash #user='buer' #password='1234. ...

  7. Linux学习 -- Shell编程 -- 流程控制

    if语句 单分支 if [ 条件判断式 ]; then 程序 fi 或者 if [ 条件判断式 ] then 程序 fi 例子: 双分支 if [ 条件判断式 ] then 程序 else 程序 fi ...

  8. linux shell编程流程控制

    条件选择 单分支条件 多分支条件 选择执行if语句 单分支 if 判断条件;then 条件为真的分支代码 fi 双分支 if 判断条件; then 条件为真的分支代码 else 条件为假的分支代码 f ...

  9. Shell基础(六):使用awk提取文本、awk处理条件、awk综合脚本应用、awk流程控制、awk扩展应用

    一.使用awk提取文本 目标: 本案例要求使用awk工具完成下列过滤任务: 1> 练习awk工具的基本用法    2> 提取本机的IP地址.根分区使用率    3> 格式化输出/et ...

随机推荐

  1. appium常用方法

    1.输入中文 在capabilities中增加两项设置: capabilities.setCapability("unicodeKeyboard", "True" ...

  2. [其它]安装ios12 developer beta 3出错

    ios11设备升级到ios12有时候会出现 安装ios12 developer beta 3出错 提示.此时有一种可能就是,你手机或者ipad空间不足2G多(因为ios12是2.13G) 仅作为记录使 ...

  3. Spring Cloud Sleuth超详细实战

    为什么需要Spring Cloud Sleuth 微服务架构是一个分布式架构,它按业务划分服务单元,一个分布式系统往往有很多个服务单元.由于服务单元数量众多,业务的复杂性,如果出现了错误和异常,很难去 ...

  4. android中的LaunchMode详解----四种加载模式

    Activity有四种加载模式: standard singleTop singleTask singleInstance 配置加载模式的位置在AndroidManifest.xml文件中activi ...

  5. L1和L2正则

    https://blog.csdn.net/jinping_shi/article/details/52433975

  6. Windows下Oracle 11g安装以及创建数据库

    安装数据库 事实上Oracle安装 1.安装准备 Oracle的安装包下载以后是两个压缩包,同时选中两个压缩包右击进行解压 2.解压完成如下图所示 3.双击 setup.exe 文件进行安装,会弹出以 ...

  7. opencv 图像矫正

    四个坐标系的转换:https://blog.csdn.net/humanking7/article/details/44756073 标定和矫正:https://blog.csdn.net/u0134 ...

  8. vue三大框架

    vue 前端三大新框架: Angular.js------Google研发   缺点: 学习成本高.最早研发   严谨 React.js    facebook.com (脸书)自主研发  开源  j ...

  9. 异常小结:上一张图搞清楚Java的异常机制

    下面是Java异常类的组织结构,红色区域的异常类表示是程序需要显示捕捉或者抛出的. Throwable Throwable是Java异常的顶级类,所有的异常都继承于这个类. Error,Excepti ...

  10. springboot拦截器HandlerInterceptor详解

    Web开发中,我们除了使用 Filter 来过滤请web求外,还可以使用Spring提供的HandlerInterceptor(拦截器). HandlerInterceptor 的功能跟过滤器类似,但 ...