计算机系统应用教程网站

网站首页 > 技术文章 正文

Shell编程干货 - Linux笔记整理

btikc 2024-09-03 11:23:47 技术文章 29 ℃ 0 评论

#!/bin/sh
对此脚本使用/bin/sh来解释执行,#!是特殊的表示符,其后表示解释此脚本程序路径。可用各种各样的解释器来写对应的脚本,例如:/bin/bash,/bin/perl

local本地变量
shell脚本中定义的变量默认是global的,其作用域从被定义的地方开始,到shell结束。
函数内定义的变量可被显式地定义为local的,其作用域局限于函数内。

set指令
set的+和-选项用于关闭或者打开某些特性,有多种特性,例如-x特性,
set -x与set +x指令用于脚本调试:set -x 开启调试 set +x 关闭调试 set -o 查看调试
想知道脚本内部执行的变量值或执行结果,这时可在脚本内部指定set -x
set的--选项表示将参数值传给位置参数($1,$2...),例如:
set -- p1 p2 -host -4
echo $@
p1 p2 -host -4
echo $1,$2,$3,$4
p1 p2 -host -4

chmod指令
chmod +x variable

shift指令
位置参数可以用shift命令左移。比如shift 3表示原来的$4现在变成$1,原来的$5现在变成$2等等,原来的$1、$2、$3丢弃,$0不移动。
不带参数的shift命令相当于shift 1,shift 1命令每执行一次,变量的个数($#)减一,而变量值提前一位

cut/awk/sed/grep
---cut用于对数据进行“列”的提取操作(语法:cut [选项] [file]),例如:cut -d ':' -f 1,3 ./package.json表示以:为分隔符,截取package.json第一列和第三列内容
cut命令缺点是不能以空格作为分隔符,解决办法是使用awk命令
---awk用于对数据进行“列”的提取操作(语法:awk '条件1 {执行动作} 条件2 {执行动作} ' 文件名),提示:条件是可以省略的
比cut功能更强大,支持条件判断,数组,循环等功能。它先一行一行的按行读取数据,然后再按列提取数据。
awk '{print $1}' /etc/passwd表示打印/etc/passwd文件第一列,{print $1}表示执行动作,根据awk的语法,我们并没有添加条件,awk默认把一整行当成一列
awk -F ':' '{print $1}' /etc/passwd或cat /etc/passwd | awk -F ':' '{print $1}',表示根据“:”进行分隔,若不指定-F ':',默认以空格分隔
df -h | awk 'NR==1 {print $1}' 表示打印df -h命令输出内容的第一行第一列(未指定-F参数,默认以空格进行列分隔)
df -h | awk '(NR>=2 && NR <=5) {print $1}' 表示打印第二行到第五行的第一列,df -h | awk '{print $NF}'表示打印最后一列
---sed命令主要对数据进行处理(选取,新增,替换,删除,搜索,语法:sed [选项] [动作] 文件名)
df -h | sed -n '2p' 表示打印第二行内容;df -h | sed '2d' 表示将打印内容的第二行删除;
df -h | sed '2a 123456表示在第2行下面插入123456;df -h | sed '2i 123456表示在第2行上面插入123456
df -h | sed '2c 1234567890' 表示将第2行内容替换为1234567890;sed -n '/zh/p' 123.txt 表示搜索123.txt中包含‘zh’的行,并打印出来
df -h | sed 's/容量/size/g' 表示将打印内容的容量替换为size;sed -i 's/cong/科技/g' 123.txt 表示将文件中的'cong'替换为'科技'

---grep家族总共有三个:grep,egrep,fgrep,用于查找过滤内容。常用选项:-i忽略大小写,--color将匹配到的内容以高亮显示,-o只显示被模式匹配到的字符串


$0/$1/$2/...位置变量
$0表示当前shell脚本名,$1传给当前脚本的第1个参数,$2传给当前脚本的第2个参数,...
$#表示传给脚本的参数个数。
$*或$@表示所有参数列表,两者区别在于返回数据格式不一样。
$表示当前脚本运行的进程ID号。
$!表示后台运行的最后一个进程的进程ID号。
$?表示上一个命令的返回值(显示最后命令的退出状态。0表示没有错误,其他任何值表明有错误)

通过$?变量可获取exit的数值,一般用来判断程序是否正常结束,用于进行shell脚本业务流程控制:
exit 0:正常运行程序并退出程序,为0即表示程序运行正常
exit 1:非正常运行导致退出程序,也可以约定为其他数字,表示不同异常情况,不为0即表示程序运行出错

整数比较
-eq 等于,如:if ["$a" -eq "$b" ]
-ne 不等于,如:if ["$a" -ne "$b" ]
-gt 大于,如:if ["$a" -gt "$b" ]
-ge 大于等于,如:if ["$a" -ge "$b" ]
-lt 小于,如:if ["$a" -lt "$b" ]
-le 小于等于,如:if ["$a" -le "$b" ]
< 小于(需要双括号),如:(("$a" < "$b"))
<= 小于等于(需要双括号),如:(("$a" <= "$b"))
> 大于(需要双括号),如:(("$a" > "$b"))
>= 大于等于(需要双括号),如:(("$a" >= "$b"))
例如:while [ "$#" -ne 0 ]中-ne表示不等于,表示传给脚本参数个数不为0

while循环
利用while循环计算1到100的和:
#!/bin/bash
i=1
sum=0
while [ $i -le 100 ]
do
let sum=sum+$i
let i++
done
echo $sum

使用read结合while循环读取文本文件:
#!/bin/bash
file = $1
if [ $# -lt 1 ];then #判断用户是否输入了位置参数
echo "Usage:$0 filepath"
exit
fi
while read -r line #从文件中读取文件内容赋值给line(选项-r会屏蔽文本中的特殊符号,只做输出不做转译)
do
echo $line
done < $file


case条件
以run.sh脚本第一个参数为例,当第一个参数为start时,调用startup方法,当第一个参数为stop时,调用shutdown方法...
case $1 in
start)
startup
;;
stop)
shutdown
;;
restart)
shutdown
startup
;;
esac
=================================================================

当执行shell命令时,会默认打开3个文件,每个文件有对应的文件描述符来方便我们
类型 文件描述符 默认情况 对应文件句柄位置
标准输入 0 从键盘获得输入 /proc/slef/fd/0
标准输出 1 输出到屏幕(即控制台) /proc/slef/fd/1
错误输出 2 输出到屏幕(即控制台) /proc/slef/fd/2

执行shell命令都默认是从键盘获得输入,将结果输出到控制台上。但可通过更改文件描述符默认指向,将输入输出的重定向。
使用>或者>>对输出进行重定向。符号的左边表示文件描述符,如果没有的话表示1,也就是标准输出,例如:
将原本在屏幕打印的内容重定向写入到test.txt文件
echo "hello" >test.txt 等价于 echo "hello" 1>test.txt
echo "hello" >>test.txt 等价于 echo "hello" 1>>test.txt

>或>>右边可以是一个文件,也可以是一个输出设备。
当使用>时,直接创建新文件(若存在则先删除)。
当使用>>时,表示追加内容到文件,则不会删除原来已存在的文件。

echo 'aaa' >/dev/null 2>&1。这条命令实际分为两命令,1>/dev/null 和 2>&1
1>/dev/null
该命令作用是将标准输出1重定向到linux空设备文件/dev/null文件中(所有往/dev/null文件写入的内容都会丢失,俗称“黑洞”)。
执行了>/dev/null后,标准输出就不再存在,没有任何地方能够找到输出的内容。
2>&1
&表示将错误输出2和标准输出1输出到相同的地方,相当于echo 'aaa' 1>/dev/null 2>/dev/null,这样该命令不会输出任何信息到屏幕和文件。

对换位置会产生不同结果
命令 标准输出 错误输出
>/dev/null 2>&1 丢弃 丢弃
2>&1 >/dev/null 丢弃 屏幕

注意:
不应echo 'aaa' 1>/dev/null 2>/dev/null,因为这样写会导致标准输出和错误输出打开两次/dev/null文件,会抢占向文件写入的管道,导致输出
内容出现缺失和覆盖等,或出现乱码,或只有错误内容或标准内容。而>/dev/null 2>&1只会打开一次/dev/null文件,IO效率较高。

nohup结合
经常会用nohup command &命令形式来启动一些后台程序,例如:nohup java -jar xxxx.jar &
为了不让一些执行信息输出到前台(控制台),我们还可加上>/dev/null 2>&1丢弃所有输出:nohup java -jar xxxx.jar >/dev/null 2>&1 &

Tags:

本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

最近发表
标签列表