博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
shell脚本编程笔记
阅读量:5253 次
发布时间:2019-06-14

本文共 4995 字,大约阅读时间需要 16 分钟。

1、第一行需指定所用的shell :    #!/bin/bash/

2、打印命令:echo

    -n:抑制换行

3、使用命令行参数:

$# : 传入脚本的命令行参数个数

$* : 所有命令行参数值,在各个参数值之间留有空格(作为一个单词处理)

$@: 所有命令行参数值(作为多个单词处理)

$0 : 命令本省(shell文件名)

$1 : 第一个命令行参数

$2 : 第二个命令行参数

获取用户输入的最后一个参数 ${!#} 不能用${$#}

4、数学计算:

expr做数学计算

把计算结果赋值给其它变量的时候需要加反引号

5、if语句:

if[ condition ]           #condition前后都要有空格

then

      commands

else

      commands

fi

if嵌套:

if command1

then

      command2

elif command3

then

      command4

fi

6、条件比较:

-eq   相同

-ne   不同

-gt   大于

-lt   小于

-ge   大于或等于

-le   小于或等于

-z    为空

-n    不为空

7、字符串比较:

str1 = str2           检查str1与str2是否相同

!=

-n str1            检查str1长度是否大于0

-z str1           检查str1长度是否为0    

8、文件比较:

-d file       检查file是否存在并且是一个目录

-e file       检查file是否存在

-f file        检查file是否存在并且是一个文件

-r file 检查file是否存在并且可读

-s file        检查file是否存在并且不为空

-w file       检查file是否存在并且可写

-x file        检查file是否存在并且可执行

-O file       检查file是否存在并且被当前用户拥有

-G file       检查file是否存在并且默认组是否为当前用户组

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

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

 

#两个条件同时满足

if [ condition1 ] && [ condition2 ]

then

      command1

fi

 

#两个条件其中一个满足

if [ condition1 ] || [ condition2 ]

then

      command1

fi

 

#取反

if [ ! condition ]

then

      command1

fi

 

双圆括号:

(( command1 ))   #允许像C一样的操作

 

case语句:

case variable in

pattern1)

      command1;;

pattern2)

      command2;;

*)                              # *号表示其它的值

      default commands;;

esac:

 

9、for语句:

方法1:

for var in list

do

      commands

done

方法2:

for((i = 0;i < 10;i++))

do

      commands

done

10、从文件中读取数据:

file="filename"

for data in `cat $file`

do

      echo "data is $data"

done

11、IFS : 改变内部字段分隔符

通常用法:

IFS_OLD=$IFS

IFS=$'\n':;

      code

IFS=$IFS_OLD

12、获取当前目录下的文件及文件的子文件:

#for file in `pwd`/*                   #通配,当前目录下所有文件

for file in `find`

do

      if [ -d "$file" ]

      then

           echo "$file is a directory"

      elif [ -f "$file" ]

      then

           echo "$file is a file"

      fi

done   > output.txt        #重定义循环输出

13、getopts命令:getopts optstring variable

参数:

      optstring : 选项字符串

      variable : 参数

如果选项字母需要参数值后面加上一个冒号

如果要禁止输出错误消息,那么使选项字符串以冒号开头

实例:

while getopts ab: opt

do

      case “$opt” in

a)    echo “found –a option”;;

b)    echo “found –b option with value $OPTARG”;;

esac

done

选项 描述 选项 描述
-a 显示所有对象 -n 使用非交互式(批量)模式
-c 生成计数 -o 指定一个输出文件来重定向输出
-d 指定目录 -q 以quiet模式执行
-e 展开对象 -r 递归处理目录和文件
-f 指定读取数据的文件 -s 以silent模式执行
-h 显示命令的帮助信息 -v 生成verbose输出
-i 忽略大小写 -x 排除和拒绝
-l 生成长个数的输出 -y 设置所有提问的回答为yes

 

 

 

 

 

                                        表13.1 常用的Linux命令行选项

14、读取用户输入:

基本读取read

read如果没有指定变量,默认存放在环境变量$REPLY中

-p : 可以在read命令中直接指定一个提示

-t : 指定一个等待输入时间,用法-t time

eg:

      if read –t 5 –p “plase input your name:” name  #会输入到错误流。。。

      then

           echo $name

      else

           echo –e “\nyou are too slow”

      fi

-n : 指定输入的字符数,当达到n指定的字符数自动结束输入,用法-n后面直接接要输入的字符数

-s : 是用户输入不显示在窗口上,如输入密码的时候

15、重定向:

将STDEER和STDOUT分开重定向:

eg:   ls –al test1 test2 2> error.txt 1> right.txt

将STDEER和STDOUT重定向到同一个文件:采用&>进行重定向

临时重定向:

eg: echo “this is an error” >&2                 #重定向到错误流

./bash.sh 2> tmp.txt                                 #重定向错误流到tmp

永久重定向:(无法切换回来)

exec 1> file

exec 2> errfile

重定义输入:(无法切换回来)

exec 0< inputfile

重定向文件描述符: (可切换回来)

通过文件描述符3把1(STDOUT)保存起来

exec 3>&1

exec 1>file

echo “someing write to file”

exec 1>&3

通过文件描述符4把0(STDIN)保存起来

exec 4<&0

exec 0<file

while read line

do

      echo $line

done

exec 0<&4

关闭文件描述符:

exec 3>&-

列出开放文件描述符:

/usr/bin/lsof

禁止命令输出:

commond > /dev/null        #输出到空文件

/dev/null >file                     #清空file里面的所有内容

创建临时文件:

mktemp

-t: 在/tmp下面创建临时文件

-d: 创建一个临时目录

file=`mktemp –t temp.XXXXXX`

消息记录:

tee: 将消息打印在STDOUT和tee所指定的文件里面

tee filename

-a 以追加的方式写入filename

16、脚本控制

终止信号:Ctrl+c

停止信号:Ctrl+z

信号捕获:trap commands signals

trap “echo hello world” SIGINT SIGTERM

脚本退出之前会执行执行一些命令:

trap “echo exit” EXIT

移除捕获:trap - EXIT

不使用控制台的情况下运行脚本:nohup ./xx.sh &

查看作业:jobs

参数 描述
-l 列出进程的PID和作业编号
-n 仅列出自上一次shell通知以来已经更改了状态的作业
-p 仅列出作业的PID
-r 仅列出运行的作业
-s 仅列出停止的作业

 

 

 

 

 

                                       表16.1 作业命令参数

重新启动停止的作业:bg 作业号     fg 作业号(后台运行)

17、数组变量与函数

数组的传递:

myarray=(0 1 2 3 4 5 6)

farray ${myarray[*]}

函数接收数组:

function farray

{

      local newarray

      newarray=(`echo “$@”`)

      echo “new array is: ${newarray[*]}”

      echo “the third number is: ${newarray[2]}”

}

18、创建库

. pathname 加载库

或者source pathname    #pathname为库的名称含路径如:./mylib

19、添加颜色

eg:^[[33m

^[是Ctrl+V的组合键后面一个[需要自己添加

20、sed编程

替换:s/pattern/replacdment/flags

flags:

-数字:表示新文本替换的模式

-g:表示用新文本替换现有文本的全部字符

-p:打印文本中包含替换字符串的那一行常和-n(禁止sed编辑器输出)一起使用

-w file: 将替换的结果写入文件

eg: sed ‘s/test/trial/2’ data           #替换每行的第二个test

使用地址:

eg:   sed ‘2,3s/dog/cat/’ file  #只替换2,3行里面的dog

           sed ‘2,$s/dog/cat/’ file #从第2行开始替换知道末尾

删除行:d (只从输出删除,原始文件不变)

eg:   sed ‘2d’ data       #删除第2行

插入和附加文本:

sed ‘[address]command\

new line’

command:

i: 在指定行之前添加新的一行

a: 在指定行之后添加新的一行    #$a\ 在文件末尾添加

eg:  echo “testing” | sed ‘i\

>this is a test’

更改行:c

eg:  sed ‘3c\

>this is a changed line ’ data

替换命令 sed ‘y/inchars/outchars/’

eg:  sed ‘y/123/789/’ data  #1->7  2->8  3->9

写文件: [address]w filename

读文件:   [address]r filename

21、正则表达式

正则表达式中的特殊字符:.*[]^${}\+|()  #作为文本字符需要转义\

定位符:

^[address] #address只能出现在文本开头的位置

[address]$ #address只能出现在文本结尾的位置

查找只包含一特定文本模式的数据行:

sed –n ‘/^this is a test$/p’ data              

移除空行:sed ‘/^$/d’ data

点字符:.     #通配一个字符    eg: sed –n ‘/.at/p’ data  # xat

字符类: echo “Yes” | sed –n ‘/[Yy]es/p’   #yes或Yes匹配

                 echo “yes” | sed –n ‘/[Yy][Ee][Ss]/p’  #yes/Yes/yEs…

 

否定字符类: sed –n ‘/[^ch]at/p’ data   #xat 除了cat和hat

使用范围:[0-9] #匹配0-9之间的数值

特殊字符

 

*:可以不出现或者出现多次

?:可以不出现或者出现一次

+:至少出现一次

{}:--->

m: 正好出现m次

m,n:出现至少m次最多n次

|:或者,用()括起来

(| |-|)  :要么没有要么为空格或-号

( |-|)   :空格或者-号

 

注意:gawk不能识别正则表达式,必须加上--re-interval命令

 

转载于:https://www.cnblogs.com/ape-ming/p/5097340.html

你可能感兴趣的文章
Java实现二分查找
查看>>
php7 新特性整理
查看>>
RabbitMQ、Redis、Memcache、SQLAlchemy
查看>>
03 线程池
查看>>
手机验证码执行流程
查看>>
设计模式课程 设计模式精讲 2-2 UML类图讲解
查看>>
Silverlight 的菜单控件。(不是 Toolkit的)
查看>>
jquery的contains方法
查看>>
linux后台运行和关闭SSH运行,查看后台任务
查看>>
桥接模式-Bridge(Java实现)
查看>>
303. Range Sum Query - Immutable
查看>>
C# Dynamic通用反序列化Json类型并遍历属性比较
查看>>
前台freemark获取后台的值
查看>>
Spring-hibernate整合
查看>>
c++ map
查看>>
exit和return的区别
查看>>
Django 相关
查看>>
Python(软件目录结构规范)
查看>>
codeforces水题100道 第二十二题 Codeforces Beta Round #89 (Div. 2) A. String Task (strings)
查看>>
c++||template
查看>>