创建三个用户,算三个用户的UID加起来的结果,如何做成个shell脚本

创建三个用户,算三个用户的UID加起来的结果,如何做成个shell脚本,第1张

#!/bin/bash

useradd test1 >&/dev/null

useradd test2 >&/dev/null

useradd test3 >&/dev/null

a=`id test1 -u`

b=`id test2 -u`

c=`id test3 -u`

echo $a+$b+$c|bc

通过shell获取当前8位日期,并赋给变量,并且使用变量作为文件名,建立文件夹

代码如下:

ls_date=`date +%Y%m%d`

mkdir ${ls_date}

上面两句代码虽然简单

但是在应用中比较实用

获取日期注意事项:date +%Y%m%d 这个字符串是被英文状态下的ESC下面那个键

获取变量注意事项:必须有$与{变量名}组成

在使用Linux的过程中,场景有时候便会涉及到查找文本文件的内容,假如现在我们想要在一个三百多行的文本中找到特定的语句,或者在这其中查找是否含有特定的字段应该怎么办呢?

这里便出现了专门的文本处理工具——grep,grep是Linux中常用的文本处理工具之一。

grep的全称为“ Global search Regular Expression and Print out the line”。

全称中的“Glibal search”意思为全局搜索的意思。

全称中的“Regular Expression”意思为正则表达式。

所以从全称中就可以理解为gerp是一个可以利用正则表达式的全局搜索工具。grep会按照正则表达式的匹配原则在文本文件中按照逐行匹配处理的方法来处理文本并输出。

来看看grep的用法。

来看看案例。

案例1统计出/etc/passwd文件中其默认shell为非/sbin/nologin的用户个数,并将用户都显示出来

上面的案例开始匹配了/sbin/nologin关键词,但是案例中只需要除了它之外的shell,所以讲它使用-v选项排除开就可以了。

案例2查出用户UID最大值的用户名、UID及shell类型

案例3统计当前连接本机的每个远程主机IP的连接数,并按从大到小排序

上面的案例中ss -nt 查看连接情况,然后将EATAB状态的过滤出来,在进行处理,最后提取出结果并完成排序。

案例4:编写脚本disksh,显示当前硬盘分区中空间利用率最大的值

案例5编写脚本 systeminfosh,显示当前主机系统信息,包括:主机名,IPv4地址, *** 作系统版本,内核版本,CPU型号,内存大小,硬盘大小

ls

ls -a

使用 ls 命令,ls命令可以不带参数,也可以带参数,以下是参数的作用:

-a 列出目录下的所有文件,包括以  开头的隐含文件。

-b 把文件名中不可输出的字符用反斜杠加字符编号(就象在C语言里一样)的形式列出。

-c 输出文件的 i 节点的修改时间,并以此排序。

-d 将目录象文件一样显示,而不是显示其下的文件。

-e 输出时间的全部信息,而不是输出简略信息。

-f -U 对输出的文件不排序。

-g 无用。

-i 输出文件的 i 节点的索引信息。

-k 以 k 字节的形式表示文件的大小。

-l 列出文件的详细信息。

-m 横向输出文件名,并以“,”作分格符。

-n 用数字的 UID,GID 代替名称。

-o 显示文件的除组信息外的详细信息。

-p -F 在每个文件名后附上一个字符以说明该文件的类型,“”表示可执行的普通

文件;“/”表示目录;“@”表示符号链接;“|”表示FIFOs;“=”表示套

接字(sockets)。

-q 用代替不可输出的字符。

-r 对目录反向排序。

-s 在每个文件名后输出该文件的大小。

-t 以时间排序。

-u 以文件上次被访问的时间排序。

-x 按列输出,横向排序。

-A 显示除 “”和“”外的所有文件。

-B 不输出以 “~”结尾的备份文件。

-C 按列输出,纵向排序。

-G 输出文件的组的信息。

-L 列出链接文件名而不是链接到的文件。

-N 不限制文件长度。

-Q 把输出的文件名用双引号括起来。

-R 列出所有子目录下的文件。

-S 以文件大小排序。

-X 以文件的扩展名(最后一个  后的字符)排序。

-1 一行只输出一个文件。

--color=no 不显示彩色文件名

--help 在标准输出上显示帮助信息。

--version 在标准输出上输出版本信息并退出。

一些经典的 Shell 脚本面试问题 - CSDN博客

1 如何在脚本中使用参数

第一个参数 : $1,第二个参数 :$2

例子 : 脚本会复制文件(arg1) 到目标地址(arg2)

/copysh file1txt /tmp/

cat copysh

#!/bin/bash

cp $1 $2

2 如何计算传递进来的参数

$#

3 如何检查之前的命令是否运行成功

$

4 如何获取文件的最后一行

tail -1

5 如何获取文件的第一行

head -1

6 如何获取一个文件每一行的第三个元素

awk'{print $3}'

7 假如文件中每行第一个元素是FIND,如何获取第二个元素

awk'{ if ($1 == "FIND") print$2}'

8 如何调试 bash 脚本

将 -xv 参数加到#!/bin/bash 后

例子:

#!/bin/bash –xv

9 举例如何写一个函数

function example {

echo "Hello world!"

}

10 如何向连接两个字符串

V1="Hello"

V2="World"

V3=${V1}${V2}

echo $V3

输出

HelloWorld

11 如何进行两个整数相加

V1=1

V2=2

let V3=$V1+$V2

echo $V3

输出

3

12 如何检查文件系统中是否存在某个文件

if [ -f /var/log/messages ]

then

echo "File exists"

fi

13 写出 shell 脚本中所有循环语法

for 循环 :

foriin$(ls);do

echo item:$i

done

while 循环 :

#!/bin/bash

COUNTER=0

while [ $COUNTER -lt 10 ]; do

echo The counter is $COUNTER

let COUNTER=COUNTER+1

done

until 循环 :

#!/bin/bash

COUNTER=20

until [ $COUNTER -lt 10 ]; do

echo COUNTER $COUNTER

let COUNTER-=1

done

14 每个脚本开始的#!/bin/sh 或 #!/bin/bash 表示什么意思

这一行说明要使用的 shell。#!/bin/bash表示脚本使用 /bin/bash。对于 python 脚本,就是 #!/usr/bin/python。

15 如何获取文本文件的第 10 行

head -10 file|tail -1

16 bash 脚本文件的第一个符号是什么

#

17 命令:[ -z"" ] && echo 0 || echo 1 的输出是什么

0

18 如何在后台运行脚本

nohup command&

19 "chmod 500 script" 做什么

使脚本所有者拥有可执行权限。

20  ">" 做什么

重定向输出流到文件或另一个流。

21 & 和&& 有什么区别

& - 希望脚本在后台运行的时候使用它

&& - 当前一个脚本成功完成才执行后面的命令/脚本的时候使用它

22 bash shell 脚本中哪个符号用于注释

#

23 ' 和 " 引号有什么区别

' - 当我们不希望把变量转换为值的时候使用它。

" - 会计算所有变量的值并用值代替。

24 如何在脚本文件中重定向标准输出和标准错误流到logtxt 文件

在脚本文件中添加 "exec >logtxt2>&1" 命令。

25 如何只用 echo 命令获取字符串变量的一部分

echo ${variable:x:y}

x - 起始位置

y - 长度

例子:

variable="My name is Petras, and I amdeveloper"

echo ${variable:11:6} # 会显示 Petras

26 如何使用 awk 列出 UID 小于 100 的用户

awk -F: '$3<100' /etc/passwd

27 写程序为用户计算主组数目并显示次数和组名

cat /etc/passwd|cut -d: -f4|sort|uniq-c|while read c g

do

{ echo $c; grep :$g: /etc/group|cut -d:-f1;}|xargs -n 2

done

28 如何获取变量长度

${#variable}

29 如何打印变量的最后 5 个字符

echo ${variable: -5}

30 如何只用 echo 命令替换字符串的一部分

echo ${variable//pattern/replacement}

31 如何计算本地用户数目

wc -l /etc/passwd|cut -d" " -f1 或者 cat /etc/passwd|wc -l

32 不用 wc 命令如何计算字符串中的单词数目

set ${string}

echo $#

33 如何列出第二个字母是 a 或 b 的文件

ls -d [ab]

34 如何将整数 a 加到 b 并赋值给 c

c=$((a+b))

c=`expr $a + $b`

c=`echo "$a+$b"|bc`

35 如何去除字符串中的所有空格

echo $string|tr -d " "

36 写出输出数字 0 到 100 中 3 的倍数(0 3 6 9…)的命令

for i in {01003}; do echo $i; done

for (( i=0; i<=100; i=i+3 )); do echo"Welcome $i times"; done

37 如何打印传递给脚本的所有参数

echo $

echo $@

38  [ $a == $b ] 和[ $a -eq $b ] 有什么区别

[ $a == $b ] - 用于字符串比较

[ $a -eq $b ] - 用于数字比较

39 = 和 == 有什么区别

= - 用于为变量赋值

== - 用于字符串比较

40 写出测试 $a 是否大于 12 的命令

[ $a -gt 12 ]

41 如何检查字符串是否以字母"abc" 开头

[[ $string == abc ]]

42 [[ $string == abc ]] 和 [[ $string == "abc" ]] 有什么区别

[[ $string == abc ]] - 检查字符串是否以字母 abc 开头

[[ $string == "abc" ]] - 检查字符串是否完全等于 abc

43 如何列出以 ab 或 xy 开头的用户名

egrep "^ab|^xy" /etc/passwd|cut-d: -f1

44 bash 中 $! 表示什么意思

后台最近执行命令的 PID

45 $ 表示什么意思

前台最近命令的结束状态。

46 如何输出当前 shell 的 PID

echo $$

47 $ 和 $@ 有什么区别

$ - 以一个字符串形式输出所有传递到脚本的参数

$@ - 以 $IFS 为分隔符列出所有传递到脚本中的参数

48 如何在 bash 中定义数组

array=("Hi" "my""name" "is")

49 如何打印数组的第一个元素

echo ${array[0]}

50 如何打印数组的所有元素

echo ${array[@]}

51 如何输出所有数组索引

echo ${!array[@]}

52 shell 脚本如何获取输入的值

a) 通过参数

/script param1 param2

b) 通过 read 命令

read -p "Destination backup Server :" desthost

在Android 42之前,Android不支持多用户,在42以后Android系统增加了自己的多用户功能。Android是基于Linux的OS,Linux下有一套自己的账户管理体系,而Android在Linux的基础上有一些封装和改动。

在加入了多用户之后,常在源码中看到UserHandle、userid、uid这些概念,一时间让我有些混乱,这里我就来梳理一下,算是做一次记录。

Linux uid

Linux是多用户系统,每个用户都拥有一个uid,这个uid由系统和用户名做映射绑定。同时,为了便于用户管理(譬如管理文档权限),Linux引入了群组的概念,可以将多个用户归于一个群组。每一个群组拥有一个群组id(gid)。

Android uid

Android的应用的UID是从10000开始,到19999结束,可以在Processjava中查看到(FIRST_APPLICATION_UID和LAST_APPLICATION_UID),使用adb shell的ps命令查看到的pid,例如 u0_a 后面的数字就是该应用的UID值减去FIRST_APPLICATION_UID所得的值。

android\os\Processjava

应用安装后,系统重启和应用重启都不会改变uid。

uid记录在 data/system/packagesxml 中。可以dumpsys出来看看。

通过源码可以看到,UserHandle包含三种概念:userid、uid、appid

userid :就是有多少个实际的用户,即手机里的主机、访客等多用户。

uid :上文讲过他跟应用进程相关,除了shareduid的应用,每个用户的每个应用的uid不一样的。

appid :跟app相关,包名相同的appid都一样,即使是不同用户。

Linux系统中,每个用户的ID都有两种,即用户ID(User ID,简称UID)和组ID(Group

ID,简称GID),这与文件拥有者和拥有群组两种属性所对应。

文章开头也提到了,Linux系统并不认识我们的用户名和密码,那问题来了,文件是如何判别它的拥有者名称及群组名称的呢

每个文件都有自己的拥有者ID和群组ID,在显示文件属性时,系统会根据/etc/passwd和/etc/group文件中的内容,分别找到UID和GID所对应的用户名和群组名,最终显示出来。

在/etc/passwd文件中,利用UID可以找到所对应的用户名,在/etc/group文件中,利用GID可以找到所对应的群组名。

可以做个小实验,在Linux *** 作系统中,常用的有两个账户,分别为root超级管理员账户和普通账户,我们可以先使用root账号登录并执行命令vim

/etc/passwd,在该文件中找到普通用户并将其UID随意改一个数字,这是你会发现,当你查看普通账户所拥有的文件时,你会发现所有文件的拥有者并不是普通用户,而是数字。

一般情况下,当登录Linux *** 作系统后,会先寻找/etc/passwd是否有输入账号,如果没有,则跳出,如果有,则读取对应的UID与GID,随后进入/etc/shadow核对密码,一切完成后,则进入shell管控。

由此可见,UID与GID在日常的账户管理中,发挥着非常重要的作用,因为一不小心就可能访问不了自己的文件,所以温馨提示大家,不要随便改动自己的/etc/passwd与/etc/group文件。

以上就是关于创建三个用户,算三个用户的UID加起来的结果,如何做成个shell脚本全部的内容,包括:创建三个用户,算三个用户的UID加起来的结果,如何做成个shell脚本、用shell命令取得文件生成时间、Linux使用之grep,shell脚本(一)等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/web/9291763.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-04-26
下一篇2023-04-26

发表评论

登录后才能评论

评论列表(0条)

    保存