Shell脚本编写

本文详细介绍了Shell脚本的基础知识,包括脚本格式、Hello World案例、多命令处理、变量使用、运算符、条件判断、流程控制、读取控制台输入、函数以及一些常用的Shell工具如cut、sed和awk的使用。通过实例展示了如何在Shell环境中进行文件操作、条件判断和循环控制,是学习Shell脚本的良好起点。

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

1 入门

1.1 脚本格式

脚本以#!/bin/bash开头(指定bash解析器)

1.2 helloworld案例

# 创建脚本helloworld.sh:调用时打印hello world
[azula@localhost datas]$ cat helloworld.sh 
#!/bin/bash
echo "hello world"

# 执行脚本方式1
[azula@localhost datas]$ bash helloworld.sh 
hello world

# 执行脚本方式2
[azula@localhost datas]$ ./helloworld.sh
-bash: ./helloworld.sh: 权限不够
  • 方式1:本质是bash解析器帮你执行脚本,所以脚本本身不需要执行权限;
  • 方式2:本质是脚本自己需要执行,所以需要执行权限

1.3 多命令处理

  • 在azula目录下创建一个biaobai.txt并在文件中写入"I IOVE YOU"字符
#!/bin/bash
cd /home/azula/
touch biaobai.txt
echo "I LOVE YOU" >> biaobai.txt

2 Shell中的变量

2.1 常用系统变量

$HOME $PWD $SHELL $USER

# $HOME:当前用户的HOME
[azula@localhost datas]$ echo $HOME
/home/azula
# $PWD:当前路径
[azula@localhost datas]$ echo $PWD
/home/azula/datas
# $SHELL:bash位置
[azula@localhost datas]$ echo $SHELL
/bin/bash
# $USER:当前用户
[azula@localhost datas]$ echo $USER
azula

2.2 自定义变量

基本语法

  1. 定义变量:变量=值 等号两边不能留有空格
  2. 撤销变量:unset 变量
  3. 输出变量:echo $变量
  4. 声明静态变量: readonly 变量,注意:不能unset
[azula@localhost datas]$ A=1
[azula@localhost datas]$ echo $A
1
[azula@localhost datas]$ unset A

变量定义规则

  1. 变量名称可以由字母,数字和下划线组成,不能以数字开头,环境变量名建议大写

  2. 等号两侧不能有空格

  3. 在bash中,变量默认类型都是字符串类型,无法直接进行数值运算

  4. 变量的值如果有空格,需要使用双引号或单引号括起来

    [azula@localhost datas]$ str="A B C"
    [azula@localhost datas]$ echo $str
    A B C
    
  5. 可把变量提升为全局变量,可供其他shell程序使用
    export 变量

特殊变量

$n

  • n为数字,$0代表脚本名称,10以内参数用 $1-9 表示,10 以上的需要用大括号包含,例:{10}
#!/bin/bash
echo "$0 $1 $2 $3"

$#

功能描述:获取所有输入参数个数,常用于循环

#!/bin/bash
echo "$0 $1 $2 $3"
echo $#

$* 和$@

  • $* :代表命令行中所有的参数,把所有参数看成一个整体
  • $@ :也代表命令行中所有的参数,不过把每个参数区分对待
[azula@localhost datas]$ bash parameter.sh test1 test2
parameter.sh test1 test2 
2
test1 test2
test1 test2

$?

  • $?:最后一次执行命令的状态
  • 0:正确执行

3 运算符

  1. $((运算式)) 或 $[运算式]
  2. expr +,-,\*,/,% <=> 加减乘除取余
    expr与运算符间要有空格
# 计算2+3
[azula@localhost datas]$ expr 2 + 3
5

# 计算(2+3)*4
## 方式1
[azula@localhost datas]$ expr `expr 2 + 3` \* 4
20

## 方式2
[azula@localhost datas]$ s=$[(2+3)*4]
[azula@localhost datas]$ echo $s
20

4 条件判断

基本语法:[condition] (注意 condition前后要有空格)

4.1 常用判断条件

两个整数之间比较

符号描述
-lt(less than)小于
-le(less equal) 小于等于
-eq(equal)等于
-gt(greater than) 大于
-ge(greater equal) 大于等于
-ne(not equal) 不等于

文件权限判断

  • -r 有读的权限
  • -w 有写的权限
  • -x 有执行的权限

文件类型判断

  • -f 文件存在并且是一个常规文件
  • -e 文件存在
  • -d 文件存在病是一个目录
# 判断23是否大于2
[azula@localhost datas]$ [ 23 -gt 2 ]
[azula@localhost datas]$ echo $?
0

# 判断helloworld.sh是否有写入权限
[azula@localhost datas]$ [ -w hellowrld.sh ]
[azula@localhost datas]$ echo $?
1

# 判断目录中文件是否存在
[azula@localhost datas]$ [ -e /home/azula/datas ]
[azula@localhost datas]$ echo $?
0

多条件判断

&& ||

5 流程控制

5.1 IF判断

[azula@localhost datas]$ cat if.sh
#!/bin/bash
if [ $1 -eq 1 ]
then
	echo "awesome"
elif [ $1 -eq 2 ]
then
	echo "owwwwww"
fi
[azula@localhost datas]$ bash if.sh 2
owwwwww

5.2 case 语句

[azula@localhost datas]$ cat case.sh
#!/bin/bash
case $1 in
1)
	echo "firenation"
;;
2)
	echo "watertribe"
;;
3)
	echo "earthnation"
;;
esac
[azula@localhost datas]$ bash case.sh 2
watertribe

5.3 for循环

语法1

[azula@localhost datas]$ cat for.sh
#!/bin/bash
s=0
for((i=1;i<=100;i++))
do
	s=$[$s+$i]	
done
echo $s
[azula@localhost datas]$ bash for.sh
5050

语法2

[azula@localhost datas]$ cat for2.sh
#!/bin/bash
for i in $*
do
	echo $i
done
[azula@localhost datas]$ bash for2.sh 1 2
1
2

5.4 WHILE循环

[azula@localhost datas]$ cat while.sh
#!/bin/bash
s=0
i=1
while [ $i -le 100 ]
do
	s=$[$s + $i]
	i=$[$i + 1]
done
echo $s

[azula@localhost datas]$ bash while.sh
5050

6 read读取控制台输入

read (选项) (参数)

  • -p 指定读取值时的提示符
  • -t 指定读取值时等待的时间(秒)
# 提示7秒内,读取控制台输入的名称
[azula@localhost datas]$ cat read.sh
#!/bin/bash
read -t 7 -p "在7s内请输入你的名字" NAME
echo $NAME
[azula@localhost datas]$ bash read.sh
在7s

7 函数

7.1 系统函数

basename:会删掉所有的前缀包括最后一个‘/’字符,然后将字符串显示出来

# 方式1
[azula@localhost datas]$ basename /home/azula/a.txt
a.txt

# 方式2
[azula@localhost datas]$ basename /home/azula/a.txt .txt
a

dirname:文件绝对路径 (描述:从给定的包含绝对路径的文件名中去除文件名(非目录的部分),然后返回剩下的路径(目录的部分))

[azula@localhost datas]$ dirname /home/azula/banzhang.txt
/home/azula

自定义函数

# 格式
[ function ] funname[()]
{
	Action:
	[return int;]
}
funname
# DESC 计算输入两个参数的值
[azula@localhost datas]$ cat sum.sh
#!/bin/bash
function sum(){
	s=0;
	s=$[$1 + $2]
	echo $s
}
read -p "input your param1:" P1
read -p "input your param2:" P2
sum $P1 $P2
[azula@localhost datas]$ bash sum.sh
input your param1:1
input your param2:2
3

8 shell工具

8.1 cut

cut命令从文件的每一行剪切字节,字符和字段并将这些字节,字符和字段输出
cut [选项参数] filename

  • -f 列号,提取第几列
  • -d 分隔符,按照指定分隔符分隔列
# DESC 切割cut.txt第一列
[azula@localhost datas]$ cat cut.txt
dong shen
guan zhen
wo wo
lai lai
le le
[azula@localhost datas]$ cut -d " " -f 1 cut.txt
dong
guan
wo
lai
le

# DESC 获取第三行第一个单词
[azula@localhost datas]$ cat cut.txt | grep guan | cut -d " " -f 1
guan

8.2 sed

sed是一种流编辑器,它一次处理一行内容,处理时,把当前处理的行存储在临时缓冲区中,成为“模式空间”,接着sed命令处理缓冲区中的内容,处理完成后,把缓冲区的内容送往屏幕,接着处理下一行,这样不断重复,知道文件末尾,文件内容并没有改变,除非你使用重定向存储输出

sed [选项参数] 'command' filename

  • -e 直接在指令列模式上进行sed的动作编辑

命令功能描述

  • a 新增
  • d 删除
  • s 查找并替换
# DESC 在第二行后增加mei nv字符
[azula@localhost datas]$ sed -e "2a mei nv" sed.txt
dong zhen
guan zhen
mei nv
wo wo
lai lai

8.3 awk

awk 一个强大文件分析工具,把文件逐行的读入,以空格为默认分隔符将每行切片,切开的部分再进行分析处理

awk [选项参数] 'pattern1 {action1} pattern2{action2}...' filename

  • -F 指定输入文件分隔符
  • -v 赋值一个用户定义变量

8.4 sort

sort:将文件进行排序,并将排序结果标准输出

sort [选项] (参数)

参数描述
-n依照数值大小排序
-t以相反的顺序排序
-t设置排序时使用的分隔字符
-k指定需要排序的列
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值