shell脚本编程笔记

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

2、打印命令:echo

-n:抑制换行

3、使用命令行参数:

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

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

[email protected]: 所有命令行参数值(作为多个单词处理)

$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 “[email protected]”`)

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命令

时间: 2024-12-11 13:55:29

shell脚本编程笔记的相关文章

Bash Shell脚本编程笔记总结(一)

本文是上课笔记总结,涉及细节知识点会在以后文章说明! bash脚本编程: 脚本程序:解释器解释执行: shell: 交互式接口:编程环境: shell: 能够提供一些内部命令,并且能通过PATH环境变量找到外部命令:把命令提交给内核启动为进程: 编程环境: 流程控制语句: 顺序执行: 循环执行: 选择执行: 条件测试:真.假 $? 命令的状态结果: 0: 真 1-255: 假 过程式的编程语言的元素:变量.流程.函数.数组 变量:局部变量.本地变量.环境变量.位置参数变量.特殊变量 变量: 数值

Bash Shell脚本编程笔记总结(二)

本文接上一部分:Bash Shell脚本编程笔记总结(一) 数组: 连续的多个独立内存空间,每个内存空间相当于一个变量 数组元素:数组名+索引 索引:从0开始编号 声明数组: declare -a ARRAR_NAME 关联数组: declare -A ARRAY_NAME 支持稀疏格式: 数组元素的赋值: (1) 一次只赋值一个元素 ARRAY[index]=VALUE a[0]="hello" (2) 一次赋值全部元素 ARRAY=("mon" "tu

Linux Shell脚本教程:30分钟玩转Shell脚本编程(笔记)

资料链接 Shell有两种执行命令的方式: 交互式(Interactive):解释执行用户的命令,用户输入一条命令,Shell就解释执行一条. 批处理(Batch):用户事先写一个Shell脚本(Script),其中有很多条命令,让Shell一次把这些命令执行完,而不必一条一条地敲命令. shell脚本有循环和控制语句,为解释执行,不需要编译. 常见的Shell脚本解释器: 有bash.sh.csh.ksh等.我们说的Shell其实是指Shell脚本解释器. bash:Linux默认的shell

linux shell脚本编程笔记(五): 重定向

I/O重定向 简述: 默认情况下始终有3个"文件"处于打开状态, stdin (键盘), stdout (屏幕), and stderr (错误消息输出到屏幕上). 这3个文件和其他打开的文件都可以被重定向. 对于重定向简单的解释就是捕捉一个文件, 命令, 程序, 脚本, 或者甚至是脚本中的代码块的输出, 然后将这些输出作为输入发送到另一个文件, 命令, 程序, 或脚本中. 每个打开的文件都会被分配一个文件描述符.stdin, stdout, 和stderr的文件描述符分别是0, 1,

linux shell脚本编程笔记(四): 获取字符串长度的七种方法

获取字符串长度的七种方法 1. \${#str} 2.awk的length 备注:1) 最好用{}来放置变量2) 也可以用length($0)来统计文件中每行的长度 3.awk的NF 备注: -F为分隔符,NF为域的个数,即单行字符串的长度 4.wc的-L 备注: -L参数1) 对多行文件来说,表示打印最长行的长度! 82,表示/etc/passwd文件最长行的长度为822) 对单行字符串而言,表示当前行字符串的长度! 5.wc -c 备注: 1) -c参数: 统计字符的个数2) -n参数: 去

shell脚本编程学习笔记(1)

在linux上编程,离不开shell,计划好好看看shell编程,并在这里做些笔记以供有相同兴趣的人分享,主要参考<shell脚本学习指南>. 学习shell脚本编程之前,需要了解脚本编程语言和编译型语言的概念. 一般很多中型.大型的程序是用编译型语言写成的,比如C.C++.Java等.这类程序从源代码编译成目标代码,直接通过计算机执行.编译型语言执行效率比较高,大多运作于底层,处理的是字节.整数.浮点数等机器层级的对象,因此实现一个具体的功能,比如"将一个目录里的所有文件复制到另外

Linux Shell脚本编程学习笔记和实战

http://www.1987.name/141.html shell基础 终端打印.算术运算.常用变量 Linux下搜索指定目录下特定字符串并高亮显示匹配关键词 从键盘或文件中获取标准输入 [read命令] 文件的描述符和重定向 数组.关联数组和别名使用 函数的定义.执行.传参和递归函数 条件测试操作与流程控制语句 获取时间日期格式和延时 [date.sleep命令] 内部字段分隔符IFS和脚本的调试DEBUG 显示.读取或拼接文件内容 [cat命令] 文件查找与打印文件列表 [find命令]

&lt;&lt;linux命令行与shell脚本编程大全&gt;&gt;学习笔记(1)

一章初识linux shell 一.什么是linux 1.linux系统可大致划分为四部分: l Linux内核 l GNU工具组件 l 图形化桌面环境 l 应用软件 在linux系统里,这四部分中的每一部分都扮演着一个特别的角色,但如果将他们分开,每一部分都没太大的作用. 1)探究linux内核 Linux系统的核心是内核,内核控制着计算机系统上的所有硬件和软件,必要时分配硬件,有时需要执行软件. 内核基本负责以下四项主要功能: l 系统内存管理 l 软件程序管理 l 硬件设备管理 l 文件系

【持续更新中】Linux命令行与Shell脚本编程大全(第3版)读书笔记12-20章

<Linux命令行与Shell脚本编程大全(第3版)>读书笔记 第十二章 使用结构化命令 根据条件使脚本跳过某些命令,这样的命令称为结构化命令(structured command).结构化命令允许改变程序执行的顺序. If-then语句: If command Then Commands Fi 如果if后的command执行退出码是0(也就是执行成功了),then后面的语句就会被执行. 也可以写成: If command; then Commands Fi 注意了,if后的command结果