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、 HOMEPWD、 S H E L L 、 SHELL、 SHELLUSER等

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=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

  1. 编写shell脚本,要求实现如下功能:当执行一个程序的时候,这个程序会让使用者选择boy或者girl;如果使用者输入B或者b时,就显示:He is a boy;如果使用者输入G或者g时,就显示:He is a
    girl;如果是除了B/b/G/g以外的其他字符,就显示:I
    don’t know。

#! /bin/bash

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

  1. 编写个shell脚本将当前目录下大于10K的文件转移到/class目录下

#!/bin/bash

for Filename in
$(ls -l |awk ‘$5 > 10240 {print $9}’)

do

mv $Filename /class

done

ls -la /class

echo “执行完毕”

你可能感兴趣的:(笔记)