您的位置:首页 > 运维架构 > Shell

shell脚本实用知识点

2017-08-11 18:45 489 查看
----------------------------------------------------------------------------------------------------

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 -name 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 匹配版权符号 (?)。
来源: http://www.cnblogs.com/yirlin/archive/2006/04/12/373222.html

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  shell 脚本