shell脚本实用知识点

------------------------------ ----------------------------------- -----------------------------------
1.什么是shell?

shell本意为壳,用于保护内核

shell是用C语言编写的程序

shell是普通用户与内核沟通的桥梁,是命令解释器

shell还是一门编程语言,脚本语言,解释型语言

 
 
 
 
2.shell类型


当前系统上带有的shell:

cat /etc/shells

查看默认的登录shell:

echo $SHELL

切换shell:

/bin/sh 

退出shell:

exit

Linux系统中默认使用的是bash


3.bash特性与使用技巧

1.命令历史

可以使用方向键显示以前执行过的指令

history

历史记录保存在此文件中:

vim ~/.bash_history

2.命令别名alias 

设置别名

alias 指令别名='真正的指令'

alias rm='rm -i'

3.命令补全table

文件名补全

指令补全

ctrl + a  移动光标到最前面

ctrl + e  移动光标到最末尾

ctrl + c 终止

ctrl + z 退出

ctrl + l 清屏clear

4.作业控制,前后台操作

把指令丢到后台运行,使其不占用当前终端

./a.out &

查看后台正在运行的程序

jobs

fg 编号

把程序丢到后台暂停

vim main.c
 
ctrl + z

fg 编号

5.管道    |

shell中的"|"表示管道,用于连接多个指令,把前一个指令的输出作为下一 个指令的输入

 ps -ef | sort | more 


6.输出重定向>

指令  > 文件
 
1 标准输出

1>

2 标准错误

2>

>> 追加,不会清掉文件原有的


空设备文件,写到此文件中的数据全部都会被丢弃!

/dev/null


7.shell  script

.bat 批处理文件

shell脚本 比.bat文件功能更强!


在bash中执行指令:

指令 [-选项] 参数 ...

1.指令、选项、参数之间空格隔开,不论多少个空格,shell都视为一个空格

2.如果指令很长,可以用  "\" 使指令连续到下行

3.一般来说,选项都是  -选项   ,有时需要写完整名称时,--option


----------------------------------- ----------------------------------- -----------------------------------
shell脚本:

变量

条件

程序控制

函数

1.第一个shell脚本

#!  :指定脚本解释器

# :注释

echo  输出信息

执行方式:

1.添加可执行权限

chmod +x xxx.sh 

2.直接调用命令解释器

bash xxx.sh  

3.使用source指令

source xxx.sh (.sh文件末尾不要加exit 0,不然会退出终端)

2.变量

1.设定变量的基本规则:

1.变量名的规则与C语言一致

2.变量名与变量的值用"="连接

3."="两边不能有任何空格

4.使用 $变量名 获取变量的值

5.如果变量值中有空格,必须使用引号引起来

2.shell中的引号

单引号:当变量的值中出现 $标识符 时,单引号不会去解析,而是原样输出

双引号:会解析 $标识符 ,即会去获取变量的值

反引号:波浪线所在的那个按键,用于获取指令的执行结果

`ls`

3.变量的类型

环境变量

env

set

PATH

LD_LIBRARY_PATH

自定义变量

变量名=变量值

1.脚本中使用

2.设设置自己的路径变量

MyDir=/mnt/htfs/..../

cd $MyDir

如果想让你的路径变量一直有效,可以保存到配置文件中

如:sudo vim /etc/profile


特殊变量

        $0 这个程式的执行名字
               $n 这个程式的第n个参数值,n=1..9
               $* 这个程式的所有参数,此选项参数可超过9个。
               $# 这个程式的参数个数
               $$ 这个程式的PID(脚本运行的当前 进程ID 号)
               $! 执行上一个背景指令的PID(后台运行的最后一个进程的 进程ID 号)
               $? 执行上一个指令的返回值 (显示最后命令的退出状态。0表示没有错误,其他任何值表明有错误
               $- 显示shell使用的当前选项,与set命令功能相同
               $@ 跟$*类似,但是可以当作数组用

3.条件

test 表达式

[ 表达式 ]

测字符串:

-n  字符串不为空,则结果为真

-z   字符串为空,则结果为真

=  两个字符串相等则为真,否则为假

!=  两个字符不相等则为真,否则为假

测整数:

-eq  相等

-ne 不等

-gt 大于

-lt  小于

-ge  大于等

-le  小于等于

测文件:

-e 存在

-f  存在且是普通文件

-d  存在且是目录

-r  存在且可读

-w  存在且可写

-x  存在且可执行


4.if语句

if 条件

then

语句

fi
---------------- ---------------- ----------------
if 条件

then

语句

else

语句

fi 
------------------ ------------------ ------------------
if 条件 

then 
 
语句

elif 条件 

then 

语句

else

语句

fi 
---------------- ---------------- -----------------------


5.for语句

for 变量 in 字符串列表

do

语句

done

---------------- ---------------- ----------------------- ---------------- ---------------- -----------------------
练习: 打印指定目录下的所有普通文件以及子目录下的文件(用到递归)

#!bin/bash

#echo "enter a file name:"
#read var
#var="/home/gec"
function read_dir()
{
	for file in $(ls $1)
	do
		if test  -d  $1"/"$file
		then 
			read_dir $1"/"$file
		else
			echo $1"/"$file
		fi
	done

}
echo "请输入要遍历的目录:"
read dir
#INIT_PATH="/home/gec"
#read_dir $INIT_PATH
read_dir $dir
---------------- ---------------- ----------------------- ---------------- ---------------- -----------------------

6.while语句

while 条件

do 

语句

done 

练习:求和  1-100

整数运算:

num1=10

num2=20

方法1:

expr $num2 + $num2

expr $num2 - $num2

expr $num2 \* $num2

expr $num2 / $num2

方法2:

$((num1+num2))

$((num1-num2))

$((num1*num2))

$((num1/num2))

$((num1++)) 递增运算
---------------- ---------------- ----------------------- ---------------- ---------------- -----------------------
练习:求1-100相加的和

 #! bin/bash
 num=1
 sum=0
 while [ $num -le 100 ]
 do
          sum=$((sum+num))
          num=$((num+1))
 done
 echo $sum


---------------- ---------------- ----------------------- ---------------- ---------------- -----------------------
7.case语句

case 变量 in 

模式1)语句;;

模式2)语句;;

...

*)语句;;

esac


8.字符串处理 

${.......}

例如:path=/home/csgec/a.txt

var=${path#*/}

从左到右,删除第一个 / ,及其左边所有字符

结果:var=home/csgec/a.txt


var=${path##*/}

从左到右,删除最后一个 / ,及其左边所有字符

结果:var=a.txt 


var=${path%/*}

从右到左,删除第一个  /,及其右边的所有字符

结果:var=/home/csgec


var=${path%%/*}

从右到左,删除最后一个/,及其右边的所有字符

结果:var=

----------------------------------- ----------------------------------- -----------------------------------
练习:写一个shell脚本,给交叉编译工具设置软连接

#!/bin/bash 
list='arm-none-*' 
array=($list) 
for((i=0; i<${#array[@]}; i++))
do 
         echo -e "${array[i]}\t-->\t${array[i]##*gnueabi-}" 
         ln -s ${array[i]} arm-linux-${array[i]##*gnueabi-}	
done 
        echo -e "一共建立了 ${#array[@]} 个链接......"
----------------------------------- ----------------------------------- -----------------------------------
find 

用于在文件系统中查看文件

在哪里找

根据什么找

找到之后做什么

find 查找路径 选项 [-print -exec -ok]

查找路径:默认为当前路径

选项:可以通过文件名、大 小、时间、用户、文件类型、权限等查找文件

找到之后,默认为打印名称,还可以执行其它的指令,如ls rm cp  mv 

按名称查找:-name 

find /home/csgec -nam e a.txt 

按大小查找:-size

find /home/csgec -size +100M

按时间查找:-atime -ctime -mtime

find /home/csgec -mtime 1 

按用户找:

find /home/csgec -user root

pathname: find命令所查找的目录路径。例如用.来表示当前目录,用/来表示系统根目录。

-print: find命令将匹配的文件输出到标准输出。

-exec: find命令对匹配的文件执行该参数所给出的shell命令。相应命令的形式为'command' { } \;,注意{ }和\;之间的空格。

-ok: 和-exec的作用相同,只不过以一种更为安全的模式来执行该参数所给出的shell命令,在执行每一个命令之前,都会给出提示,让用户来确

定是否执行。

find命令参数解释:

====================================================

-name   filename             #查找名为filename的文件
-perm                        #按执行权限来查找
-user    username             #按文件属主来查找
-group groupname            #按组来查找
-mtime   -n +n                #按文件更改时间来查找文件,-n指n天以内,+n指n天以前
-atime    -n +n               #按文件访问时间来查GIN: 0px">

-ctime    -n +n              #按文件创建时间来查找文件,-n指n天以内,+n指n天以前

-nogroup                     #查无有效属组的文件,即文件的属组在/etc/groups中不存在
-nouser                     #查无有效属主的文件,即文件的属主在/etc/passwd中不存
-newer   f1 !f2              找文件,-n指n天以内,+n指n天以前 
-ctime    -n +n               #按文件创建时间来查找文件,-n指n天以内,+n指n天以前 
-nogroup                     #查无有效属组的文件,即文件的属组在/etc/groups中不存在
-nouser                      #查无有效属主的文件,即文件的属主在/etc/passwd中不存
-newer   f1 !f2               #查更改时间比f1新但比f2旧的文件
-type    b/d/c/p/l/f         #查是块设备、目录、字符设备、管道、符号链接、普通文件
-size      n[c]               #查长度为n块[或n字节]的文件
-depth                       #使查找在进入子目录前先行查找完本目录
-fstype                     #查更改时间比f1新但比f2旧的文件
-type    b/d/c/p/l/f         #查是块设备、目录、字符设备、管道、符号链接、普通文件
-size      n[c]               #查长度为n块[或n字节]的文件
-depth                       #使查找在进入子目录前先行查找完本目录
-fstype                      #查位于某一类型文件系统中的文件,这些文件系统类型通常可 在/etc/fstab中找到
-mount                       #查文件时不跨越文件系统mount点
-follow                      #如果遇到符号链接文件,就跟踪链接所指的文件
-cpio                %;      #查位于某一类型文件系统中的文件,这些文件系统类型通常可 在/etc/fstab中找到
-mount                       #查文件时不跨越文件系统mount点
-follow                      #如果遇到符号链接文件,就跟踪链接所指的文件
-cpio                        #对匹配的文件使用cpio命令,将他们备份到磁带设备中
-prune                       #忽略某个目录

====================================================
=


9.正则表达式

计算机描述语言

基本正则表达式:普通字符 元字符

^ 行起始标记

$ 行结束标记

. 匹配任意一个字符

[] 匹配包含在[字符]之中的任意一个字符,[a-z]  [0-9] [A-Z] [^a-z]

* 匹配之前字符任意多次

\ 转义字符

grep

用于在文件中查找内容, 通用 正则表达式、 解析器

grep 正则表达式 -n 文件 

查找ip地址的 正则表达式:ifconfig | egrep "[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}"

----------------------------------- ----------------------------------- -----------------------------------
正则表达式全部符号解释
字符 描述
\ 将下一个字符标记为一个特殊字符、或一个原义字符、或一个 向后引用、或一个八进制转义符。例如,'n' 匹配字符 "n"。'\n' 匹配一个换行符。序列 '\\' 匹配 "\" 而 "\(" 则匹配 "("。
^ 匹配输入字符串的开始位置。如果设置了 RegExp 对象的 Multiline 属性,^ 也匹配 '\n' 或 '\r' 之后的位置。
$ 匹配输入字符串的结束位置。如果设置了RegExp 对象的 Multiline 属性,$ 也匹配 '\n' 或 '\r' 之前的位置。
* 匹配前面的子表达式零次或多次。例如,zo* 能匹配 "z" 以及 "zoo"。* 等价于{0,}。
+ 匹配前面的子表达式一次或多次。例如,'zo+' 能匹配 "zo" 以及 "zoo",但不能匹配 "z"。+ 等价于 {1,}。
? 匹配前面的子表达式零次或一次。例如,"do(es)?" 可以匹配 "do" 或 "does" 中的"do" 。? 等价于 {0,1}。
{n} n 是一个非负整数。匹配确定的 n 次。例如,'o{2}' 不能匹配 "Bob" 中的 'o',但是能匹配 "food" 中的两个 o。
{n,} n 是一个非负整数。至少匹配n 次。例如,'o{2,}' 不能匹配 "Bob" 中的 'o',但能匹配 "foooood" 中的所有 o。'o{1,}' 等价于 'o+'。'o{0,}' 则等价于 'o*'。
{n,m} m 和 n 均为非负整数,其中n <= m。最少匹配 n 次且最多匹配 m 次。例如,"o{1,3}" 将匹配 "fooooood" 中的前三个 o。'o{0,1}' 等价于 'o?'。请注意在逗号和两个数之间不能有空格。
? 当该字符紧跟在任何一个其他限制符 (*, +, ?, {n}, {n,}, {n,m}) 后面时,匹配模式是非贪婪的。非贪婪模式尽可能少的匹配所搜索的字符串,而默认的贪婪模式则尽可能多的匹配所搜索的字符串。例如,对于字符串 "oooo",'o+?' 将匹配单个 "o",而 'o+' 将匹配所有 'o'。
. 匹配除 "\n" 之外的任何单个字符。要匹配包括 '\n' 在内的任何字符,请使用象 '[.\n]' 的模式。
(pattern) 匹配 pattern 并获取这一匹配。所获取的匹配可以从产生的 Matches 集合得到,在VBScript 中使用 SubMatches 集合,在JScript 中则使用 $0…$9 属性。要匹配圆括号字符,请使用 '\(' 或 '\)'。
(?:pattern) 匹配 pattern 但不获取匹配结果,也就是说这是一个非获取匹配,不进行存储供以后使用。这在使用 "或" 字符 (|) 来组合一个模式的各个部分是很有用。例如, 'industr(?:y|ies) 就是一个比 'industry|industries' 更简略的表达式。
(?=pattern) 正向预查,在任何匹配 pattern 的字符串开始处匹配查找字符串。这是一个非获取匹配,也就是说,该匹配不需要获取供以后使用。例如,'Windows (?=95|98|NT|2000)' 能匹配 "Windows 2000" 中的 "Windows" ,但不能匹配 "Windows 3.1" 中的 "Windows"。预查不消耗字符,也就是说,在一个匹配发生后,在最后一次匹配之后立即开始下一次匹配的搜索,而不是从包含预查的字符之后开始。
(?!pattern) 负向预查,在任何不匹配 pattern 的字符串开始处匹配查找字符串。这是一个非获取匹配,也就是说,该匹配不需要获取供以后使用。例如'Windows (?!95|98|NT|2000)' 能匹配 "Windows 3.1" 中的 "Windows",但不能匹配 "Windows 2000" 中的 "Windows"。预查不消耗字符,也就是说,在一个匹配发生后,在最后一次匹配之后立即开始下一次匹配的搜索,而不是从包含预查的字符之后开始
x|y 匹配 x 或 y。例如,'z|food' 能匹配 "z" 或 "food"。'(z|f)ood' 则匹配 "zood" 或 "food"。
[xyz] 字符集合。匹配所包含的任意一个字符。例如, '[abc]' 可以匹配 "plain" 中的 'a'。
[^xyz] 负值字符集合。匹配未包含的任意字符。例如, '[^abc]' 可以匹配 "plain" 中的'p'。
[a-z] 字符范围。匹配指定范围内的任意字符。例如,'[a-z]' 可以匹配 'a' 到 'z' 范围内的任意小写字母字符。
[^a-z] 负值字符范围。匹配任何不在指定范围内的任意字符。例如,'[^a-z]' 可以匹配任何不在 'a' 到 'z' 范围内的任意字符。
\b 匹配一个单词边界,也就是指单词和空格间的位置。例如, 'er\b' 可以匹配"never" 中的 'er',但不能匹配 "verb" 中的 'er'。
\B 匹配非单词边界。'er\B' 能匹配 "verb" 中的 'er',但不能匹配 "never" 中的 'er'。
\cx 匹配由 x 指明的控制字符。例如, \cM 匹配一个 Control-M 或回车符。x 的值必须为 A-Z 或 a-z 之一。否则,将 c 视为一个原义的 'c' 字符。
\d 匹配一个数字字符。等价于 [0-9]。
\D 匹配一个非数字字符。等价于 [^0-9]。
\f 匹配一个换页符。等价于 \x0c 和 \cL。
\n 匹配一个换行符。等价于 \x0a 和 \cJ。
\r 匹配一个回车符。等价于 \x0d 和 \cM。
\s 匹配任何空白字符,包括空格、制表符、换页符等等。等价于 [ \f\n\r\t\v]。
\S 匹配任何非空白字符。等价于 [^ \f\n\r\t\v]。
\t 匹配一个制表符。等价于 \x09 和 \cI。
\v 匹配一个垂直制表符。等价于 \x0b 和 \cK。
\w 匹配包括下划线的任何单词字符。等价于'[A-Za-z0-9_]'。
\W 匹配任何非单词字符。等价于 '[^A-Za-z0-9_]'。
\xn 匹配 n,其中 n 为十六进制转义值。十六进制转义值必须为确定的两个数字长。例如,'\x41' 匹配 "A"。'\x041' 则等价于 '\x04' & "1"。正则表达式中可以使用 ASCII 编码。.
\num 匹配 num,其中 num 是一个正整数。对所获取的匹配的引用。例如,'(.)\1' 匹配两个连续的相同字符。
\n 标识一个八进制转义值或一个向后引用。如果 \n 之前至少 n 个获取的子表达式,则 n 为向后引用。否则,如果 n 为八进制数字 (0-7),则 n 为一个八进制转义值。
\nm 标识一个八进制转义值或一个向后引用。如果 \nm 之前至少有 nm 个获得子表达式,则 nm 为向后引用。如果 \nm 之前至少有 n 个获取,则 n 为一个后跟文字 m 的向后引用。如果前面的条件都不满足,若 n 和 m 均为八进制数字 (0-7),则 \nm 将匹配八进制转义值 nm。
\nml 如果 n 为八进制数字 (0-3),且 m 和 l 均为八进制数字 (0-7),则匹配八进制转义值 nml。
\un 匹配 n,其中 n 是一个用四个十六进制数字表示的 Unicode 字符。例如, \u00A9 匹配版权符号 (?)。




猜你喜欢

转载自blog.csdn.net/sinat_39061823/article/details/77102110
今日推荐