第二周作业
1.总结学过的权限,属性及ACL相关命令及选项
文件权限有读写执行三种
读用r表示,可以读取文件内容;数值4
写用w表示,可以修改文件内容; 数值3
执行用x表示,可以对文件执行操作,一般用于脚本文件执行权限 数值1
还有三种特殊权限,理解为用来给没有权限的用户或组使用相应的程序,间接进行其它操作管理。
SUID:作用在所有者权限上,用户可继承所有者的权限
SGID:作用在所属组上,用户可以继承所属组的权限
Sticky:作用在其他人上,用户可以继承其他人的权限
访问控制列表ACL是对文件增加独立的操作权限,实现灵活使用管理,应该是很少会用,有了解就好。
ACL命令常见用法
getfacl 文件名 #查看文件acl权限
setfacl -m u:用户名:权限 # 设置权限。如: setfacl -m u:hjz:- 1.txt # 表示用户hjz对文件1.txt没有任何访问权限
2.结合vim几种模式,学会使用vim几个常见操作。
3.总结学过的文本处理工具,文件查找工具,文本处理三剑客, 文本格式化命令(printf)的相关命令及选项,示例。
3.1查看
cat 、nl(显示行号)、tac(逆向显示)、rev(同一行逆向显示)
3.2分页查看
more less
3.3显示文本前面
head 、tail 、cut(按列抽取文本)、paste(合并多个文件依次显示)
3.4分析文本的工具
文本数据统计:wc、文本排序:sort、去重:uniq、比较文件:diff patch vimdiff cmp
3.4文件查找工具
非实时查找 locate 实时查找find
3.5文本格式化命令
printf
4 . 总结文本处理的grep命令相关的基本正则和扩展正则表达式。
字符匹配(基本)
. #匹配任意单个字符(除了\n),可以是汉字也可以是空格
[ ] #匹配指定范围内的任意字符。例如[wang],[a-z],[A-Z]
[^] #配置指定范围内的其他字符
匹配模式(基本)
* #匹配前面字符的任意次,包括0次,贪婪模式尽可能匹配多的内容。
.* #匹配任意长度的字符
\? #匹配前面字符出现0次或者1次,可有可无
\+ #匹配前面字符至少出现一次,及大于等于1
\{n\} #匹配前面字符n次
\{m,n\} #匹配前面字符至少m次,至多n次
\{,n\} #匹配前面字符至多n次
\{n,\} #匹配前面字符至少n次
位置锚定(基本)
^ #行首锚定,用于模式的最左侧
$ #行尾锚定,用于模式的最右侧
^PATTERN$ #用于模式匹配整行
^$ #空行
^[[:space]]*$ #空白行
\< 或 \b #词首锁定,用于单词模式的最左侧
\> 或 \b #词尾锁定,用于单词模式的最右侧
\<PATTERN>\ #匹配整个单词。单词是由,字母,数字和下划线组成
分组
() #分组
| #或
a|b #a或b
C|cat #C或者cat
(C|c)at # Cat或cat
root@zzj:/data# sed -n '50p' test.txt
helloworld
root@zzj:/data# sed -i '50s/helloworld/nihao/' test.txt
root@zzj:/data# sed -n '50p' test.txt
nihao
root@zzj:/data#
5.在每一行后增加一空行
root@zzj:/data# sed 'G' passwd > passwd2
root@zzj:/data# cat -b passwd2
1 root:x:0:0:root:/root:/bin/bash
2 daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin
3 bin:x:2:2:bin:/bin:/usr/sbin/nologin
4 sys:x:3:3:sys:/dev:/usr/sbin/nologin
5 sync:x:4:65534:sync:/bin:/bin/sync
6 games:x:5:60:games:/usr/games:/usr/sbin/nologin
7 man:x:6:12:man:/var/cache/man:/usr/sbin/nologin
8 lp:x:7:7:lp:/var/spool/lpd:/usr/sbin/nologin
5.1删除文件每行的第一个字符。
root@zzj:/data# sed 's/^\(.\)\(.*\)/\2/' passwd > passwd3
root@zzj:/data# cat -b passwd3
1 oot:x:0:0:root:/root:/bin/bash
2 aemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin
3 in:x:2:2:bin:/bin:/usr/sbin/nologin
4 ys:x:3:3:sys:/dev:/usr/sbin/nologin
5 ync:x:4:65534:sync:/bin:/bin/sync
6 ames:x:5:60:games:/usr/games:/usr/sbin/nologin
7 an:x:6:12:man:/var/cache/man:/usr/sbin/nologin
8 p:x:7:7:lp:/var/spool/lpd:/usr/sbin/nologin
9 ail:x:8:8:mail:/var/mail:/usr/sbin/nologin
10 ews:x:9:9:news:/var/spool/news:/usr/sbin/nologin
5.2删除文件每行的第二个字符
root@zzj:/data# sed 's/^\(.\)\(.\)\(.*\)/\1\3/' passwd > passwd4
root@zzj:/data# cat -b passwd4
1 rot:x:0:0:root:/root:/bin/bash
2 demon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin
3 bn:x:2:2:bin:/bin:/usr/sbin/nologin
4 ss:x:3:3:sys:/dev:/usr/sbin/nologin
5 snc:x:4:65534:sync:/bin:/bin/sync
6 gmes:x:5:60:games:/usr/games:/usr/sbin/nologin
7 mn:x:6:12:man:/var/cache/man:/usr/sbin/nologin
8 l:x:7:7:lp:/var/spool/lpd:/usr/sbin/nologin
9 mil:x:8:8:mail:/var/mail:/usr/sbin/nologin
5.3删除文件每行的最后一个字符
root@zzj:/data# sed 's/.$//' passwd > passwd5
root@zzj:/data# cat -b passwd5
1 root:x:0:0:root:/root:/bin/bas
2 daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologi
3 bin:x:2:2:bin:/bin:/usr/sbin/nologi
4 sys:x:3:3:sys:/dev:/usr/sbin/nologi
5 sync:x:4:65534:sync:/bin:/bin/syn
6 games:x:5:60:games:/usr/games:/usr/sbin/nologi
7 man:x:6:12:man:/var/cache/man:/usr/sbin/nologi
8 lp:x:7:7:lp:/var/spool/lpd:/usr/sbin/nologi
9 mail:x:8:8:mail:/var/mail:/usr/sbin/nologi
10 news:x:9:9:news:/var/spool/news:/usr/sbin/nologi
5.4删除文件每行的倒数第二个字符
root@zzj:/data# sed 's/^\(.*\)\(.\)\(.\)/\1\3/' passwd >passwd6
root@zzj:/data# cat -b passwd6
1 root:x:0:0:root:/root:/bin/bah
2 daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologn
3 bin:x:2:2:bin:/bin:/usr/sbin/nologn
4 sys:x:3:3:sys:/dev:/usr/sbin/nologn
5 sync:x:4:65534:sync:/bin:/bin/syc
6 games:x:5:60:games:/usr/games:/usr/sbin/nologn
7 man:x:6:12:man:/var/cache/man:/usr/sbin/nologn
8 lp:x:7:7:lp:/var/spool/lpd:/usr/sbin/nologn
9 mail:x:8:8:mail:/var/mail:/usr/sbin/nologn
6.总结变量命名规则,不同类型变量(环境变量,位置变量,只读变量,局部变量,状态变量)如何使用。
6.1变量命名规则
代码解读复制代码命名要求:
区分大小写
不能使用程序的保留字和内置变量
只能使用数字、字母及下划线,且不能以数字开头
命名习惯:
用英文单词命名,体现出实际作用
变量名大写
局部变量小写
函数名小写
大驼峰StudentFirstName
小驼峰studentFirstName
下划线:student_first_name
6.2变量的定义和引用
ini代码解读复制代码变量的生效范围等标准划分变量类型
普通变量:生效范围为当前shell进程;对当前shell以外的其它shell进程,包括当前shell的子进程无效
环境变量:生效范围为当前shell进行及其子进程
本地变量:生效范围为当前shell进程中某代码片段,通常指函数
name='root' #字符串赋值给name
name="$USER" #变量引用赋值
name=`COMMAND` #命令引用
name=$(COMMAND) #命令引用
[root@ubuntu2204 ~]# name="$USER"_123;echo $name
root_123
6.3环境变量
可以使子进程(包括孙子进程)继承父进程的变量,但是无法让父进程使用子进程的变量
一旦子进程修改从父进程继承的变量,将会将新的值传递给孙子进程
一般只在系统配置文件中使用,在脚本中较少使用 变量声明和赋值:
ini代码解读复制代码#声明并赋值
export name = VALUE
declare -x name=VALUE
#或者分两步实现
name=VLAUE
export name
显示所有的环境变量
bash代码解读复制代码env
printenv
export
declare -x
只读变量
只能声明定义,但后续不能修改和删除,即常量
声明只读变量
bash代码解读复制代码readonly name
declare -r name
查看只读变量
bash代码解读复制代码readonly [-p]
declare -r
范例
csharp代码解读复制代码[root@ubuntu2204 ~]# readonly testname="czx"
[root@ubuntu2204 ~]# echo $testname
czx
[root@ubuntu2204 ~]# unset testname
bash: unset: testname: cannot unset: readonly variable
6.4位置变量
在bash shell中内置的变量,在脚本代码中调用通过命令行传递给脚本的参数
ruby代码解读复制代码$1,$2... #对应脚本的第一个,第二个参数
$0 #命令本身,包括路径
$* #传递给脚本的所有参数,全部参数合为一个字符串
$@ #传递给脚本的所有参数,每个参数为独立字符串
$# #传递给脚本的参数的个数
清空所有位置变量
sql
代码解读
复制代码set --
范例:
bash代码解读复制代码[root@ubuntu2204 ~]# cat args.sh
echo "1st arg is $1"
echo "2st arg is $2"
echo "3st arg is $3"
#不写{}会解析成$1加0
echo "10st arg is ${10}"
echo "all arg is $*"
echo "arg numbers is $#"
[root@ubuntu2204 ~]# bash args.sh 123 321 1234
1st arg is 123
2st arg is 321
3st arg is 1234
all arg is 123 321 1234
arg numbers is 3
范例:∗和∗和@的区别
bash代码解读复制代码[root@ubuntu2204 ~]# cat arg-test.sh
#!/bin/bash
echo 'This is $@'
for i in "$@";do
echo $i;
done
echo 'This is $*'
for i in "$*";do
echo $i;
done
[root@ubuntu2204 ~]# bash arg-test.sh {A..D}
This is $@
A
B
C
D
This is $*
A B C D
6.5状态变量
当我们浏览网页时,有时会看到404,503等错误信息就是状态码,shell中也有表示脚本执行状态的技术。
进程执行后,将使用变量$?存放状态码的相关数字,不同的值反应成功或失败
shell代码解读复制代码$? #0表示成功,1-255表示失败
#脚本中用exit来定义状态码,脚本的状态码取决于最后一条命令或者exit后的数字
#脚本执行到exit就会立即终止
exit 123
7.通过shell编程完成,30鸡和兔的头,80鸡和兔的脚,分别有几只鸡,几只兔
#!/bin/bash
# 已知条件
total_heads=30
total_feet=80
# 解方程
y=$(( (total_feet - 2 * total_heads) / 2 ))
x=$(( total_heads - y ))
# 输出结果
echo "鸡是数量为: $x, 兔子的数量为: $y"
#终端输出结果
root@zzj:/data/code# bash chicken-rabbit.sh
鸡的数量为: 20, 兔的数量为: 10
8.结合编程的for循环,条件测试,条件组合,完成批量创建100个用户,
#!/bin/bash
prefix="user"
for i in {1..100}; do
username="${prefix}$(printf '%03d' $i)"
if id "$username" &>/dev/null; then
echo "User '$username' 用户已存在."
else
sudo useradd -m "$username"
echo "User '$username' 已创建."
fi
done
#终端输出结果
root@lh:/data# bash user.sh
User 'user001' 已创建.
、、、、
User 'user100' 已创建.
合,完成批量创建100个用户,
#!/bin/bash
prefix="user"
for i in {1..100}; do
username="${prefix}$(printf '%03d' $i)"
if id "$username" &>/dev/null; then
echo "User '$username' 用户已存在."
else
sudo useradd -m "$username"
echo "User '$username' 已创建."
fi
done
#终端输出结果
root@lh:/data# bash user.sh
User 'user001' 已创建.
、、、、
User 'user100' 已创建.