Shell学习笔记
1、Shell的简介
Shell是一个命令解析器,类似于DOS下的command。它接收用户命令,然后调用相应的应用程序。介于应用程序(用户)和操作系统之间的一个桥梁,负责命令的解释。常见的Shell解析器有:/bin/sh:是bash的一个快捷方式;/bin/bash(最多):bash是大多数Linux默认的shell,包含的功能几乎可以涵盖shell所有的功能;/sbin/nologin:表示非交互,不能登录操作系统;/bin/dash:小巧,高效,功能相比少一些;/bin/tcsh:具有C语言风格的一种shell,具有许多特性,但是也有一些缺陷;/bin/csh:是csh的增强版本,完全兼容csh;
2、Shell的使用场景
在Linux系统管理工作中shell脚本是必不可少的,如果不会写shell脚本,那么你就不能够算是一个合格的Linux管理员。一些单位用shell脚本的编写能力来衡量这个Linux系统管理员的经验是否丰富。Shell脚本就是将需要执行的命令保存到文本中,按照顺序逐行解析并执行 ,最终能够完成一些自动化的工作,提高工作效率。
3、Shell的学习
3.1系统变量
H O M E 、 HOME、 HOME、PWD、 S H E L L 、 SHELL、 SHELL、USER等
3.2自定义变量
定义变量:变量名=值 ,需要注意的是等号两边不要出现空格,变量名称不能有特殊字符并且不能以数字和特殊字符开头;读取变量:echo $变量名;撤销变量:unset 变量名;静态变量(一旦创建,只可读): readonly变量的作用域只在当前会话和当前用户下有效;
3.3全局环境变量
定义变量:export 变量名=值,全局环境变量的作用域是在当前会话下的所有用户有效;
3.4查看所有的变量使用set命令
3.5特殊变量 $# $n $?
$* $@
$n:n为数字,$0代表该脚本名称,$1- 9 代 表 第 一 到 第 九 个 参 数 , 十 以 上 的 参 数 , 十 以 上 的 参 数 需 要 用 大 括 号 包 含 , 如 9代表第一到第九个参数,十以上的参数,十以上的参数需要用大括号包含,如 9代表第一到第九个参数,十以上的参数,十以上的参数需要用大括号包含,如{10};
$#:获取所有输入参数个数,常用于循环;
?: 这 个 变 量 代 表 命 令 行 中 所 有 的 参 数 , *:这个变量代表命令行中所有的参数, ?:这个变量代表命令行中所有的参数,*把所有的参数看成一个整体;
@: 这 个 变 量 也 代 表 命 令 行 中 所 有 的 参 数 , 不 过 @:这个变量也代表命令行中所有的参数,不过 @:这个变量也代表命令行中所有的参数,不过@把每个参数区分对待;
$?:最后一次执行的命令的返回状态。如果这个变量的值为0,证明上一个命令正确执行;如果这个变量的值为非0(具体是哪个数,由命令自己来决定),则证明上一个命令执行不正确了
3.6 Shell
中的数组
Shell 数组用括号来表示,元素用"空格"符号分割开,语法格式如下:myarr=(value1 value2 value3);获取数组中的所有元素,使用@ 或 * 可以获取数组中的所有元素,例如:echo "数组的元素为: ${myarr[]}"或echo “数组的元素为: ${myarr[@]}”;获取数组长度的方法与获取字符串长度的方法相同,例如:echo "数组元素个数为: ${#myarr[]}"或echo “数组元素个数为: ${#myarr[@]}”;
3.7运算符
(1)“ ( ( 运 算 式 ) ) ” 或 “ ((运算式))”或“ ((运算式))”或“[运算式]”+
, - , *,/,%加,减,乘,除,取余
(2)expr+ , - , *,/,%加,减,乘,除,取余(expr运算符间要有空格)
3.8 条件判断
[ condition ](注意condition前后要有空格),条件非空即为true, 反之返回false。
= 字符串比较;两个整数之间比较 :-lt 小于(less than)-le 小于等于(less
equal)-eq 等于(equal)-gt 大于(greater than)-ge
大于等于(greater equal)-ne 不等于(Not equal)
按照文件权限进行判断:-r 有读的权限(read)-w 有写的权限(write)-x 有执行的权限(execute);按照文件类型进行判断:-f 文件存在并且是一个常规的文件(file)-e 文件存在(existence)-d
文件存在并是一个目录(directory);
3.9 流程判断(if case
while)
If的基本语法和注意事项:[
条件判断式 ],中括号和条件判断式之间必须有空格;if后要有空格
if [ 条件判断式 ];
then
程序
fi
或者
if [ 条件判断式 ] then
程序
elif [ 条件判断式 ]then
程序
else
程序
Fi
Case的基本语法和注意事项:case行尾必须为单词“in”,每一个模式匹配必须以右括号“)”结束。双分号“;
;
”表示命令序列结束,相当于java中的break。最后的“*)”表示默认模式,相当于java中的default。
case $变量名 in
“值1”)
如果变量的值等于值1,则执行程序1
;
;
“值2”)
如果变量的值等于值2,则执行程序2
;
;
……
*)
如果变量的值都不是以上的值,则执行此程序
;
;
Esac
While的基本语法和注意事项:
while [ 条件判断式 ]
do
程序
done
3.10 read读取控制台输入;
read
–t 时间 –p 名称
3.11 系统函数和自定义
系统函数:1.basename [string
/ pathname] [suffix]:basename命令会删掉所有的前缀包括最后一个(‘/’)字符,然后将字符串显示出来。dirname 文件绝对路:从给定的包含绝对路径的文件名中去除文件名(非目录的部分),然后返回剩下的路径(目录的部分))
自定义函数基本语法:调用函数之前先声明函数,shell脚本是逐行运行。函数返回值,只能通过$?系统变量获得,可以显示加return返回,如果不加,将以最后一条命令运行结果,作为返回值。return后跟数值n(0-255)
[ function ] funname[()
{
[return int;
]
}
Funname
3.12 Shell常用文本处理工具(cut、sed、awk、sort)
cut的工作就是“剪”,具体的说就是在文件中负责剪切数据用的。cut 命令从文件的每一行剪切字节、字符和字段并将这些字节、字符和字段输出。-f:列号,提取第几列;-d:分隔符,按照指定分隔符分割列;-c:指定具体的字符;
sed是一种流编辑器,它一次处理一行内容。处理时,把当前处理的行存储在临时缓冲区中,称为“模式空间”,接着用sed命令处理缓冲区中的内容,处理完成后,把缓冲区的内容送往屏幕。接着处理下一行,这样不断重复,直到文件末尾。文件内容并没有改变,除非你使用重定向存储输出。-e:直接在指令列模式上进行sed的动作编辑(一次执行多个操作时)。-i:直接编辑源文件;a: 新增,a的后面可以接字串,在下一行出现;d:删除;s:查找并替换;
awk是一个强大的文本分析工具,把文件逐行的读入,以空格为默认分隔符将每行切片,切开的部分再进行分析处理。awk [选项参数] ‘pattern1{action1}pattern2{action2}…’
filename-F指定输入文件折分隔符;-v 赋值一个用户定义变量;常用内置变量:FILENAME:文件名NR:已读的记录数NF:浏览记录的域的个数(切割后,列的个数)
sort命令是在Linux里非常有用,它将文件进行排序,并将排序结果标准输出。-n依照数值的大小排序-r 以相反的顺序来排序-t设置排序时所用的分隔字符-k指定需要排序的列;
4、Shell脚本操作题
1.写一个脚本输入任意数组或则数字例如 2 4 3 5 9 7 8 6,按照从小到大排序后输出
#!/bin/bash
arr=()
i=0
for value in “$@”
do
arr[ i ] = i]= i]=value
i= [ [ [i+1]
done
echo ${arr[*]}
for ((i=0;
i<${#arr[@]};
i++))
do
for ((j= i ;
j < i;
j< i;
j<{#arr[@]};
j++))
do
tmpvalue=https://www.it610.com/article/KaTeX parse error: Expected'}', got 'EOF' at end of input: {arr[i]}
if [ KaTeX parse error: Expected '}', got 'EOF' at end of input: {arr[j]} -lt $tmpvalue ]
then
arr[ i ] = i]= i]={arr[$j]}
arr[ j ] = j]= j]=tmpvalue
fi
done
done
echo ${arr[@]}
2.使用脚本完成批量创建用户创建(100个用户例如 ljh1~ljh100 )
#!/bin/bash
#/root/class22_shell/users.txt里面存放的是用户名,一个名一行
USERS=$(cat users.txt)
echo $USERS
for UNAME in $USERS
do
echo $UNAME
#userdel -r$UNAME
useradd $UNAME
echo
“123456” | passwd --stdin $UNAME
done
- 编写shell脚本,要求实现如下功能:当执行一个程序的时候,这个程序会让使用者选择boy或者girl;如果使用者输入B或者b时,就显示:He is a boy;如果使用者输入G或者g时,就显示:He is a
girl;如果是除了B/b/G/g以外的其他字符,就显示:I
don’t know。
echo -n your choice:
read choice
case $choice in
g)echo “She is a girl.”; ;
G)echo “She is a girl.”; ;
b)echo “He is a boy.”; ;
B)echo “He is a boy.”; ;
*)echo “I don’t know.”; ;
Esac
- 编写个shell脚本将当前目录下大于10K的文件转移到/class目录下
for Filename in
$(ls -l |awk ‘$5 > 10240 {print $9}’)
do
mv $Filename /class
done
ls -la /class
echo “执行完毕”
【Shell学习笔记】
推荐阅读
- EffectiveObjective-C2.0|EffectiveObjective-C2.0 笔记 - 第二部分
- Shell-Bash变量与运算符
- 由浅入深理解AOP
- 继续努力,自主学习家庭Day135(20181015)
- python学习之|python学习之 实现QQ自动发送消息
- Android中的AES加密-下
- 一起来学习C语言的字符串转换函数
- 定制一套英文学习方案
- 漫画初学者如何学习漫画背景的透视画法(这篇教程请收藏好了!)
- 《深度倾听》第5天──「RIA学习力」便签输出第16期