Linux shell编程学习总结

本文介绍了Shell编程的基础知识,包括Shell脚本的执行方式、变量定义与使用、流程控制语句等,并详细讲解了sed和awk这两个强大的文本处理工具。

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


主要内容:

  • shell编程
  • sed命令
  • awk命令
  • crontab定时器

什么是Shell?
Shell是用户与内核进行交互操作的一种接口,目前最流行的Shell称为bash Shell
Shell也是一门编程语言<解释型的编程语言>,即shell脚本
一个系统可以存在多个shell,可以通过cat /etc/shells命令查看系统中安装的shell,不同的shell可能支持的命令语法是不相同的


Shell脚本的执行方式?

第一种:输入脚本的绝对路径或相对路径
首先要赋予+x权限

/root/helloWorld.sh
./helloWorld.sh
或者,不用赋予+x权限,而用解释器解释执行
sh  helloworld.sh

第二种:bash或sh +脚本

    sh /root/helloWorld.sh
    sh helloWorld.sh

第三种:在脚本的路径前再加”. “

    . /root/helloWorld.sh
    . ./helloWorld.sh

区别:第一种和第二种会新开一个bash,不同bash中的变量无法共享.


Shell中的变量?
Linux Shell中的变量分为“系统变量”和“用户自定义变量”,可以通过set命令查看那系统变量
系统变量:$HOME、$PWD、$SHELL、$USER等等

显示当前shell中所有变量 : set


定义变量?
变量=值 (例如STR=abc)
等号两侧不能有空格
变量名称一般习惯为大写
双引号和单引号有区别,双引号仅将空格脱意,单引号会将所有特殊字符脱意

STR="hello world"
A=9

unset A撤销变量 A
readonly B=2 声明静态的变量 B=2 ,不能 unset
export 变量名 可把变量提升为全局环境变量,可供其他shell程序使用


将命令的返回值赋给变量?
A=ls -la ( ls与la用`符号包括在内(波浪线按键中的,编辑器问题会被转义))反引号,运行里面的命令,并把结果返回给变量A
A=$(ls -la) 等价于反引号


Shell中的特殊变量?
$? 表示上一个命令退出的状态
$$ 表示当前进程编号
$0 表示当前脚本名称
$n 表示n位置的输入参数(n代表数字,n>=1)
$# 表示参数的个数,常用于循环
$*和$@ 都表示参数列表


$*与 @? @ 区 别 ? * 和 @ @ 都 表 示 传 递 给 函 数 或 脚 本 的 所 有 参 数 , 不 被 双 引 号 ” “ 包 含 时 , 都 以 1 2 2 … n 的形式输出所有参数
当它们被双引号” “包含时,” "" ∗ " 会 将 所 有 的 参 数 作 为 一 个 整 体 , 以 " 1 2 2 … n”的形式输出所有参数;” @"" @ " 会 将 各 个 参 数 分 开 , 以 " 1” “ 2"" 2 " … " n” 的形式输出所有参数


运算符?
格式 :expr m + n 或$((m+n)) 注意expr运算符间要有空格
例如计算(2 +3 )×4 的值
1 .分步计算

S=`expr 2 + 3` expr $S \* 4

2.一步完成计算

    expr `expr 2 + 3 ` \* 4
    echo `expr \`expr 2 + 3\` \* 4`
$(((2+3)*4))

案例:
[root@weijie aa]# echo $(((2+3)*4))
20


for循环?
第一种:

for N in 1 2 3
do
    echo $N
donefor N in 1 2 3; do echo $N; donefor N in {1..3}; do echo $N; done

第二种:

for ((i = 0; i <= 5; i++))
do
    echo "welcome $i times"
donefor ((i = 0; i <= 5; i++)); do echo "welcome $i times"; done

while循环?
第一种

while expression
do
command
…
done

第二种

i=1
while ((i<=3))
do
  echo $i
  let i++
done

解释:let 是让i++执行的指令,let详解请参考 博客


case语句?
格式

case $1 in
start)
    echo "starting"
    ;;
stop)
    echo "stoping"
    ;;
*)
    echo "Usage: {start|stop} “
esac

read命令?
read -p(提示语句)-n(字符个数) -t(等
使用示例:这里写图片描述


if判断?

\#!/bin/bash
read -p "please input your name:" NAME
if [ $NAME = root ]
        then
                echo "hello ${NAME},  welcome !"
        elif [ $NAME = itcast ]
                then
                        echo "hello ${NAME},  welcome !"
        else
                echo "SB, get out here !"
fi

判断语句?
[ condition ] (注意condition前后要有空格)
#非空返回true,可使用$?验证(0为true,>1为false)
[ itcast ]

#空返回false
[ ]

[ condition ] && echo OK || echo notok//注意注意注意:中括号与condition两边有一个空格。
条件满足,执行前面的语句,否则反之。
案例:[root@weijie aa]# [ ] && echo ok || echo notOk
notOk

解析:shell编译后的结果为notOk,因为[ ]中为空格返回的值为1(shell中1表示条件与假与C++、java等语言不同)


常用判断条件?

= 字符串比较
-lt 小于
-le 小于等于
-eq 等于
-gt 大于
-ge 大于等于
-ne 不等于
案例:

[root@weijie aa]# [ 2 -lt 3 ]
[root@weijie aa]# echo $?
0

-r 有读的权限
-w 有写的权限
-x 有执行的权限
-f 文件存在并且是一个常规的文件
-s 文件存在且不为空
-d 文件存在并是一个目录
-b文件存在并且是一个块设备
-L 文件存在并且是一个链接
案例:
[root@weijie aa]# [ -r shells.sh ]
[root@weijie aa]# echo $?
0


Shell自定义函数?
语法

 [ function ] funname [()]
{
    action;
    [return int;]
}

function start()  / function start / start()

注意
1.必须在调用函数地方之前,先声明函数,shell脚本是逐行运行。不会像其它语言一样先预编译
2.函数返回值,只能通过$? 系统变量获得,可以显示加:return 返回,如果不加,将以最后一条命令运行结果,作为返回值。 return后跟数值n(0-255)
案例:

#!/bin/bash
function fsum()
{
        echo $1,$2;
        return $(($1+$2));
}
total=$?;
echo "第一次调用后的返回结果:"$total;
fsum 5 4;
total=$?;
echo $total;

结果:
0(表示上一条指令执行成功,也就是花括号中的代码块执行成功)
5 4(给函数传递两个参数,$1:表示获取第一个参数)
9(返回计算结果)


脚本调试?

sh -vx helloWorld.sh

或者在脚本中增加set -x
案例:

[root@weijie aa]# sh -vx shells.sh 
#!/bin/bash
function fsum()
{
    echo $1,$2;
    return $(($1+$2));
}
total=$?;
+ total=0
echo "第一次调用后的返回结果:"$total;
+ echo $'\347\254\254\344\270\200\346\254\241\350\260\203\347\224\250\345\220\216\347\232\204\350\277\224\345\233\236\347\273\223\346\236\234:0'
第一次调用后的返回结果:0
fsum 5 4;
+ fsum 5 4
+ echo 5,4
5,4
+ return 9
total=$?;
+ total=9
echo $total;
+ echo 9
9

sed命令?
sed全称是:Stream EDitor即流编辑器,是一个很好的文本处理工具,本身是一个管道命令,处理时,把当前处理的行存储在临时缓冲区中,接着用sed命令处理缓冲区中的内容,处理完成后,把缓冲区的内容送往屏幕。接着处理下一行。它是以行为单位进行处理,可以将数据行进行替换、删除、新增、选取等特定工作。


sed选项?
-n :使用安静(silent)模式。在一般 sed 的用法中,所有来自 STDIN 的数据一般都会被列出到终端上。但如果加上 -n 参数后,则只有经过sed 特殊处理的那一行(或者动作)才会被列出来。
-e :直接在命令列模式上进行 sed 的动作编辑;
-i :直接修改读取的文件内容,而不是输出到终端。


sed function?
a :新增, a 的后面可以接字串,而这些字串会在新的一行出现(目前的下一行)
d :删除,因为是删除啊,所以 d 后面通常不接任何内容
i :插入, i 的后面可以接字串,而这些字串会在新的一行出现(目前的上一行)
p :列印,亦即将某个选择的数据印出。通常 p 会与参数 sed -n 一起运行
s :取代,可以直接进行取代的工作!通常这个 s 的动作可以搭配正规表示法!例如 1,20s/old/new/g


awk命令?
AWK是一种优良的文本处理工具。其名称得自于它的创始人 Alfred Aho 、Peter Weinberger 和 Brian Kernighan 姓氏的首个字母,AWK 提供了极其强大的功能:可以进行样式装入、流控制、数学运算符、进程控制语句甚至于内置的变量和函数。它具备了一个完整的语言所应具有的几乎所有精美特性。实际上 AWK 的确拥有自己的语言:AWK 程序设计语言, 三位创建者已将它正式定义为“样式扫描和处理语言”。它允许您创建简短的程序,这些程序读取输入文件、为数据排序、处理数据、对输入执行计算以及生成报表,还有无数其他的功能。


awk命令格式?

awk 'pattern1 {action1} pattern2 {action2} ...' filename
本书共分五部分,详细介绍了shell编程技巧,各种UNIX命令及语法,还涉及了UNIX下的文字处理以及少量的系统管理问题。本书内容全面、文字简洁流畅,适合Shell编程人员学习、参考。 目 录 译者序 前言 第一部分 shell 第1章 文件安全与权限 1 1.1 文件 1 1.2 文件类型 2 1.3 权限 2 1.4 改变权限位 4 1.4.1 符号模式 4 1.4.2 chmod命令举例 5 1.4.3 绝对模式 5 1.4.4 chmod命令的其他例子 6 1.4.5 可以选择使用符号模式或绝对模式 7 1.5 目录 7 1.6 suid/guid 7 1.6.1 为什么要使用suid/guid 8 1.6.2 设置suid/guid的例子 8 1.7 chown和chgrp 9 1.7.1 chown举例 9 1.7.2 chgrp举例 9 1.7.3 找出你所属于的用户组 9 1.7.4 找出其他用户所属于的组 10 1.8 umask 10 1.8.1 如何计算umask值 10 1.8.2 常用的umask值 11 1.9 符号链接 12 1.9.1 使用软链接来保存文件的多个映像 12 1.9.2 符号链接举例 12 1.10 小结 13 第2章 使用find和xargs 14 2.1 find命令选项 14 2.1.1 使用name选项 15 2.1.2 使用perm选项 16 2.1.3 忽略某个目录 16 2.1.4 使用user和nouser选项 16 2.1.5 使用group和nogroup选项 16 2.1.6 按照更改时间查找文件 17 2.1.7 查找比某个文件新或旧的文件 17 2.1.8 使用type选项 17 2.1.9 使用size选项 18 2.1.10 使用depth选项 18 2.1.11 使用mount选项 18 2.1.12 使用cpio选项 18 2.1.13 使用exec或ok来执行shell命令 19 2.1.14 find命令的例子 20 2.2 xargs 20 2.3 小结 21 第3章 后台执行命令 22 3.1 cron和crontab 22 3.1.1 crontab的域 22 3.1.2 crontab条目举例 23 3.1.3 crontab命令选项 23 3.1.4 创建一个新的crontab文件 24 3.1.5 列出crontab文件 24 3.1.6 编辑crontab文件 24 3.1.7 删除crontab文件 25 3.1.8 恢复丢失的crontab文件 25 3.2 at命令 25 3.2.1 使用at命令提交命令或脚本 26 3.2.2 列出所提交的作业 27 3.2.3 清除一个作业 27 3.3 &命令 27 3.3.1 向后台提交命令 28 3.3.2 用ps命令查看进程 28 3.3.3 杀死后台进程 28 3.4 nohup命令 29 3.4.1 使用nohup命令提交作业 29 3.4.2 一次提交几个作业 29 3.5 小结 30 第4章 文件名置换 31 4.1 使用* 31 4.2 使用? 32 4.3 使用[...]和[!...] 32 4.4 小结 33 第5章 shell输入与输出 34 5.1 echo 34 5.2 read 35 5.3 cat 37 5.4 管道 38 5.5 tee 39 5.6 标准输入、输出和错误 40 5.6.1 标准输入 40 5.6.2 标准输出 40 5.6.3 标准错误 40 5.7 文件重定向 40 5.7.1 重定向标准输出 41 5.7.2 重定向标准输入 42 5.7.3 重定向标准错误 42 5.8 结合使用标准输出和标准错误 43 5.9 合并标准输出和标准错误 43 5.10 exec 44 5.11 使用文件描述符 44 5.12 小结 45 ... ...
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值