学习日志---linux打卡11

练习:写一个脚本

1、让用户交互式输入一个用户名,先判定用户是否存在;不存在,则以7为退出码;

2、判断用户的shell是否为/bin/bash;如果是,则显示为“Bash User.”,退出码为0; 否则,则显示为“Not Bash User.”,退出码为1;

#!/bin/bash

#

read -p "Enter a user name: " userName

if ! id $userName &> /dev/null; then

echo "No such user."

exit 7

fi

userShell=`grep "^$userName\>" /etc/passwd | cut -d: -f7`

if [[ "$userShell" == "/bin/bash" ]]; then

echo "bash user."

returnValue=0

else

echo "Not bash user."

returnValue=1

fi

exit $returnValue

练习:写一个脚本

1、显示如下菜单:

cpu) show cpu info;

mem) show memory info;

quit) quit

Enter your option: CPU Cpu, CpU

2、如果用户选择cpu,则显示文件/proc/cpuinfo的信息;

3、如果用户选择mem,则显示文件/proc/meminfo的信息;

4、如果用户选择quit,则退出,且退出码为5;

5、如果用户键入其它字符,则显示未知选项,请重新执行脚本;退出码为6;

#!/bin/bash

#

returnValue=0

cat << EOF

cpu) print cpu infomation

mem) print meory infomation

quit) Quit

EOF

read -p "Enter your option: " userOption

userOption=`echo $userOption | tr ‘A-Z‘ ‘a-z‘`        注意使用转义

if [[ "$userOption" == "cpu" ]]; then                 这里的[[]]也可以使用[],只有模式匹配用[[]]    整数测试[]

cat /proc/cpuinfo

elif [[ "$userOption" == "mem" ]]; then

cat /proc/meminfo

elif [[ "$userOption" == "quit" ]]; then

echo "quit"

returnValue=6

else

echo "unkown option"

returnValue=7

fi

exit $returnValue

回顾:

字符测试:

双目:

>

<

==

=~

!=, <>

单目:

-n

-z

vim:

编辑、输入、末行

vim +# file

光标跳转:h, j, k, l

w, b, e

0, ^, $

), (

{, }

G, #G

编辑命令:

x, r

d,

y,  .,+10y 复制当前到后面十行

c,

p,P

u

.

Ctrl+r

vim可视化模式:

v: 按光标走过的区域选择

V: 选择矩形块

打开多个文件,分窗口:

vim -o

vim -O

Ctrl+w(walk), arrow

分割当前窗口:

Ctrl+w, s

Ctrl+w, v

窗口属性的定义:

:set nu   显示行号

:set nonu

:set ai   自动缩进 auto indent

:set noai

:set ic   查找时忽略大小写 ignore case

:set noic

显示对应的括号

:set sm (show match)

:set nosm

语法高亮:

:syntax on

:syntax off

搜索高亮:

:set hlsearch

:set nohlsearch

vim的配置文件:

全局:/etc/vimrc

个人:~/.vimrc

查找替换:s是替换的意思substitute

:地址定界s/查找模式/替换为的内容/gi

g: global 全局替换

i: ignore-case

:地址定界[email protected]查找模式@替换为的内容@gi   分隔符可以自定义

例如这个: .,[email protected]@[email protected]

当前行开始到下面第三行做替换 把bin替换成大写BIN,每行全部出现都替换g

全文查找替换的话就是 %s 或者 1,$s

&: 用于在替换为的内容部分中引用前面匹配到的所有内容;

例子: .,[email protected]^[^#]@#&@g

当前行到第三行  开头非#的行前面都加上#   &代表前面匹配到串

:.,[email protected]\(\<l..e\>\).*\[email protected]&[email protected]

练习:

1、复制/etc/grub.conf至/tmp目录,删除/tmp/grub.conf文件中行首的空白符;

%[email protected]^[[:space:]]\{1,\}@@g

这里注意要一个或者多个

2、复制/etc/rc.d/rc.sysinit至/tmp目录,将/tmp/rc.sysinit文件中的以至少一个空白字符开头的行,行首加#号

:%[email protected]^[[:space:]]\{1,\}.*@#&@

3、删除/tmp/rc.sysinit文件中以#开头且后面跟了至少一个空白字符的行的行首的#号和空白符;

:%[email protected]^#[[:space:]]\{1,\}@@g

4、为/tmp/grub.conf文件中前三行的行首加#号;

1,[email protected]^@#@g

5、将/etc/yum.repos.d/CentOS-Media.repo中enable=0一行最后的0改为1;

%[email protected]\(enabled=\)[0-9]@\[email protected]

%s是全文搜索

算术计算

条件判断

磁盘分区、格式化

172.16.0.0/255.255.0.0

1/101

0,100

文件描述符:文件描述符在形式上是一个非负整数。实际上,它是一个索引值,指向内核为每一个进程所维护的该进程打开文件的记录表。当程序打开一个现有文件或者创建一个新文件时,内核向进程返回一个文件描述符。

请参见:http://zh.wikipedia.org/wiki/%E6%96%87%E4%BB%B6%E6%8F%8F%E8%BF%B0%E7%AC%A6

bash知识点:文件测试,判断文件的属性

[]

[[]]

test

单目测试:

-e /path/to/file: 测试文件是否存在;  exist

[ -e file ] || mkdir file   如果文件存在则不执行,如果文件不存在则创建目录

-a /path/to/file: 测试文件是否存在;

-f /path/to/file: 测试是否为普通文件;

-d /path/to/somefile: 测试是否为目录文件;

-b /path/to/somefile: 测试文件是否存在并且是否是一个块设备文件;

-c /path/to/somefile:                               字符设备文件;

-h|-L /path/to/somefile: 测试文件是否存在并且为符号链接文件:

-p /path/to/somefile:                       管道文件;

-S /path/to/somefile:                        套接字文件;

-r /path/to/somefile: 测试其有效用户是否对此文件有读取权限;

-w                                                写权限

-x                                                执行权限

-s /path/to/somefile: 测试文件是否存在并且不空,  size

双目测试:

file1 -nt file2: 测试file1是否为file2更 新一些;

-a file

True if file exists.

-b file

True if file exists and is a block special file.

-c file

True if file exists and is a character special file.

-d file

True if file exists and is a directory.

-e file

True if file exists.

-f file

True if file exists and is a regular file.

-g file

True if file exists and is set-group-id.

-h file

True if file exists and is a symbolic link.

-k file

True if file exists and its ?..ticky?..bit is set.

-p file

True if file exists and is a named pipe (FIFO).

-r file

True if file exists and is readable.

-s file

True if file exists and has a size greater than zero.

-t fd  True if file descriptor fd is open and refers to a terminal.

-u file

True if file exists and its set-user-id bit is set.

-w file

True if file exists and is writable.

-x file

True if file exists and is executable.

-O file

True if file exists and is owned by the effective user id.

-G file

True if file exists and is owned by the effective group id.

-L file

True if file exists and is a symbolic link.

-S file

True if file exists and is a socket.

-N file

True if file exists and has been modified since it was last read.

file1 -nt file2   比较1是否比2要新

True if file1 is newer (according to modification date) than file2, or if file1 exists and file2 does not.

file1 -ot file2

True if file1 is older than file2, or if file2 exists and file1 does not.

file1 -ef file2

True if file1 and file2 refer to the same device and inode numbers.

是否引用同一个设备文件

在脚本中使用source指令,可以把source后的文件读入到当前进程中,作为当前进程的数据变量,.和source的作用一样

写一个脚本,完成如下任务:

1、分别复制/var/log下的文件至/tmp/logs/目录中;

2、复制目录时,才使用cp -r

3、复制文件时,使用cp

4、复制链接文件,使用cp -d

5、余下的类型,使用cp -a

#!/bin/bash

#

targetDir=‘/tmp/logs‘

[ -e $targetDir ] || mkdir $targetDir    如果目录不存在就先创建

for fileName in /var/log/*; do

if [ -d $fileName ]; then

copyCommand=‘cp -r‘

elif [ -f $fileName ]; then

copyCommand=‘cp‘

elif [ -h $fileName ]; then

copyCommand=‘cp -d‘

else

copyCommand=‘cp -a‘

fi

$copyCommand $fileName $targetDir

done

cp -d 是复制链接文件

cp -a 是复制文件并保留原有属性

写一个脚本,完成如下任务,其使用形式如下所示:

script.sh {start|stop|restart|status}

其中:

如果参数为空,则显示帮助信息,并退出脚本;

如果参数为start,则创建空文件/var/lock/subsys/script,并显示“starting script successfully.”

如果参数为stop,则删除文件/var/lock/subsys/script,并显示“Stop script successfully.”

如果参数为restart,则删除文件/var/locksubsys/script并重新创建,而后显示“Restarting script successfully.”

如果参数为status,那么:

如果文件/var/lock/subsys/script存在,则显示“Script is running...”,否则,则显示“Script is stopped.”

bash的知识点:位置参数轮替(shift)

#!/bin/bash

#

declare -i sum=0            求输入参数的和

for i in `seq 1 $#`; do     $#可以得到参数的个数

let sum+=$1               这里始终使用位置参数1

shift                     shift实现轮替

done

echo $sum

写一个脚本:使用形式如下

userinfo.sh -u username [-v {1|2}]

-u选项用于指定用户;而后脚本显示用户的UID和GID;

如果同时使用了-v选项:

-v后面的值如果是1, 则额外显示用户的家目录路径;

-v后面的值如果是2, 则额外显示用户的家目录路径和shell;

#!/bin/bash

#

[ $# -lt 2 ] && echo "Too less argements, quit" && exit 3

if [[ "$1" == "-u" ]];then

userName="$2"

shift 2

fi

if [ $# -ge 2 ] && [ "$1" == "-v" ]; then

verFlag=$2

fi

verFlag=${verFlag:-0}

if [ -n $verFlag ];then

if ! [[ $verFlag =~ [012] ]];then

echo "Wrong parameter."

echo "Usage: `basename $0` -u UserName -v {1|2}"

exit 4

fi

fi

# echo $userName $verFlag

if [ $verFlag -eq 1 ]; then

grep "^$userName" /etc/passwd | cut -d: -f1,3,4,6

elif [ $verFlag -eq 2 ];then

grep "^$userName" /etc/passwd | cut -d: -f1,3,4,6,7

else

grep "^$userName" /etc/passwd | cut -d: -f1,3,4

fi

时间: 2024-10-22 21:43:30

学习日志---linux打卡11的相关文章

学习日志---linux打卡2

这个是计算机组成: 在系统启动时,除了启动系统空间守护进程以外,在用户空间会启动一个init进程,这是用户空间进程的祖宗进程,由该进程可以启动shell进程(外壳进程),这样就可以由外壳去启动其他的与用户交互的用户进程. 学习记录: Unix: Linux: Unix-like, 类Unix系统 Linux: 内核,linux就是指的核心 GNU自由软件组织:GPL, gcc, emacs, vi, GNU/Linux: 结合,使用内核+其他的应用程序 Linux: www.kernel.org

学习日志---Linux打卡6

回顾: 文件管理:ls, cat, tac, tail, head, more, less, cp, mv, rm, touch, stat, file, nano 用户管理:useradd, usermod, userdel, passwd, groupadd, groupmod, groupdel, id, su, chage, chfn, chsh, newgrp, gpasswd 用户类型: 管理员:0 一般用户:1-65535 系统用户:1-499, 这些用户的作用是系统刚启动是用来启

学习日志---linux打卡10

练习:写一脚本,实现如下功能: 1.让用户通过键盘输入一个用户名 2.如果用户存在,就显示其用户名和UID: 3.否则,就显示用户不存在: #!/bin/bash read -t 10 -p "Enter a username: " userName       -t是等待时间 # userName=${userName:-root}                      不输入则使用默认值 if id $userName &> /dev/null; then use

学习日志---Linux打卡1

直接操作硬件的,由cpu的特权指令集去操作,一般的操作都是普通指令集.cpu有指令集,不同的cpu可能指令集都不同. API:Application Programing Interface ABI: Application Binary Interface ANSI: 编译前的是调用API,编译后的是ABI,程序在哪里编译就在哪里运行. 预处理->编译->汇编->链接 dll: Dynamic Link Libraries动态链接库   window上 so: shared objec

学习日志---linux磁盘格式化

Linux: ext2,3,4这几个文件系统大多数linux都支持 对磁盘进行分区后,通过kpartx和partx指令让内核识别磁盘分区,接下来进行磁盘区的格式化,也就是创建文件系统: 格式化操作其中之一就是对分区创建元数据区和数据区,元数据区存的是inode,每个inode就是一个条目,对应一个文件,inode中还存着文件在数据区对应的块的编号,数据区很多的block,每个block是512个字节,使用时以2的n次方作为单位来使用,每个分区统一以几个block做为一个最小单元来存储数据. 文件

学习日志---Linux打开5

文件系统: stat命令,文本编辑器:nano touch:change file timestamps 这三个时间戳 access time, atime modify time, mtime change time, ctime 直接使用touch创建的是普通文件 -c: 不创建空文件 -a: 仅修改访问时间 -m: 仅修改修改时间 -t STAMP: [CC]YYMMDDhhmm.ss 修改时间戳使用-t stat命令: stat FILE... 查看文件信息,一切皆文件,因此都可以访问

学习日志---linuxの 程序包管理综述

Linux的程序包管理: 应用程序: GPL:源码, POSIX: Portable Operatin System API: 兼容,意味开发库兼容,因此,源代码可跨平台 ABI:兼容,编译后的程序可以跨平台: 不同的平台可执行的二进制程序格式不同,因此编译后的相同程序在不同平台不一定都能运行 库:可执行程序,本身不能作为程序执行入口,但可以被调用 编译好的二进制格式 程序:预编译.编译.汇编.链接 静态: 动态链接:dll(windows), 在linux下,so(shared object)

学习日志---linuxの RPM软件包管理器

rpm包的使用: rpm包命名格式: 源程序:name-version.tar.{gz|bz2|xz}  打包在一起的源码 version: major.minor.release rpm包:name-version-release.arch.rpm  这是打包好的二进制程序了 release:通常包含rpm的制作发行号,还包含适用的OS arch:这个是适用于哪种硬件架构,还有位数 例子:bash-4.3.2-2.el6.x86_64.rpm OS平台: el6: redhat enterpr

学习日志---linuxの yum的解析与使用

rpm软件程序包存在的问题:依赖关系 依赖关系解决方法: 程序包管理器的前端工具:yum (Yellowdog Update Modifier) yum是rpm的补充,为了提升用户体验的工具. yum的核心功能:自动解决依赖关系:X --> Y --> Z 文件服务器(共享rpm包):通过yum所支持的文件共享机制将各rpm包通过文件服务共享 该服务器是一个repository: yum仓库 组成部分: 1.各rpm包; 2.依赖关系.程序包安装后所能够生成文件列表等元数据文件; ftp, h