前言
由于新项目马上开始,需要使用SHELL,结果一年前作的SHELL的东西,全部忘干净了,为了杜绝此类事情再次发生,特来此地把即将使用的SHELL的关键语法点加以总结,以备后用。
1.trap
它主要用来接收在脚本运行过程中的用户的键盘操作(主要就是Ctrl+C).也就是用户试图中断当前运行的脚本的时候,给出提示。
一. trap捕捉到信号之后,可以有三种反应方式:
(1)执行一段程序来处理这一信号
(2)接受信号的默认操作
(3)忽视这一信号
二. trap对上面三种方式提供了三种基本形式:
第一种形式的trap命令在shell接收到signal list清单中数值相同的信号时,将执行双
引号中的命令串。
trap 'commands' signal-list
trap "commands" signal-list
为了恢复信号的默认操作,使用第二种形式的trap命令:
trap signal-list
第三种形式的trap命令允许忽视信号
trap " " signal-list
注意:
(1) 对信号11(段违例)不能捕捉,因为shell本身需要捕捉该信号去进行内存的转储。
(2) 在trap中可以定义对信号0的处理(实际上没有这个信号), shell程序在其终止(如
执行exit语句)时发出该信号。
(3) 在捕捉到signal-list中指定的信号并执行完相应的命令之后, 如果这些命令没有
将shell程序终止的话,shell程序将继续执行收到信号时所执行的命令后面的命令,这样将
很容易导致shell程序无法终止。
另外,在trap语句中,单引号和双引号是不同的,当shell程序第一次碰到trap语句时,
将把commands中的命令扫描一遍。此时若commands是用单引号括起来的话,那么shell不会
对commands中的变量和命令进行替换, 否则commands中的变量和命令将用当时具体的值来
kill -l可以列出系统的信号
1) SIGHUP 2) SIGINT 3) SIGQUIT 4) SIGILL
5) SIGTRAP 6) SIGABRT 7) SIGBUS 8) SIGFPE
9) SIGKILL 10) SIGUSR1 11) SIGSEGV 12) SIGUSR2
13) SIGPIPE 14) SIGALRM 15) SIGTERM 16) SIGSTKFLT
17) SIGCHLD 18) SIGCONT 19) SIGSTOP 20) SIGTSTP
21) SIGTTIN 22) SIGTTOU 23) SIGURG 24) SIGXCPU
25) SIGXFSZ 26) SIGVTALRM 27) SIGPROF 28) SIGWINCH
29) SIGIO 30) SIGPWR 31) SIGSYS 34) SIGRTMIN
35) SIGRTMIN+1 36) SIGRTMIN+2 37) SIGRTMIN+3 38) SIGRTMIN+4
39) SIGRTMIN+5 40) SIGRTMIN+6 41) SIGRTMIN+7 42) SIGRTMIN+8
43) SIGRTMIN+9 44) SIGRTMIN+10 45) SIGRTMIN+11 46) SIGRTMIN+12
47) SIGRTMIN+13 48) SIGRTMIN+14 49) SIGRTMIN+15 50) SIGRTMAX-14
51) SIGRTMAX-13 52) SIGRTMAX-12 53) SIGRTMAX-11 54) SIGRTMAX-10
55) SIGRTMAX-9 56) SIGRTMAX-8 57) SIGRTMAX-7 58) SIGRTMAX-6
59) SIGRTMAX-5 60) SIGRTMAX-4 61) SIGRTMAX-3 62) SIGRTMAX-2
63) SIGRTMAX-1 64) SIGRTMAX
名称 默认动作 说明
SIGHUP 终止进程 终端线路挂断
SIGINT 终止进程 中断进程
SIGQUIT 建立CORE文件 终止进程,并且生成core文件
SIGILL 建立CORE文件 非法指令
SIGTRAP 建立CORE文件 跟踪自陷
SIGBUS 建立CORE文件 总线错误
SIGSEGV 建立CORE文件 段非法错误
SIGFPE 建立CORE文件 浮点异常
SIGIOT 建立CORE文件 执行I/O自陷
SIGKILL 终止进程 杀死进程
SIGPIPE 终止进程 向一个没有读进程的管道写数据
SIGALARM 终止进程 计时器到时
SIGTERM 终止进程 软件终止信号
SIGSTOP 停止进程 非终端来的停止信号
SIGTSTP 停止进程 终端来的停止信号
SIGCONT 忽略信号 继续执行一个停止的进程
SIGURG 忽略信号 I/O紧急信号
SIGIO 忽略信号 描述符上可以进行I/O
SIGCHLD 忽略信号 当子进程停止或退出时通知父进程
SIGTTOU 停止进程 后台进程写终端
SIGTTIN 停止进程 后台进程读终端
SIGXGPU 终止进程 CPU时限超时
SIGXFSZ 终止进程 文件长度过长
SIGWINCH 忽略信号 窗口大小发生变化
SIGPROF 终止进程 统计分布图用计时器到时
SIGUSR1 终止进程 用户定义信号1
SIGUSR2 终止进程 用户定义信号2
SIGVTALRM 终止进程 虚拟计时器到时
------------------------------------------
请记住,脚本程序通常是以从上到下的顺序解释执行的,所以必须在你想保护的那部分代码以前指定trap命令。
信 号 |
说 明 |
HUP(1) |
挂起,通常因终端掉线或用户退出而引发 |
INT(2) |
中断,通常因按下Ctrl+C组合键而引发 |
QUIT(3) |
退出,通常因按下Ctrl+/组合键而引发 |
ABRT(6) |
中止,通常因某些严重的执行错误而引发 |
ALRM(14) |
报警,通常用来处理超时 |
TERM(15) |
终止,通常在系统关机时发送 |
2.cat
cat 把档案串连接后传到标准输出
参数:
-n 或 --number 由 1 开始对所有输出的行数编号
-b 或 --number-nonblank 和 -n 相似,只不过对于空白行不编号
-s 或 --squeeze-blank 当遇到有连续两行以上的空白行,就代换为一行的空白行
-v 或 --show-nonprinting
范例:
cat -n textfile1 > textfile2 把 textfile1 的档案内容加上行号后输入 textfile2 这个档案里
cat -b textfile1 textfile2 >> textfile3 把 textfile1 和 textfile2 的档案内容加上行号(空白行不加)之后将内容附加到 textfile3 里。
范例:
把 textfile1 的档案内容加上行号后输入 textfile2 这个档案里
cat -n textfile1 > textfile2
把 textfile1 和 textfile2 的档案内容加上行号(空白行不加)之后将内容附加到 textfile3 里。
cat -b textfile1 textfile2 >> textfile3
cat /dev/null > /etc/test.txt 此为清空/etc/test.txt档案内容
如果在命令行中直接输入cat,那么接下来,你输入什么,会立即显示什么,直到ctrl+D结束文件输入
cat > junk
3.usermod
修改使用者帐号 名称
usermod - 修 改 使 用 者 帐 号
语法
usermod [-c comment] [-d home_dir [ -m]] [-e expire_date] [-f inactive_time] [-g initial_group] [-G group[,...]] [-l login_name] [-s shell] [-u uid [ -o]] login
描述
usermod 命 令 会 参 照 你 命 令 列 上 指 定 的 部 份 修 改 系 统 帐 号 档 。 下 列 为 usermod 可 选 用 的 参 数 。
-c comment
更 新 使 用 者 帐 号 password 档 中 的 注 解 栏 , 一 般 是 使 用 chfn(1) 来 修 改 。
-d home_dir
更 新 使 用 者 新 的 登 入 目 录 。 如 果 给 定 -m 选 项 , 使 用 者 旧 目 录 会 搬 到 新 的 目 录 去 ,如 旧 目 录 不 存 在 则 建 个 新 的 。
-e expire_date
加 上 使 用 者 帐 号 停 止 日 期 。 日 期 格 式 为 MM/DD/YY.
-f inactive_days
帐 号 过 期 几 日 后 永 久 停 权。当 值 为 0 时 帐 号 则 立 刻 被 停 权 。 而 当 值 为 -1 时 则 关闭此功能 。预 设 值 为 -1。
-g initial_group
更 新 使 用 者 新 的 起 始 登 入 群 组 。 群 组 名 须 已 存 在 。群 组 ID 必 须 参 照 既 有 的 的 群 组 。 群 组 ID 预 设 值 为 1 。
-G group,[...]
定 义 使 用 者 为 一 堆 groups 的 成 员 。 每 个 群 组 使 用 ??区 格 开 来 , 不 可 以 夹 杂 空 白 字 元 。 群 组 名 同 -g 选 项 的 限 制 。 如 果 使 用 者 现 在 的 群 组 不 再 此 列 , 则 将 使 用 者 由 该 群 组 中 移 除 。
-l login_name
变 更 使 用 者 login 时 的 名 称 为 login_name 。 其 于 不 变 。 特 别 是 , 使 用 者 目 录 名 应 该 也 会 跟 着 更 动 成 新 的 登 入 名 。
-s shell
指 定 新 登 入 shell 。 如 此 栏 留 白 , 系 统 将 选 用 系 统 预 设 shell 。
-u uid 使
用 者 ID 值 。必 须 为 唯 一 的 ID 值 , 除 非 用 -o 选 项 。 数 字 不 可 为 负 值。预 设 为 最 小 不 得 小 于 99 而 逐 次 增 加 。 0~99 传 统 上 是 保 留 给 系 统 帐 号 使 用 。 使 用 者 目 录 树 下 所 有 的 档 案 目 录 其 user ID 会 自 动 改 变 。 放 在 使 用 者 目 录 外 的 档 案 则 要 自 行 手 动 更 动 。
警告
usermod 不 允 许 你 改 变 正 在线 上 的 使 用 者 帐 号 名 称 。 当 usermod 用 来 改 变 user ID, 必 须 确 认 这 名 user 没 在 电 脑 上 执 行 任 何 程 序。 你 需 手 动 更 改 使 用 者 的 crontab 档 。 也 需 手 动 更 改 使 用 者 的 at 工 作 档 。 采 用 NIS server 须 在 server 上 更 动 相 关 的 NIS 设 定 。
档案
/etc/passwd - 使 用 者 帐 号 资 讯 /etc/shadow - 使 用 者 帐 号 资 讯 加 密 /etc/group - 群 组 资 讯
语法:usermod [-LU][-c <备注>][-d <登入目录>][-e <有效期限>][-f <缓冲天数>][-g <群组>][-G <群组>][-l <帐号名称>][-s <shell>][-u <uid>][-p <密码>][用户帐号]
补充说明: usermod可用来修改用户帐号的各项设定。
参数:
-c 更改 /etc/passwd 第5栏用户信息说明的部分,后面接描述信息,可以使用 chfn 命令替代
-d 更改 /etc/passwd 第6栏用户的家目录部分,如果再加上 -m 参数(只与-d配合)。则会将现有家目录的地址重命名为新的家目录地址,如原来没有指定家目录地址,则为账号新建一个指定的家目录地址。
-e 更改 /etc/shadow 的第8栏账号的失效日期,后面接日期参数格式为 MM/DD/YY 或 YYYY-MM-DD
-f 更改 /etc/shadow 的第7栏账号过期宽限时间部分,当后面接的值为 0 时,账号立即失效,为 -1 时关闭此功能默认值为 -1
-g 后面接 group name 必须是现有 group 组中的一个,改变用户的初始化用户组 id 对应 /etc/passwd 的第4栏内容
-G 后面接 group name 必须是现有 group 组中存在的组名,改变用户能够支持的用户组,修改的是 /etc/group
-l 后面接账号名称,即更改用户名。对应的是 /etc/passwd 的第一栏
-s 后面接shell的实际文件,即 /bin/bash ,/bin/csh之类,可以使用 chsh 命令替代
-u 更改用户的UID,对应的是 /etc/passwd 的和3栏数据,此 UID 不能与目前系统中已经存在的UID相同
-L 暂将用户的密码冻结,禁止其登录,即更改 /etc/shadow 的密码栏,在其前面加上 !
-U 暂将用户的密码解冻,即去掉其 /etc/shadow 密码栏前面的 !
-p 更改用户密码,所输入密码为MD5加密后的密文!
4. eval command-line
其中command-line是在终端上键入的一条普通命令行。然而当在它前面放上eval时,其结果是shell在执行命令行之前扫描它两次。如:
pipe="|"
eval ls $pipe wc -l
shell第1次扫描命令行时,它替换出pipe的值|,接着eval使它再次扫描命令行,这时shell把|作为管道符号了。
如果变量中包含任何需要shell直接在命令行中看到的字符(不是替换的结果),就可以使用eval。命令行结束符(;| &),I/o重定向符(< >)和引号就属于对shell具有特殊意义的符号,必须直接出现在命令行中。
2. eval echo \$$# 取得最后一个参数
如:cat last
eval echo \$$#
./last one two three four
four
第一遍扫描后,shell把反斜杠去掉了。当shell再次扫描该行时,它替换了$4的值,并执行echo命令
3.以下示意如何用eval命令创建指向变量的“指针”:
x=100
ptrx=x
eval echo \$$ptrx 指向ptrx,用这里的方法可以理解b中的例子
100 打印100
eval $ptrx=50 将50存到ptrx指向的变量中。
echo $x
50 打印50