Presentation is loading. Please wait.

Presentation is loading. Please wait.

Shell程序设计 曙光信息产业股份有限公司.

Similar presentations


Presentation on theme: "Shell程序设计 曙光信息产业股份有限公司."— Presentation transcript:

1 Shell程序设计 曙光信息产业股份有限公司

2 提纲 Shell简介 Bash编程基础 常用字符处理工具介绍

3 什么是Shell? hardware 命令解释器 程序设计语言 脚本(Scripting) Shell Applications
Kernel Shell Applications 命令解释器 程序设计语言 脚本(Scripting)

4 为什么要学习Shell? Shell是Linux的用户接口 简单易用的命令组合完成复杂任务 强大的综合处理功能 一生受用好工具 ...

5 Shell有哪些种类? /bin/csh (c-like shell)‏
/bin/ksh (kornshell, by AT&T Bell LAB)‏ /bin/tcsh (enhanced csh, FreeBSD default login shell)‏ /bin/bash (bourne-again shell)‏ /bin/dash ... 当前系统安装的Shell可以通过 cat /etc/shells 查看 用户的默认登录Shell可以通过 cat /etc/passwd 查看 tom:x:500:500:tom:/home/tom:/bin/bash

6 提纲 Shell简介 Bash编程基础 常用字符处理工具介绍

7 Bash Shell 发展历史: AT & T 设计Unix 时设计了Bourne Shell;
Bash: Bourne Again Shell, GNU Project 大多数Linux发行版的默认Shell;

8 Bash的内部命令 Bash集成了一些内部命令,组成基本操作环境 常用的内部命令:
:(true) .(source) alias bg bind builtin cd declare dirs disown echo enable eval exec exit export fc fg getopts hash help history jobs kill let local logout popd pushd pwd read readonly return set shift stop suspend test times trap typest ultimit umask unalias unset wait 循环分支控制相关: if else elif fi for do done case while until continue break

9 Bash的初始化脚本 通常在这些脚本中进行自定义设置,比如一些程序的环境变量等 /etc/profile /etc/bashrc
˜/.bash profile ˜/.bash login ˜/.bashrc ˜/.profile

10 Bash的执行方式(交互式) Linux终端登录后,即进入交互式的执行环境 可以执行内部及外部命令 foo@localhost> ls
a.txt b.txt c.txt hostname localhost 后台执行: command & sleep 300 &

11 Bash的执行方式(脚本方式) 脚本执行方式,将Bash语句写在文本文件中,批量执行 #开头表示注释
不开启子Shell,在当前Shell中运行: source test.sh . test.sh eval `cat test.sh` 在新的子Shell中运行: bash -c 'commands' bash test.sh ./test.sh (脚本文件以#!/bin/bash开头,且具有可执行权限)

12 Bash命令的组合方式 不同的命令可分行放置,也可以用分号隔开 #!/bin/bash cd subdir1 rm a.txt
cd /home/foo/subdir2; rm b.txt

13 Bash命令的组合方式(逻辑组合) 管道线分隔符 command1 && command2 (前者执行成功才执行后者)
cd /home/foo && rm b.txt cd /home/foo || echo "dir does not exist!"

14 Bash命令的组合方式(命令集合) 命令集合 { commands; } 命令集合,在当前Shell执行,注意{}前后的空格和分号
{ cd /home/foo; rm a.txt; } (cd /home/foo; rm a.txt)

15 Bash的别名设置(alias) 可以定义一些命令的别名,方便使用,别名设置可以放在Bash的初始化脚本中自动加载
alias ll='ls -l --color=tty' alias ll alias ll='ls -l --color=tty' alias rm='rm -i' unalias ll 取消别名

16 Bash的变量 变量申明、查看、清除 var=value #注意=号前后无空格 echo $var unset var
var1=abc echo $var1 abc unset var1 (无输出)

17 Bash的变量(系统变量) 常用系统变量: foo@localhost> echo $SHELL /bin/bash
HOSTNAME TERM PATH HOME PWD SHELL ... echo $SHELL /bin/bash echo $HOME /home/foo

18 Bash的变量(全局变量) 全局变量(子Shell会继承) export var=value
export var1=abc var2=123 export var2 bash -c 'echo $var1 $var2' abc 123

19 Bash的变量(特殊变量) foo@localhost> cat test.sh #!/bin/bash
$? 前一个命令的退出状态,正常退出返回0,异常退出返回非0值 $# 脚本或函数位置参数的个数 $0 脚本或函数的名称 $1, $2, ... 传递给脚本或函数的位置参数 $* 以”$1 $2...”的形式保存所有输入的命令行参数 以“$1”“$2”...的形式保存所有输入的命令行参数 cat test.sh #!/bin/bash echo "The command is $0 $1 $2" ./test.sh arg1 arg2 The command is test.sh arg1 arg2

20 Bash的变量(特殊变量) foo@localhost> ls a.txt b.txt
echo $? ls c.txt ls: cannot access c.txt: No such file or directory 2

21 Bash的通配符 通配符 * 配任何字符串,包括空字符串 ? 匹配任何单个字符 [] 按照字符范围或列表匹配
* 配任何字符串,包括空字符串 ? 匹配任何单个字符 [] 按照字符范围或列表匹配 {...,...} 按照字符串列表匹配 \ 转意符,使元字符失去其特殊的含义 ls *.txt ls A0?.txt ls [A-Z,a-z][0-9].txt ls [!a-z]*.txt ls abc.{txt,tar,dat} echo \*

22 Bash的命令替换 命令替换:把命令的输出结果字符串直接替换进来 `commands` 注意是反引号,不是单引号 $(commands)
echo `date` Sun Jan 9 15:38: files=`ls` currentdir=$(pwd)

23 Bash的变量参数替换 ${variable-default} 如果变量没有定义,则返回默认值 注意: 变量定义成空字符串也算定义
echo $username 无输出 echo ${username-`whoami`} foo

24 Bash的变量参数替换(续1) ${variable=default} 如果变量没有定义,返回默认值,且赋值给变量
echo $username 无输出 echo ${username=`whoami`} foo

25 Bash的变量参数替换(续2) ${variable+value} 如果变量已经定义,返回+号后给定值,如果没有,返回空
${variable?msg} 如果变量已经定义,返回变量本身,如果没有,打印给定msg

26 Bash的变量字符串操作(子串提取) ${#string} 返回字符串的长度 ${string:position} 提取从指定位置开始的子串
${string:position:length} 提取从指定位置开始的定长子串 string=01234 echo ${#string} 5 echo ${string:2} 234 echo ${string:2:2} 23

27 Bash的变量字符串操作(子串剪裁) ${string#substring} 裁去从左边最短匹配子串
如果子串不匹配,不做裁剪操作 string=abc.txt echo ${string#abc} .txt echo ${string%.*} abc

28 Bash的变量字符串操作(子串替换) ${string/substring/replace} 替换第一处匹配
如果子串不匹配,不做裁剪操作 string=black-black echo ${string/black/white} white-black echo ${string//black/white} white-white

29 Bash的变量数组(Array) 赋值: array[0]=value1 array[1]=value2 ... 或者一次性赋值:
array=(value1 value2 ...) 元素引用: ${#array[*]} 变量元素个数 ${array[0]} 某个变量值 ${array[*]} 全部变量值 array=(dog fish cat) echo ${#array[*]} 3 echo ${array[*]} dog fish cat echo ${array[0]} dog

30 Bash的终端控制(输入输出重定向) < 重定向stdin到文件 > 重定向stdout到文件(新建或覆盖)
Linux 默认的三个I/O 通道: stdin(标准输入,文件描述符:0) – 默认是键盘 stdout(标准输出,文件描述符:1) – 默认是终端 stderr(标准错误,文件描述符:2) – 默认是终端 < 重定向stdin到文件 > 重定向stdout到文件(新建或覆盖) >> 重定向stdout到文件(追加) 2> 重定向stderr到文件(新建或覆盖) 2>> 重定向stderr到文件(追加) 2>&1 重定向stderr到stdout >& 重定向stdout和stderr到文件

31 Bash的终端控制(输出重定向) foo@localhost> ls *.{txt,dat}
ls: cannot access *.txt: No such file or directory a.dat b.dat ls *.{txt,dat} >/tmp/ls.out cat /tmp/ls.out ls *.{txt,dat} >/tmp/ls.out 2>/tmp/err.out cat /tmp/err.out

32 Bash的终端控制(输入重定向) 命令的输入定向到文件,而不是从键盘输入
tr 'a-z' 'A-Z' </etc/hosts tr 'a-z' 'A-Z' </etc/hosts >result.log

33 Bash的终端控制(重定向到特殊文件) 可以重定向到特殊字符设备文件 e.g.
ls >result.log 2>/dev/null 注:Linux下常用的特殊字符设备文件: /dev/null ——“空文件”或“黑洞文件”,丢弃一切写入的内容 /dev/zero —— 永远提供NULL空字符

34 Bash的终端控制(管道符) 管道符pipe(|),将命令的输出定向到下一条命令的输入
ls /usr/lib | less cut -f1 -d: /etc/passwd | sort -r | less cut -f1 -d: /etc/passwd | sort -r > result.log

35 Bash读入变量(read) 使用内部命令read,可以从终端读入Shell变量 与C语言的scanf()类似
格式:read [-p 提示字符] var1 [var2] cat read_test.sh #!/bin/bash read name age echo $name is $age years old. ./read_test.sh 输入Bob 17,按Ctrl-d Bob is 17 years old. echo Bob 17 | ./read_test.sh

36 Bash中的引号 单引号屏蔽所有特殊字符 foo@localhost> echo '$HOME' $HOME
/home/foo echo " '$HOME' " '/home/foo' echo " \"$HOME\" " "/home/foo"

37 Bash中的数学运算(内部命令) 内置命名 let 或 ((...)),只能用于整型运算
echo $(( (1+1)*(2*2) )) 8 a=1 ((a+=1)) echo $a 2 let a+=1

38 Bash中的数学运算(外部命令) 调用外部命令expr,只能用于整型运算
expr \( \) \* \(2 \* 2 \) 8 a=`expr 1 + 1` echo $a 2 注意括号和运算符前后有空格

39 Bash中的数学运算(外部命令) 调用外部命令bc,可用于浮点运算,功能强大
echo '1.2*1.2' | bc -l 1.44 echo "ibase=10; obase=2; 10" | bc 1010

40 Bash中的逻辑判断 内部命令test,可用于数字比较、字符串比较、文件状态检查、逻辑判断等。语法: test condition 或
test 1 == 1; echo $? [ 1 == 2 ]; echo $? 1

41 Bash中的逻辑判断(字符串比较) =或== 两个字符串相等 != 两个字符串不等 -z 空字符串 -n 非空字符串
=或== 两个字符串相等 != 两个字符串不等 -z 空字符串 -n 非空字符串 =~ 与正则表达式regex进行比较 str="abc" [ "$str" = "abc" ] && echo "true" true [ -z "$str" ] && echo "true" 无输出

42 Bash中的逻辑判断(整数比较) -eq或== 两个整数相等 -ne或!= 两个整数不等 -gt或> 前者大于后者
-ge或>= 前者大于等于后者 -lt或< 前者小于后者 -le或<= 前者小于等于后者 var=1 [ $var >= 1 ] && echo "true" true [ $var < 0 ] && echo "true" 无输出

43 Bash中的逻辑判断(文件状态判断) -d 所判断文件是一个目录 -f 正规文件(Regular file) -L 符号链接
-r Readable(文件、目录可读) -w Writable(文件、目录可写) -x Executable(文件可执行、目录可浏览) -u 文件有suid 权限标志 -s 文件长度大于0,非空 -z 文件长度等于0 file=/etc/hosts [ -r $file ] && echo "read permission OK" read permission OK

44 Bash中的逻辑判断(逻辑操作符) condition1 -a condition2 逻辑与
condition1 -o condition2 逻辑或 ! condition 逻辑取非 a=2; b=3 [ $a > 1 -a $b > 1 ] && echo "true" true [ ! $a > 1 ] && echo "true" 无输出

45 Bash中的分支判断(if语句) if condition_judgement then ... fi
elif condition_judgement2 else fi if condition_judgement then ... else fi

46 Bash中的分支判断(if语句) #!/bin/bash if [ $1 > 1 ] then
举例: #!/bin/bash if [ $1 > 1 ] then echo "Greater than 1" elif [ $1 < 1 ] echo "Less than 1" else echo “Equals to 1" fi #!/bin/bash if cd /tmp/test &>/dev/null then echo “Entering dir succeeds" fi 条件判断也可以是命令,执行成功表示真

47 Bash中的分支判断(case语句) case expression in pattern1) ...;; pattern2) ...
patternn) esac case expression in pattern1) ...;; pattern2) ... patternn) *) esac

48 Bash中的分支判断(case语句) #!/bin/bash case $1 in apple)
举例: #!/bin/bash case $1 in apple) echo "You choose apple";; grape) echo "You choose grape";; *) echo “I have only apple and grape";; esac

49 Bash中的循环控制(for循环) for var in value_list do ... done
for ((var=0; var<=10; var++)) do ... done

50 Bash中的循环控制(for循环) for name in tom bob cindy do echo $name done
举例: for name in tom bob cindy do echo $name done for i in `seq 1 10` do ssh node$i date done 变量取值也可以来自其它命令的输出 for ((i=0; i<=10; i++)) do echo $i done

51 Bash中的循环控制(while循环) while condition_judgement do ... done 条件判断可以是:
test 或 [ .. ] 语句 其它命令,判断其执行成功与否 true 或 : (Bash的内部命令,代表真,使得while成为无限循环)

52 Bash中的循环控制(while循环) COUNTER=0
举例一: COUNTER=0 # If COUNTER < 5, program will print the value of it. while [ "$COUNTER" < 5 ] do COUNTER=$((COUNTER+1)) echo $COUNTER done

53 Bash中的循环控制(while循环) NUMBER=0 while [ "$NUMBER" != "9" ]; do
举例二:不停地从终端读入一个整数,输入9则退出 NUMBER=0 while [ "$NUMBER" != "9" ]; do read -p 'Enter a integer, 9 to exit' NUMBER echo You typed is $NUMBER done

54 Bash中的循环控制(while循环) while read LINE do
举例三:逐行读取文件的内容,进行部分内容替换 while read LINE do echo $LINE | sed -e "s/node/blade/" done </etc/hosts

55 Bash中的循环控制(while循环) target_pid=10254 while true do sleep 10
举例四:无限循环及跳出 target_pid=10254 while true do sleep 10 if ! ps $target_pid &>/dev/null then break fi done break语句用于跳出循环 break <n>,可以跳出多重循环

56 Bash中的循环控制(until循环) until condition_judgement do ... done
与while循环语法一致,但意思“相反”,没有while循环常用 until循环是先执行循环,直到满足判断条件后跳出

57 Bash中的函数 function_name() { ... } function_name
在Shell 中,函数就是一组实现一定功能的命令集合; 函数由两部分组成: 函数名(在一个脚本中必须唯一); 函数体(命令集合); function_name() { ... } #先定义,后使用 function_name

58 Bash中的函数(函数参数) swap_filename() { file1=$1 file2=$2 cp $file1 file1.bak
举例:交换两个文件的文件名 swap_filename() { file1=$1 file2=$2 cp $file1 file1.bak mv $file2 $file1 mv $file1.bak $file2 }

59 Bash中的函数(函数的退出状态) check_file_lines() { file=$1 lines=`wc -l $file`
函数结尾可以掉用return语句返回执行状态,0表示无错误 举例: check_file_lines() { file=$1 lines=`wc -l $file` if [ $lines -gt 1000 ]; then return 0 else return -1 fi } check_file_lines result.log && echo "file is long enough"

60 提纲 Shell简介 Bash编程基础 常用字符处理工具介绍

61 正则表达式regex 正则表达式:进行精确文字匹配的句法规则;比通配符强大无数倍 Regex的基本元字符集: . 匹配任意单个字符 *
一个单字符后紧跟*,表示匹配该字符0次或任意多次 ^ 匹配行首 $ 匹配行尾 [] 匹配序列中的任何一个,比如[abc123]、[a-z0-9] [^...]匹配非序列中的字符 \ 转意特殊字符 pattern{n} 匹配规则重复n次 pattern{n,} 匹配规则重复至少n次 pattern{n,m} 匹配规则重复至少n次,至多m次

62 正则表达式regex(续1) Regex的扩展元字符集: Regex举例: + 一个单字符后紧跟+,表示匹配该字符1次或任意多次 ?
一个单字符后紧跟?,表示匹配该字符0次或1次 (patterns) 匹配规则组合 Regex举例: ^The 匹配行首的The .* 匹配任意字符或字符串 ^$ 匹配空行 ^.*$ 匹配任意行 A[0-9]\.txt 匹配A0.txt,A1.txt,...,A9.txt [^0-9a-zA-Z] 匹配非数字或字母的字符 \([0-9]\{1,3\}\.\)\{3\}[0-9]\{1,3\} 匹配IPv4的IP地址

63 字符查找工具grep grep 是 Linux 下使用最广泛的命令之一,其作用是在一个或多个文件中查找某个字符模式所在的行,并将结果输出到屏幕上 grep 以行为单位进行处理,不会对输入文件本身进行修改 grep 家族由 grep、egrep 和 fgrep 组成: grep: 标准 grep 命令,本文主要讨论此命令。 egrep: 扩展 grep,支持基本及扩展的正则表达式。 fgrep: 固定 grep (fixed grep),按字面解释所有的字符,即正则表达式中的元字符不会被特殊处理。

64 字符查找工具grep(续1) 可以把匹配模式写入到一个文件中,每行写一个,然后使用 -f 选项,将该匹配模式传递给 grep 命令
grep [选项] pattern file1 file2 ... pattern:可以是正则表达式(用单引号括起来)、 或字符串(加双引号)、或一个单词。 file1 file2 ... :文件名列表,作为 grep 命令的输入;grep 的输入也可以来自标准输入或管道; 可以把匹配模式写入到一个文件中,每行写一个,然后使用 -f 选项,将该匹配模式传递给 grep 命令 grep -f patternfile file1 file2 ...

65 字符查找工具grep (续2) grep 常用选项 -c 只输出匹配的行的总数 -i 不区分大小写 -h 查询多个文件时,不显示文件名 -l
查询多个文件时,只输出包含匹配模式的文件的文件名 -n 显示匹配的行及行号 -v 反向查找,即只显示不包含匹配模式的行 -s 不显示错误信息 grep -i 'an*' datafile

66 字符查找工具grep(举例) 查找包含字符串Hello的行 grep 'Hello' datafile 查找以#开头的行
grep '^#' datafile 查找非空行并另存 grep -v '^$' datafile >datefile2 与管道符连用 cat /etc/hosts | grep 'node' | wc -l

67 字符流编辑工具sed sed 是什么 sed 是一个精简的、非交互式的编辑器 sed 如何工作

68 字符流编辑工具sed(续1) sed的命令行调用方式 sed [-n][-e] 'sed_cmd' input_file
-n:缺省情况下,sed 在将下一行读入缓冲区之前,自动输出行缓冲区中的内容。此选项可以关闭自动输出。 -e:允许调用多条 sed 命令,如: sed -e 'sed_cmd1' -e 'sed_cmd2' input_file sed_cmd:使用格式: [address]sed_edit_cmd (通常用单引号括起来),其中 address 为 sed 的行定位模式,用于指定将要被 sed 编辑的行。如果省略,sed 将编辑所有的行。sed_edit_cmd 为 sed 对被编辑行将要进行的编辑操作。 input_file:sed 编辑的文件列表,若省略,sed 将从标准输入(重定向或管道)中读取输入。

69 字符流编辑工具sed (续2) 也可以将 sed 命令存在脚本文件,然后调用
sed [选项] -f sed_script_file input_file 例:sed -n -f sedfile1 datafile 将 sed 命令插入脚本文件,生成 sed 可执行脚本文件,在命令行中直接键入脚本文件名来执行。 #!/bin/sed -f sed_cmd1 例:./sedfile2.sed -n datafile

70 字符流编辑工具sed (续3) sed_cmd 中 address 的定位方式 n 表示第 n 行 $ 表示最后一行 m,n
/pattern/ 查询包含指定模式的行。如 /disk/、/[a-z]/ /pattern/,n 表示从包含指定模式的行 到 第 n 行 n,/pattern/ 表示从第 n 行 到 包含指定模式的行 /模式1/,/模式2/ 表示从包含模式1 到 包含模式2的行 反向选择, 如 m,n!的结果与 m,n 相反

71 字符流编辑工具sed (续4) 常用的 sed_edit_cmd p :打印匹配行 sed -n '1,3p' datafile
sed -n '/north/p' datafile = :显示匹配行的行号 sed -n '/north/=' datafile d :删除匹配的行 sed -n '/north/d' datafile

72 字符流编辑工具sed (续5) r :读文件,将另外一个文件中的内容附加到指定行后。
sed -n '$r newdatafile' datafile w :写文件,将指定行写入到另外一个文件中。 sed -n '/west/w newdatafile' datafile n :将指定行的下面一行读入编辑缓冲区。 sed -n '/eastern/{n;s/AM/Archie/p}' datafile 对指定行同时使用多个 sed 编辑命令时,需用大括号 “ {} ” 括起来,命令之间用分号 “ ; ” 格开。注意与 -e 选项的区别

73 字符流编辑工具sed (续6) q :退出,读取到指定行后退出 sed。
sed '/east/{s/east/west/;q}' datafile 常见的 sed 编辑命令小结 p 打印匹配行 s 替换命令 = 显示匹配行的行号 l 显示指定行中所有字符 d 删除匹配的行 r 读文件 a\ 在指定行后面追加文本 w 写文件 i\ 在指定行前面追加文本 n 读取指定行的下面一行 c\ 用新文本替换指定的行 q 退出 sed

74 字符流编辑工具sed (举例) '/north/p' 打印所有包含 north 的行 '/north/!p'
's/\.$//g' 删除以句点结尾的行中末尾的句点 's/^ *//g' 删除行首空格(命令中 ^ * 之间有两个空格) 's/ */ /g' 将连续多个空格替换为一个空格 命令中 */ 前有三个空格,后面是一个空格 '/^$/d’ 删除空行 's/^.//g' 删除每行的第一个字符,同 's/.//' 's/^/%/g' 在每行的最前面添加百分号 % '3,5s/d/D/' 把第 3 行到第 5 行中每行的 第一个 d 改成 D

75 谢谢!


Download ppt "Shell程序设计 曙光信息产业股份有限公司."

Similar presentations


Ads by Google