21 AUG
13.3.3 shell script 的默认变量($0, $1)
/path/to/scriptname opt1 opt2 opt3
执行脚本的路径和文件名是$0变量,opt1~opt3是$1-$3变量。
符号 | 意义 |
---|---|
$0 | 被执行的文件名 |
$# | 文件名后接的参数“个数” |
$@ | 代表”$1”,”$2”,”$3”,”$4”等变量的具体内容 |
shfit:造成参数变量号码偏移
shift会移动变量,而且shift后面可以接数字,代表拿掉最前面的n个参数的意思。
条件判断式
if [条件判断式] ; then
当成立时执行
fi
if [条件判断式1] ; then
当成立时执行
elif [条件判断式2] ; then
当成立时执行
else
当判断式1和2都不成立时可以进行
fi
13.4.2 利用case…esac判断
case $变量名称 in
"one")
echo "Your choice is ONE"
;;
"two")
echo "Your choice is TWO"
;;
"three")
echo "Your choice is THREE"
;;
*)
echo "Cannot get your choice."
;;
esac
13.4.3 利用function功能
function fname(){
}
echo -n "Your choice is ..." #加上-n可以不断行,继续在同一行显示
function的参数:
function printit(){
echo "Your choice is $1" #这里的$1与主函数的$1不同。
}
case $1 in
"one")
printit 1
;;
"two")
printit 2
;;
"three")
printit 3
;;
*)
echo "Usage $0 {one|two|three}"
;;
esac
13.5 循环loop
13.5.1 while do done, until do done 不定循环
- 当condition条件成立时,就进行循环,到condition的条件不成立才停止。
while [ condition ] #中括号内的状态是判断式
do
程序段落
done
- 当condition条件成立时,就终止循环,否则就持续进行循环程序段。
until [ condition ]
do
程序段落
done
13.5.2 for…do…done 固定循环
for var in con1 con2 con3 ...
do
程序段
done
#第一次循环时,$var的内容为con1;
#第二次循环时,$var的内容为con2;
#第三次循环时,$var的内容为con3;
#...
finger 命令: reference
- 用来显示用户的相关信息,包括用户名、用户全名、终端设备和登陆时间等信息
finger [options] [user-list]
参数
不带任何参数时,finger将提供关于登录本地系统的用户的短报告(-s)。当指定参数user-list时,finger将提供user-list中关于每个用户的长报告(-l)。user-list中的名字不区分大小写。
如果用户名包含符号@,则finger将符号@后面的文件名解释为远程主机名,通过网络连接到该主机。如果在符号@前面存在一个用户名,那么finger将提供远程系统上的用户的相关信息
选项
-l 当指定user-list时,默认显示用户的详细信息
-s 当不指定user-list时,默认给出关于每个用户的短报告
13.5.3 for…do…done的数值处理
for ((初始值,限制值,执行步长))
do
程序段
done
eg.
read -p nu
s=0
for ((i=i;i<=$nu;i=i+1))
do
s=$(($s+$i))
done
echo "The sum is $s."
13.6 shell script的追踪与调试
`sh -[nvx] script.sh` 参数: -n : 不要执行script, 仅查询语法的问题 -v : 在执行script之前,现将script的内容输出到屏幕上 -x : 将使用到的script内容显示在屏幕上(就是去掉注释)–对debug很有用14.1.1 用户标识符:UID与GID
用户的ID与账号存在`/etc/passwd`中。在显示文件属性的时候,系统会根据`/etc/passwd`与`/etc/group`的内容,找到UID/GID对应的账号与组名再显示出来。 如果UID/GID的号码被修改了,文件属性所有者会变成数字。- 查找系统里面有没某用户
grep "username" /etc/passwd
14.1.2 用户账号
用户输入账号登陆系统之前,系统进行了哪些操作呢?
- 找
/etc/passwd
里面有没有输入的账号,没有则跳出;有则将该账号的UID和GID(在/etc/group
)读出来。另外,该账号的主文件夹和shell设置也一同读出。 - 核对密码表。查找
/etc/shadow
对应的账号与UID,然后核对密码是否相符 - 如果一切顺利,就能登陆成功,进入shell控管的阶段了。
所以,每次登陆linux时需要访问到/etc/passwd
和/etc/shadow
文件。
解析/etc/passwd
文件
位置序号 | 名称 | 含义 |
---|---|---|
1 | 账号名称 | 就是账号名,用来对应UID |
2 | 密码 | 早期的密码放在这里…现在看到的是“x” |
3 | UID | 用户标识符,0:系统管理员root,1~499:系统账号,500~65535:可登陆账号 |
4 | GID | 与/etc/group 有关 |
5 | User Info | 解释账号的意义 |
6 | 主文件夹 | 对应用户的主文件夹,eg /root,/liangst。如果想把该用户的主文件夹定义成别的文件夹,在这里改就可以了。 |
7 | Shell | 用户登陆之后能取得一个shell来与系统的内核通信。 |
14.1.3 有效与初始用户组
/etc/group文件结构
1. 用户组名称
2. 用户组密码。给用户组管理员用的,现在通常都是x了。
3. GID。用户组的ID。与/etc/passwd的第四个字段GID对应的。
4. 此用户组支持的账号名称。用“,”分隔,eg root:x:0:root,dmtsai
有效用户组(effective group)与初始用户组(initial group):
- 初始用户组:用户一登陆会自动取得的用户组,这组不需要在/etc/group的第四字段记录该账号。
- 非初始用户组:要在/etc/group上加上该账号
- 某个用户账号可以同时支持两个或以上用户组。因此所在用户组拥有的功能,这个用户都会拥有。
假如该用户现在要创建一个文件夹或者文件,新文件(夹)的组是属于哪个呢?这要检查当时的有效用户组:
- 可以用
groups
指令查看该用户所有支持的用户组。而且第一个输出的用户组就是有效用户组。
有效用户组的切换:
- 可以用
newgrp groupname
指令切换有效用户组。前提是该用户本身有该用户组的支持。 - 这个newgrp命令的原理:它是用一个另外的shell来提供这个功能的。就好像用户切换
su - root
那样,所以如果想退回去原来的组可以用exit。
/etc/gshadow
文件:
- 结构与
/etc/group
一样的。 - 第二字段密码列,如果开头为“!”表示没有合法密码,所以没有用户组管理员
- 第三字段:用户组管理员的账号
- 第四字段:该用户组的所属账号(与
/etc/group
相同)