Shell 笔记.docx
- 文档编号:4994295
- 上传时间:2022-12-12
- 格式:DOCX
- 页数:25
- 大小:25.11KB
Shell 笔记.docx
《Shell 笔记.docx》由会员分享,可在线阅读,更多相关《Shell 笔记.docx(25页珍藏版)》请在冰豆网上搜索。
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<
>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条件表达式或
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- Shell 笔记
![提示](https://static.bdocx.com/images/bang_tan.gif)