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. [MySQL]子语句的查询技巧

    一.统计group by语句的行数 group by语句中,如果包含字段统计函数(诸如:count(),sum()...),这种情况下统计函数只会作用于group by的字段,因此想拿到最终结果的行数 ...

  2. html5中如何去掉input type date默认

    html5中如何去掉input type date默认样式 2.对日期时间控件的样式进行修改目前WebKit下有如下9个伪元素可以改变日期控件的UI:::-webkit-datetime-edit – ...

  3. Linux 的 OOM 终结者(Out Of Memory killer)

    现在是早晨6点钟.已经醒来的我正在总结到底是什么事情使得我的起床闹铃提前了这么多.故事刚开始的时候,手机铃声恰好停止.又困又烦躁的我看了下手机,看看是不是我自己疯了把闹钟调得这么早,居然是早晨5点.然 ...

  4. ORACLE in与exists语句的区别

    select * from A where id in(select id from B) 以上查询使用了in语句,in()只执行一次,它查出B表中的所有id字段并缓存起来.之后,检查A表的id是否与 ...

  5. Confluence 6 新 Confluence 安装配置一个数据源连接

    如果在你的 Tomcat 中配置了数据源,并且Confluence 设置指南在安装的时候检测到这个配置的时候,配置数据源的选项将会提供给你进行配置.入股你希望使用数据源,请参考下面的配置. 1. 停止 ...

  6. angularjs 监听 文档click 事件

    项目 上遇到  innHTML  放入 一大段的html 内容 中带有 click 事件 如onclick="callInMethod("http://www.crm.bmcc.c ...

  7. npm无反应的问题&npm常用命令

    RT: windows安装完nodejs后做了相关环境变量配置后,cmd输入npm命令无反应,就光标一直闪,百度了半天终于找到解决办法 解决方法:C:\Users\Administrator(或你的账 ...

  8. ?:,reverse,vector的基本小结

    #include <cstdio> //此代码为网上所复制 #include <iostream> #include <string> #include <s ...

  9. ftp的自动部署以及添加虚拟账户的脚本

    #!/bin/bash #本脚本为自动化安装vsftp,使用虚拟用户认证登录ftp上传下载文件 echo =============================================== ...

  10. jmeter 中如何一次运行多条sql语句

    在jmeter测试mysql中如何一次运行多条sql语句 allowMultiQueries=true 注意:太低版本的mysql和jdbc不支持,最好用最新版的