Shell 笔记.docx

上传人:b****4 文档编号:4994295 上传时间:2022-12-12 格式:DOCX 页数:25 大小:25.11KB
下载 相关 举报
Shell 笔记.docx_第1页
第1页 / 共25页
Shell 笔记.docx_第2页
第2页 / 共25页
Shell 笔记.docx_第3页
第3页 / 共25页
Shell 笔记.docx_第4页
第4页 / 共25页
Shell 笔记.docx_第5页
第5页 / 共25页
点击查看更多>>
下载资源
资源描述

Shell 笔记.docx

《Shell 笔记.docx》由会员分享,可在线阅读,更多相关《Shell 笔记.docx(25页珍藏版)》请在冰豆网上搜索。

Shell 笔记.docx

Shell笔记

Shell学习笔记

1、使用print或者echo命令的双引号中引用变量值

[root@localhost~]#catapple.sh

#!

/bin/bash

fruit=apple

count=5

echo"wehave$count$fruit(s)"

相同于

[root@localhost~]#catapple.sh

#!

/bin/bash

fruit=apple

count=5

echo"wehave$count${fruit}(s)"

2、设置变量

#echo$PATH

#exportPATH=$PATH:

/home/user/bin

#echo$PATH

3、或许字符长度

#length=${#var}

#var=1234546787966

#echo${#var}

#13

4、识别当前的shell版本

#echo$SHELL

或者

#echo$0

5、检查是否为超级用户

[root@localhost~]#cataa.sh

#!

/bin/bash

if[$UID-ne0];then

echo"Thisisnotrootpleserunasroot"

else

echo"Thisisroot"

fi

6、expr命令是一个手工命令行计数器,用于在UNIX/LINUX下求表达式变量的值,一般用于整数值,也可用于字符串。

–格式为:

exprExpression(命令读入Expression参数,计算它的值,然后将结果写入到标准输出)

–参数应用规则:

用空格隔开每个项;

用\(反斜杠)放在shell特定的字符前面;

对包含空格和其他特殊字符的字符串要用引号括起来

expr用法实例讲解:

(1)计算字串长度

#exprlength“thisisatest”

14

(2)抓取字串

#exprsubstr“thisisatest”35

isis

(3)抓取第一个字符数字串出现的位置

#exprindex“sarasara”a

2

(4)字串真实重现

#exprquotesara

sara

(5)整数运算

#expr14%9

5

#expr10+10

20

#expr1000+900

1900

#expr30/3/2

5

#expr30\*3(使用乘号时,必须用反斜线屏蔽其特定含义。

因为shell可能会误解显示星号的意义)

90

#expr30*3

expr:

Syntaxerror

(6)增量计数

说明:

expr在循环中用于增量计算。

先将变量初始化为0,反引号的用法为命令替代。

>LOOP=0

>LOOP=`expr$LOOP+1`

(7)数值测试

说明:

用expr测试一个数。

如果试图计算非整数,则会返回错误。

#rr=3.4

#expr$rr+1

expr:

non-numericargument

#rr=5

#expr$rr+1

6

(8)模式匹配

说明:

expr也有模式匹配功能。

可以使用expr通过指定冒号选项计算字符串中字符数。

.*意即任何字符重复0次或多次。

#VALUE=account.doc

#expr$VALUE:

‘.*’

在expr中可以使用字符串匹配操作,这里使用模式抽取.doc文件附属名。

$expr$VALUE:

‘\(.*\).doc’

accounts

7、bc命令:

     bc命令是用于命令行计算器。

它类似基本的计算器。

使用这个计算器可以做基本的数学运算。

-c

仅通过编译。

bc命令的输出被发送到标准输出。

-l

定义数学函数并且初始化值为20,取代默认值0。

filename

文件名,它包含用于计算的计算器命令,这不是必须的命令。

8、let命令

let命令可以直接执行基本的算术操作

当使用let时,变量名之前不需要添加$.例如:

实战练习

[root@localhost~]#catbb.sh

#!

/bin/bash

no1=4

no2=4

letresult=no1+no2

echo$result

9、整数运算:

result=$[no1+no2]

result=$[$no1+5]

result=$((no1+50))

result=`expr3+4`

result=$(expr$no1+5)

浮点运算

echo"4*0.56"|bc

[root@localhost~]#catcc.sh

#!

/bin/bash

no=54;

result=`echo"$no*0.68"|bc`

echo$result

设定小数精度(数值范围)

echo"scale=2;3/8"|bc

进制转换

十进制转换为二进制

no=100

echo"obase=2;$no"|bc

二进制转换为十进制

no=1100100

echo"obase=10;$no"bc

计算平方以及平方根

echo"sqrt(100)"|bc

echo"10^10"|bc

 

10、玩转文件描述符和重定向

0——stdin标准输入

1——stdout标准输出

2——stderr标准错误

echoa1>a1

cpa1a2;cpa2a3

chmod000a1

cata*2>err.txt

11、tee

tee指令会从标准输入设备读取数据,将其内容输出到标准输出设备,同时保存成文件。

参  数:

 -a或--append 附加到既有文件的后面,而非覆盖它.

 -i-i或--ignore-interrupts 忽略中断信号。

 --help 在线帮助。

 --version 显示版本信息。

查看以a开头的文件名,使用tee生成标准输入到out.txt文件,cat-n显示序列号

cata*|teeout.txt|cat-n

查看以a开头的文件名,使用tee生成标准输入到out.txt文件加上-a追加文件,cat-n显示序列号

cata*|teeout.txt|cat-n

重定向脚本内部的文本块

向文件的头部输入数据<清空文件,<>追加

[root@localhostaa]#cat<log.txt

>LOGFILEHEADER

>Thisisatestlogfile

>Function:

systemstatistics

>EOF

[root@localhostaa]#catlog.txt

LOGFILEHEADER

Thisisatestlogfile

Function:

systemstatistics

自定义文件描述符

使用exec命令创建自定义的文件描述符。

通常来说有三种模式:

只读模式

截断模式

追加模式

<操作符用于从文件中读取至stdin

>操作符用于截断模式的文件写入(数据在目标文件内容被截断之后写入)

>>操作符用于追加模式的文件写入。

为读取文件创建一个文件描述符

echo"thisisatestline">input.txt

exec3

catinput.txt

cat<&3

数组和关联数组

数组是shell脚本重要的组成部分,它借助索引将多个独立的数据存储为一个集合

普通数组只能使用整数作为数组索引,关联数组可以使用字符串作为数组索引

一、数组

将数组定义为一组索引值

[root@localhost~]#array_var[0]="test1"

[root@localhost~]#array_var[1]="test2"

[root@localhost~]#array_var[2]="test3"

[root@localhost~]#array_var[3]="test4"

[root@localhost~]#array_var[4]="test5"

[root@localhost~]#array_var[5]="test6"

打印出特定索引的数组元素内容

[root@localhost~]#echo${array_var[1]}

[root@localhost~]#index=5

[root@localhost~]#echo${array_var[$index]}

以清单形式打印出数组中的所有值

[root@localhost~]#echo${array_var[*]}

test1test2test3test4test5test6

[root@localhost~]#echo${array_var[@]}

test1test2test3test4test5test6

打印数组长度

[root@localhost~]#echo${#array_var[*]}

6

二、关联数组

1、使用语句单独声明将一个变量名为关联数组

[root@localhost~]#declare-Afruits_value

[root@localhost~]#fruits_value=([apple]='100dollars'[orange]='150dollars')

[root@localhost~]#echo"applecosts${fruits_value[apple]}"

applecosts100dollars

[root@localhost~]#

2、列出数组索引

[root@localhost~]#echo${!

fruits_value[*]}

orangeapple

[root@localhost~]#echo${!

array_var[*]}

012345

3、别名alias

别名配置文件目录vim~/.bashrc

aliasrm='cp$@~/backup;rm$@'

当你创建别名时,如果已经有同名的别名存在,那么原有的别名设置将被新的取代

获取终端信息

获取终端的行数和列数

bel警铃

blink闪烁模式

bold粗体

civis隐藏光标

clear清屏

cnorm不隐藏光标

cup移动光标到屏幕位置(x,y)

el清除到行尾

ell清除到行首

smso启动突出模式

rmso停止突出模式

smul开始下划线模式

rmul结束下划线模式

sc保存当前光标位置

rc恢复光标到最后保存位置

sgr0正常屏幕

rev逆转视图

[root@localhost~]#tputcols

105

[root@localhost~]#tputlines

23

打印出当前终端名

[root@localhost~]#tputlongname

xtermterminalemulator(XWindowSystem)[root@localhost~]#

将光标移到到方位(100100)处

root@localhost~]#tputcup100100

[root@localhost~]#

设置终端背景色范围0--7

[root@localhost~]#tputsetb1

设置下划线关闭

[root@localhost~]#tputsmul

[root@localhost~]#tputrmul

在输入密码的时候,不显示出来

[root@localhost~]#catpd.sh

#!

/bin/bash

echo-e"Enterpassword:

"

stty-echo(终端不显示)

readpassword(可输人内容)

sttyecho(终端输出内容)

echo(空行)

echoPasswordread

[root@localhost~]#

获取、设置日期和延迟

打印纪元时,显示出来的为秒

date+%s

设置日期时间

[root@localhost~]#date"+%d%b%Y"

30Jul2014

[root@localhost~]#date-s"2015-3-2515:

45:

00"

WedMar2515:

45:

00CST2015

延迟

[root@localhost~]#catsleep.sh

#!

/bin/bash

echo-ncount:

输出count'

tputsc保存当前光标位置

count=0;从0开始

whiletrue;

do

if[$count-lt40];小于40的数字

thenletcount++;

sleep1;延迟1秒

tputrc恢复光标到最后保存位置

tputed删除当前光标位置到行尾的所有内容

echo-n$count;

elseexit0;

fi

done

调试脚本

Set+x:

在执行时显示参数和命令

Set-x:

禁止调试

Set-v:

当命令进行读取时显示输入

Set+v:

禁止打印输入

[root@localhost~]#catbash.sh

#!

/bin/bash

foriin{1..6}

do

set-x

echo$i

set+x

done

echo"scriptexecuted"

 

自定义格式显示调试信息

[root@localhost~]#catbash.sh

#!

/bin/bash

functionxf()

{

["$_DEBUG"=="on"]&&$@||:

}

foriin{1..10}

do

xfecho$i

done

执行结果

[root@localhost~]#_DEBUG=on./bash.sh

1

2

3

4

5

6

7

8

9

10

读取命令返回值

[root@localhost~]#catcommand.sh

#!

/bin/bash

CMD=$1

ls$CMD>>out.txt2>&1

if[$?

-eq0];

then

echo"$CMDexecutedsuccessfully"

else

echo"$CMDexectuedunsuccessfuly"

fi

 

Read

Read是一个重要的bash命令,用于从键盘或标准输入中读取文本,我们可以使用read以交互的形式读取来自用户的输入

Read-n2var输入两个字符读入变量var

Read-svar以不会显的方式输入密码

Read-p"Enterinput:

"var以Enterinput:

显示提示信息

Read-d":

"var以定界符:

结束输入行

字段分隔符和迭代器

内部字段分隔符(IFS):

是shell脚本中的一个重要概念,在处理文本数据时,她可是相当有用。

我们将讨论把单个数据流划分成不同数据元素的定界符。

内部字段分隔符是用于特定用途的定界符。

IFS是存储定界符的环境变量。

它是当前shell环境使用的默认定界字符串。

迭代器:

我们需要一个迭代字符串或者CSV逗号分割型数值。

在前者中,我们使用IFS=".",在后者中则使用IFS=","

实列

[root@localhost~]#catifs

#!

/bin/bash

date="name,sex,rollno,location"

IFS=,

#oldIFS=$IFS

foritemin$date

do

echoItem:

$item

done

#IFS=$oldIFS

[root@localhost~]#bashifs

Item:

name

Item:

sex

Item:

rollno

Item:

location

[root@localhost~]#

#!

/bin/bash

IFS=":

"

line="admin:

x:

500:

500:

:

/home/admin:

/bin/bash"

count=0

foriin$line;

do

[$count-eq0]&&user=$i

[$count-eq6]&&shell=$i

letcount++

done

echo"$user'sshellis$shell"

[root@localhost~]#bashshel

admin'sshellis/bin/bash

Linux下seq的使用

-f:

用来格式化输出

-s:

用来指定分隔符号,默认是回车

-w:

输出同宽数列,不足的位数用0补齐

[root@gechong~]#seq-f100%g10

1001

1002

1003

1004

1005

1006

1007

1008

1009

10010

[root@gechong~]#seq1310

1

4

7

10

[root@gechong~]#seq-s"+"10

1+2+3+4+5+6+7+8+9+10

[root@gechong~]#seq-s"+"100|bc

5050

[root@gechong~]#seq-w10

01

02

03

04

05

06

07

08

09

10

 

一个简单的脚本实现1000以内偶数求和

[root@gechong~]#moretest.sh

#!

/bin/sh

#gechong_1106_sum

fir=0;

res=0;

foriin$(seq$fir21000);do

res=$(($res+$i));

done;

echo"Theresultis:

"$res;

 

For循环

脚本名称叫test.sh入参三个:

123

运行test.sh123后

$*为"123"(一起被引号包住)

$@为"1""2""3"(分别被包住)

$#为3(参数数量)

[root@localhost~]#catfora

#!

/bin/bash

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

do

echo$(expr$i\*4);

done

[root@localhost~]#catfor

#!

/bin/bash

list={1.2.3.4.5.6.7.8.9.10}

IFS=.

foriin$list

do

echo"$i"

done

[root@localhost~]#cataa

#!

/bin/bash

foriin{1..6}

do

#set-x

echo$i

#set+x

done

echo"scriptexecuted"

[root@localhost~]#catone

#!

/bin/bash

forxinonetwothreefour

do

echonumber$x

done

[root@localhost~]#catbb

#!

/bin/bash

foriiiin"$@"

do

echoyoutyped${iii}

done

用for循环在家目录下创建aaa1-aaa10,然后在aaa1-aaa10创建bbb1-bbb10的目录

#!

/bin/bash

foriin{1..10}

do

mkdir/home/aaa$i

cd/home/aaa$i

forlin{1..10}

do

mkdir/home/aaa$i/bbb$l

done

done

While

∙-lt,小于

∙-le,小于等于

∙-eq,等于

∙-ge,大于等于

∙-gt,大于

∙-ne,不等于

循环输出1到10的数字

#!

/bin/bash

myvar=1

while[$myvar-le10]

do

echo$myvar

myvar=$(($myvar+1))

done

注:

只要特定条件为真,”while”语句就会执行

当输入bye时结束shell

[root@localhost~]#catas

#!

/bin/bash

echo"enteranumber:

"

readvar

while[$var!

="bye"]

do

echo"yourinputis:

$var"

readvar

done

 

取1到10的和

[root@localhost~]#catdd

#!

/bin/bash

declare-ii=1

declare-isum=0

while((i<=10))

do

letsum+=i

let++i

done

echo$sum

行2-3,声明i和sum为整数型

 行4,如果条件测试:

只要i值小于或者等于10,就执行循环。

 行6,sum+=i和sum=sum+i是一样的,sum累加上i。

 行7,i的值递增1,此行是改变条件测试的命令,一旦i大于10,可终止循环。

 行8,遇到done,回到行6去执行条件测试

 行9,显示sum的值为55

Until

(除非你想要执行无穷循环)

取1到10的和

[root@localhost~]#catdd

#!

/bin/bash

declare-ii=1

declare-isum=0

until((i<=10))

do

letsum+=i

let++i

done

echo$sum

#!

/bin/bash

myvar=1

until[$myvar-gt10]

do

       echo$myvar

      myvar=$(($myvar+1))

done

变量自增,目前有五种方法

#!

/bin/bash

i=0;

while[$i-lt4];

do

     echo$i;

     i=`expr$i+1`;

     #leti+=1;

     #((i++));

     #i=$[$i+1];

     #i=$(($i+1))

done

比较和测试

一:

条件测试

1. 语法:

test条件表达式或

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 教学研究 > 教学反思汇报

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1