Shell小结

1.数字计算 declare -i num=10 while [ $num -ne 0] do  num=num-1 done

num=10 while [ $num -ne 0] do  let 'num -= 1'  #let 'num = num -1'  #num=`expr $num -1`  (( num-- )) #用(( )) 可以使用类C风格的计算式,注意算式两边要加空格(( t = a<457:11)) done

let 'num = $RANDOM % 6 + 1'

2.读入文件 while read line do  echo $line done<filename

#读入一下目录下所有文件,所打印出来 FILES='ls' for file in $FILES do  while read word  do   echo $word  done<$file done 3.for循环 for name in "derry china" "daisy usa" "jintaiqi korea" do  echo $name done

#显示一下目录下以sh结尾的文件 for file in *[sh] do  ls -lh $file done

for ((a=1,b=1; a<=LIMIT; a++, b++)) do  echo -n "$a-$b" done

4.while循环 i=0 while ($i < 10) #while [ "$i" -lt 10 ] do  echo $i  #((i++))  #i=`expr $i + 1`  let "i += 1" done

#读入所有命令行参数 while [ $# -gt 0 ] do  echo $1  shift done

5.until循环 i=0 until ((i >= 10)) do  echo $i  ((i++)) done

6.case read cmd case "$cmd" in  "quit" | "q" ) echo "quit"; exit 0;;  "ls" ) `ls`;;  "date" ) `date`;; esac

7.常用函数 #检查是否全部字母输入 SUCCESS=0 FAILURE=-1 isalpha() { if [ -z $1] then return $FAILURE fi

case "$1" in *[!a-zA-Z]*|"") return $FAILURE;; *           ) return $SUCCESS;; esac }

#检查是否全部数字输入 isdigit() { [ $# -eq 1] || return $FAILURE

case $i in *[!0-9]*|"") return $FAILURE;; *          ) return $SUCCESS;;   }

for param in 0 a 9 % do  if isdigit "$param"  then echo "$param is digit"  else echo "$param is not digit"  fi done 5.字符串操作 string=defabcdefxyz len=`expr length string` pos=`expr index $string abc`   #查找第一个字串的位置 str=`expr substr $string 2 6` #取指定位置的子串

6.文件包含 config.sh: IP=192.168.0.1

read.sh . config.sh #source config.sh echo $IP

7.test测试命令 test命令用于检查某个条件是否成立,它可以进行数值、字符和文件三个方面的测试,其测试符和相应的功能分别如下:

(1)数值测试: -eq:等于则为真 -ne:不等于则为真 -gt:大于则为真 -ge:大于等于则为真 -lt:小于则为真 -le:小于等于则为真 (2)字符串测试: =:等于则为真 !=:不相等则为真 -z 字符串:字符串长度伪则为真 -n 字符串:字符串长度不伪则为真 (3)文件测试: -e 文件名:如果文件存在则为真 -r 文件名:如果文件存在且可读则为真 -w 文件名:如果文件存在且可写则为真 -x 文件名:如果文件存在且可执行则为真 -s 文件名:如果文件存在且至少有一个字符则为真 -d 文件名:如果文件存在且为目录则为真 -f 文件名:如果文件存在且为普通文件则为真 -c 文件名:如果文件存在且为字符型特殊文件则为真 -b 文件名:如果文件存在且为块特殊文件则为真 另外,Linux还提供了与(“!”)、或(“-o)、非(“-a”)三个逻辑操作符用于将测试条件连接起来,其优先级为:“!”最高,“-a”次之,“-o”最低。 同时,bash也能完成简单的算术运算,格式如下: $[expression] 例如:var1=2 var2=$[var1*10+1] 则:var2的值为21。

8.命令分组 在shell中有两种命令分组的方法:“()”和“{}”,前者当shell执行()中的命令时将再创建一个新的子进程,然后这个子进程去执行圆括弧中的命令。 当用户在执行某个命令时不想让命令运行时对状态集合(如位置参数、环境变量、当前工作目录等)的改变影响到下面语句的执行时,就应该把这些 命令放在圆括弧中,这样就能保证所有的改变只对子进程产生影响,而父进程不受任何干扰;{}用于将顺序执行的命令的输出结果用于另一个命令 的输入(管道方式)。当我们要真正使用圆括弧和花括弧时(如计算表达式的优先级),则需要在其前面加上转义符(/)以便让shell知道它们不是用于 命令执行的控制所用。

9.信号 trap命令用于在shell程序中捕捉到信号,之后可以有三种反应方式: (1)执行一段程序来处理这一信号 (2)接受信号的默认操作 (3)忽视这一信号

trap对上面三种方式提供了三种基本形式: 第一种形式的trap命令在shell接收到signal list清单中数值相同的信号时,将执行双引号中的命令串。

trap 'commands' signal-list trap "commands" signal-list

为了恢复信号的默认操作,使用第二种形式的trap命令:trap signal-list

第三种形式的trap命令允许忽视信号:trap " " signal-list

注意:(1)对信号11(段违例)不能捕捉,因为shell本身需要捕捉该信号去进行内存的转储。 (2)在trap中可以定义对信号0的处理(实际上没有这个信号),shell程序在其终止(如执行exit语句)时发出该信号。 (3)在捕捉到signal-list中指定的信号并执行完相应的命令之后,如果这些命令没有将shell程序终止的话,shell程序将继续执行收到信号时所执行的命令后面的命令,这样将很容易导致shell程序无法终止。 另外,在trap语句中,单引号和双引号是不同的,当shell程序第一次碰到trap语句时,将把commands中的命令扫描一遍。此时若commands是用单引号括起来的话,那么shell不会对commands中的变量和命令进行替换,否则commands中的变量和命令将用当时具体的值来替换。

10. bash的内部命令

1.eval 命令格式:eval args 功能:当shell程序执行到eval语句时,shell读入参数args,并将它们组合成一个新的命令,然后执行。 for i in ls df; do  ret=eval $i  echo $value done

2.exec 命令格式:exec 命令 命令参数 功能:当shell执行到exec语句时,不会去创建新的子进程,而是转去执行指定的命令,当指定的命令执行完时,该进程,也就是最初的shell就终止了,所以shell程序 中exec后面的语句将不再被执行。

#调用子进程 ret=`exec ./wait.sh` #输出子进程返回值 echo $? #输出子进程输出 echo $ret

3.export 命令格式:export 变量名 或:export 变量名=变量值 功能:shell可以用export把它的变量向下带入子shell从而让子进程继承父进程中的环境变量。但子shell不能用export把它的变量向上带入父shell。

注意:不带任何变量名的export语句将显示出当前所有的export变量。

4.wait 功能:是shell等待在后台启动的所有子进程结束。Wait的返回值总是真。 #!/bin/bash eval ./wait.sh & wait

5. 特殊参数 $*: 代表所有参数,其间隔为IFS内定参数的第一个字元 $@: 与*星号类同。不同之处在於不参照IFS $#: 代表参数数量 $?: 执行上一个指令的返回值 $-: 最近执行的foreground pipeline的选项参数 $$: 本身的Process ID $: 执行上一个背景指令的PID $_: 显示出最後一个执行的命令

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏java一日一条

深入分析Java线程中断机制

在平时的开发过程中,相信都会使用到多线程,在使用多线程时,大家也会遇到各种各样的问题,今天我们就来说说一个多线程的问题——线程中断。在java中启动线程非常容易...

11220
来自专栏AILearning

多线程的基础学习

进程:是一个正在执行中的程序, 每一个进程执行都有一个执行顺序,该顺序是一个执行路径,或者叫一个控制单元。 线程:是进程中的一个独立的控制单元, 线程在控制中进...

19670
来自专栏林冠宏的技术文章

Golang 的 协程调度机制 与 GOMAXPROCS 性能调优

Golang 简称 Go,Go 的协程(goroutine) 和我们常见的线程(Thread)一样,拥有其调度器。

49910
来自专栏面朝大海春暖花开

微信小程序setData()对数组的操作

但是对于数组而言,再直接修改一个完整的数组显得有些多余,首先写着不简易,其次效率很是滴。

56950
来自专栏IMWeb前端团队

hapi vs. express [1] —— 路由

hapi vs. express [1] —— 路由 前言 express 与 hapi 是两个基于 nodejs 的 web server 开发框架,它们由于...

26150
来自专栏C/C++基础

C++覆盖或删除指定位置的文件内容

我们经常使用ofstream或者fstream可写文件,使用ifstream可以写文件,但需要设置文件的打开状态为ios::out。C++中IO流打开模式使用位...

16530
来自专栏开源优测

接口测试 | 25 requests + pytest测试实例

概述 本文主要分享如何将pytest和requests结合一起使用,让大家有个初步的了解。 主要内容有: pytest简介 pytest + requests示...

76090
来自专栏禅林阆苑

redis学习笔记

优点: 高并发读写性能、大数据量扩展(分布式存储)、配置简单、操作与数据模型灵活高效、成本 低廉

21340
来自专栏Python绿色通道

Python的进程

Python实现多进程的方式主要有两种:一种方法是使用os模块中的fork方法; 另一种是使用multiprocessing模块。这两种方法的区别在于前者仅适用...

14720
来自专栏python百例

29-文件对象基础操作

12420

扫码关注云+社区

领取腾讯云代金券