SHELL基本语法使用总结

本文深入解析Shell编程中关键命令的使用技巧,包括trap用于捕捉用户输入信号,cat用于文件内容处理,usermod用于用户账号管理,以及eval命令在命令执行中的应用。详细讲解了每种命令的功能、参数及其实例,旨在帮助开发者高效利用Shell进行脚本编程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

        前言

        由于新项目马上开始,需要使用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

其中commandline是在终端上键入的一条普通命令行。然而当在它前面放上eval时,其结果是shell在执行命令行之前扫描它两次。如:

pipe="|"

eval ls $pipe wc -l

shell1次扫描命令行时,它替换出pipe的值|,接着eval使它再次扫描命令行,这时shell把|作为管道符号了。

如果变量中包含任何需要shell直接在命令行中看到的字符(不是替换的结果),就可以使用eval。命令行结束符(;| &),Io重定向符(< >)和引号就属于对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


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值