shell脚本构建基本脚本
Posted zqq_hello_world
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了shell脚本构建基本脚本相关的知识,希望对你有一定的参考价值。
构建基本脚本
shell脚本关键在于输入多个命令并处理每个命令的结果,甚至可以将一个命令的结果传递给另一个命令。
创建shell脚本
使用touch命令创建文件:touch firstshell.sh
使用chmod命令赋予执行权限:chmod u+x firstshell.sh
#!/bin/bash
# 井号(#)是注释
echo 'this is first shell script'
上面脚本第一行(#!/bin/bash)表示用哪个shell来运行,第二行是注释部分,echo是输出命令,运行这个脚本会在控制台打印一段话。
执行脚本的两种方式
- 将shell脚本文件所处的目录添加到PATH环境变量中,任何地方输入脚本名称即可执行脚本
- 输入绝对或相对文件路径来引用shell脚本文件
shell脚本中的变量
shell脚本中可以使用系统的环境变量和自定义用户变量
#!/bin/bash
#使用系统环境变量,通过($)符使用变量,特殊符号用\\转译,单引号不会把$识别成去读取变量
echo "Path环境变量为:$PATH"
#自定义变量,注意变量名称区分大小写,带空格需要用引号
var1=zqq
var2=var1
var3="hello world"
echo "打印用户自定义变量:var1=$var1,var2=$var2,var3=$var3"
命令输出赋给变量
shell脚本可以从命令输出中提取信息,并将其赋给变量。把输出赋给变量后就可以在脚本中很方便的使用。
把命令输出赋给变量的两种方式:
-
反向引号(`)
-
$()格式
#!/bin/bash #将date命令输出结果赋变量 var1=`date` var2=$(date)
重定向输入和输出
有些时候需要将命令的输出保存到文件中,而不仅仅只显示在显示器上。base shell提供了操作符可以将输出重定向到另一个位置。也可以输入。
输出重定向
可以用大于号(>)进行输出重定向,也可以用双大于号(>>)进行输出重定向。他们到区别是单大于号是覆盖操作,如果已经有文件,会覆盖掉已经存在的文件,而双大于号是追加输出,如果文件已经存在会把输出的内容追加在后面。
#!/bin/bash
#输出重定向,覆盖将时间命令的输出到文件中
date > /logs/test.log
#输出重定向,追加
date >> /logs/test.log
输入重定向
输入重定向将文件内容重定向命令。
#创建啊atext文件,把文件内容重定向到wc命令
wc < atext
#内联输入重定向,直接将文本内容重定向到命令
wc << EOF
> aa
> bb
> cc
> dd
> ee
> ff
> EOF
管道
我们可以一个命令的输出重定向到另一个命令,这个过程叫作管道连接(piping)。管道符号(|)。可以通过管道符号把一个命令的输出重定向到另一个命令。
#常用的管道命令,查找程序进程信息。通过管道符号把进程信息的输出结果给到grep命令,
#然后搜索到java关键字的信息
ps -ef | grep java
控制脚本
Linux利用信号与运行在系统上的进程进行通信。base shell允许用键盘上的组合建生成两种基本的Linux信号
1、中断进程:ctrl + c
ctrl+c会生成终止进程信号(2),并发送给当前shell中运行的所有进程,停止shell中当前运行的进程。
2、暂停进程:ctrl + z
ctrl+z会生成一个暂停信号停止shell中运行的进程,但不终止进程。
捕获信号
捕获信号可以在信号出现时捕获他们并执行其他命令。trap命令允许指定shell脚本要监看并从shell中拦截的信号。如果脚本中收到了trap命令中列出的信号,该信号不再由shell处理,而是由本地处理。
命令格式:trap [命令] [信号值]
阻止用户通过ctrl+c来停止脚本
#!/bin/bash
#阻止用户通过ctrl+c来停止脚本
trap "echo 'Sorry,dont stop!'" SIGINT
#睡10s,期间通过ctrl+c无法终止脚本
sleep 10
#睡眠期间ctrl+c并不会影响后续执行下面的输出,如果不通过trap捕获则不会输出直接中断
echo "end print"
捕获脚本退出
#!/bin/shell
#捕获退出
trap "echo 'script exit'" EXIT
sleep 10
echo "the end"
修改或移除捕获
修改捕获只需要在脚本别的地方重新使用trap捕获,如果在修改前被捕获到则会执行之前定义的,否则会执行之后的定义。删除捕获只需在trap命令与希望恢复默认行为的信号列表之间建设两个破折号。
#!/bin/bash
trap "echo 'Sorry,dont stop!'" SIGINT
sleep 10
echo "update before"
#修改捕获
trap "echo 'Sorry,dont stop!===='" SIGINT
sleep 10
echo "update end" #删除捕获
trap — SIGINT
sleep 10
echo "end print"
以后台模式运行脚本
以后台模式运行脚本只需在脚本后加一个&符号。以后台模式运行脚本,会返回一个带有作业号的进程号的信息,并在后台运行。不过后台运行脚本的输出会打印在控制台。
#后台模式运行脚本
./shell.sh &
执行脚本后加&符号,在主shell退出时,会同时结束在后台运行进程,可以加nohup来阻止进行结束
#使用nohup命令,如果会话结束时,脚本会忽略终端发过来挂起信号
nohup ./shell.sh &
以上是关于shell脚本构建基本脚本的主要内容,如果未能解决你的问题,请参考以下文章