Shell脚本入门(笔记)1

简介: Shell脚本入门(笔记)

0、Shell中的特殊符号

1.$

美元符号,用来表示变量的值。

如变量NAME的值为Mike,则使用$NAME就可以得到“Mike”这个值。

2.#

井号,除了做为超级用户的提示符之外,还可以在脚本中做为注释的开头字母,每一行语句中,从#号开始的部分就不执行了。

3.“”

双引号,shell不会将一对双引号之间的文本中的大多数特殊字符进行解释。

如#不再是注释的开头,它只表示一个井号“#”。但$仍然保持特殊含义。

双引号对于某些特殊符号是不起作用的, 例如:”,$,\,`(反引号)

双引号和单引号不能嵌套。即:echo ‘””’ 输出””, echo “’’” 输出’’

4.‘’

单引号,shell不会将一对单引号之间的任何字符做特殊解释。

5.``

倒引号,命令替换。在倒引号内部的shell命令首先被执行,其结果输出代替用倒引号括起来的文本,不过特殊字符会被shell解释。

6.\

斜杠,用来去掉在shell解释中字符的特殊含义。在文本中,跟在\后面的一个字符不会被shell特殊解释,但其余的不受影响。

7.{}

大括号,主要是和$符号配合,作为字符串连接来使用

echo ${HOME}ismydir
/home/qzkismydir

1、shell中的表达式

1.shell 输出/输入重定向

1698845607324.jpg

输出 >

将右尖括号前的命令的输入重定向到尖括号后的文件中。

ls *.sh > list.txt

将当前目录下所有末尾名为sh的文件的列表写入到list.txt

如果要将新内容添加在文件末尾,请使用>>操作符。

输入 <

将左箭头后面的文件作为左箭头前的命令的输入。

grep “a” < test.sh

将test.sh中找到所有包含a的行

command < infile > outfile
同时替换输入和输出,执行command,从文件infile读取内容,然后将输出写入到outfile中。

错误输出重定向

默认bash有3个标准输入输出设备。

  • 0 标准输入
  • 1 标准输出
  • 2 错误输出

如果执行脚本的时候发生错误,会输出到2上。

要想就将错误的输出也输出在标准输出上,需要重定向。

./test.sh > a.log 2>&1

后面2>&1就是将标准错误的输出重定向到标准输出上。

3.tee

将此命令的输入分叉,一支输出到屏幕一支可以重定向到其他位置。

./test.sh | tee >a.txt 2>&1

运行test.sh,通过tee输出到a.txt,同时屏幕上可以看到输出。并且将错误输出重定向到标准输出( 2>&1 )

3.exec

将此命令后的参数作为命令在当前的shell中执行,当前的shell或者脚本不在执行。

2、脚本格式

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

3、Shell中的变量

1.常用系统变量

$HOME、$PWD、$SHELL、$USER等

echo $USER
xinghe

2.自定义变量

1、基本语法

(1)定义变量:变量=值

(2)撤销变量:unset 变量

(3)声明静态变量:readonly 变量,注意:不能 unset

2、变量定义规则

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

(2)等号两侧不能有空格

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

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

(1)定义变量 A
$ A=5
$ echo $A 
5
(2)给变量 A 重新赋值 
$ A=8
$ echo $A 
8
(3)撤销变量 A
unset A 
$ echo $A
(4)声明静态的变量 B=2,不能 unset
$ readonly B=2 
$ echo $B
2
$ B=9 
-bash: B: readonly variable
(5)在 bash 中,变量默认类型都是字符串类型,无法直接进行数值运算      
$ C=1+2 
$ echo $C 
1+2
(6)变量的值如果有空格,需要使用双引号或单引号括起来
$ D=hello world
-bash: world: command not found
$ D="hello world"
$ echo $D 
hello world
(7)可把变量提升为全局环境变量,可供其他 Shell 程序使用 export 变量名。

3.特殊变量:$n、$#、$*、$@、$?

$n (功能描述:n 为数字,$0 代表该脚本名称,$1-$9 代表第一到第九个参数,十以上的参数需要用大括号包含,如${10})

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

$* (功能描述:这个变量代表命令行中所有的参数,$*把所有的参数看成一个整体(一个字符串))

$@ (功能描述:这个变量也代表命令行中所有的参数,不过$@把每个参数区分对待)

$? (功能描述:最后一次执行的命令的返回状态。如果这个变量的值为0,证明上一个命令正确执行;如果这个变量的值为非0(具体是哪个数,由命令自己来决定),则证明上一个命令执行不正确了。)


1698845625545.jpg

4、Shell 数组

数组中可以存放多个值。Bash Shell 只支持一维数组(不支持多维数组),初始化时不需要定义数组大小,数组元素的下标由 0 开始。

Shell 数组用括号来表示,元素用"空格"符号分割开,语法格式如下:

array_name=(value1 value2 ... valuen)

也可以使用下标来定义数组:

array_name[0]=value0 array_name[1]=value1 array_name[2]=value2

读取数组

读取数组元素值的一般格式是:

${array_name[index]}

获取数组中的所有元素

使用@ 或 * 可以获取数组中的所有元素

${array_name[*]} 
${array_name[@]}

获取数组的长度

获取数组长度的方法与获取字符串长度的方法相同,例如:

#!/bin/bash 
my_array[0]=A 
my_array[1]=B 
my_array[2]=C 
my_array[3]=D  
echo "数组元素个数为: ${#my_array[*]}" 
echo "数组元素个数为: ${#my_array[@]}"

执行脚本,输出结果如下所示:

$ chmod +x test.sh  
$ ./test.sh 
数组元素个数为: 4 
数组元素个数为: 4

5、运算符

1.基本语法

(1)expr + , - , * , / , % 加,减,乘,除,取余

(2)“$((运算式))”或“$[运算式]”

注意:expr 运算符间要有空格

(1)计算 3+2 的值
expr 2 + 3 
5
(2)计算(2+3)X4 的值
(a)expr 一步完成计算
expr `expr 2 + 3` \* 4
20      
(b)采用$[运算式]方式 
res=$((2+3))
res=$[((2+3)*4)]

6、条件判断

1.基本语法

[ condition ](注意 condition 前后要有空格)

注意:条件非空即为 true,[ qiuzhi ]返回 true,[] 返回 false。

2.常用判断条件

(1)两个整数之间比较

= 字符串比较

-lt 小于(less than)
-le 小于等于(less equal) 
-gt 大于(greater than)
-ne 不等于(Not equal)
-eq 等于(equal)
-ge 大于等于(greater equal)

(2)按照文件权限进行判断

-r 有读的权限(read)
-x 有执行的权限(execute)
-w 有写的权限(write)

(3)按照文件类型进行判断

-f 文件存在并且是一个常规的文件(file)
-e 文件存在(existence) 
-d 文件存在并是一个目录(directory)
(1)23 是否大于等于 22 
[ 23 -ge 22 ]
echo $?
0
(2)helloworld.sh 是否具有写权限
[ -w helloworld.sh ] 
echo $?
0
(3)/home/atguigu/cls.txt 目录中的文件是否存在 
[ -e /home/qiuzhi/cls.txt ]
echo $?
1
(4)多条件判断(&& 表示前一条命令执行成功时,才执行后一条命令,|| 表示上一条命令执行失 败后,才执行下一条命令)
[ -w helloworld.sh ] && echo OK || echo notok
OK
[ -w helloworld1.sh ] && [ ] || echo notok 
notok

7、流程控制

1.if 判断

1、基本语法

if [条件判断式] 
then
  程序 
fi
或者
if [条件判断式]
then 
    程序
elif [ 条件判断式 ] 
then 
    程序
else 
    程序
fi

注意事项:

(1)[ 条件判断式 ],中括号和条件判断式之间必须有空格

(2)if 后要有空格

2.case 语句

1、基本语法

case $变量名 in
"值 1")
    如果变量的值等于值 1,则执行程序 1 
;;
"值 2")
    如果变量的值等于值 2,则执行程序 2 
;;
...省略其他分支... 
*)
    如果变量的值都不是以上的值,则执行此程序
;; 
esac

注意事项:

  1. case 行尾必须为单词“in”,每一个模式匹配必须以右括号“)”结束。
  2. 双分号“;;”表示命令序列结束,相当于 java 中的 break。
  3. 最后的“*)”表示默认模式,相当于 java 中的 default,*不可以加双引号。

3.for 循环

1、基本语法 1

for ((初始值;循环控制条件;变量变化))
do 
    程序
done

2、基本语法 2

for 变量 in 值 1 值 2 值 3...
do 
    程序
done

比较$*和$@区别

(a)$*和$@都表示传递给函数或脚本的所有参数,不被双引号“”包含时,都以$1 $2 …$n 的形式输出所有参数。

(b)当它们被双引号“”包含时,“$*”会将所有的参数作为一个整体,以“$1 $2 …$n”的形式输出所有参数;“$@”会将各个参数分开,以“$1” “$2”…”$n” 的形式输出所有参数。

4.while 循环

1、基本语法

while [ 条件判断式 ] 
do
    程序 
done

注意事项:

while 后面需要有空格

8、read 读取控制台输入

1.基本语法

read(选项)(参数)

选项:

  • -p:指定读取值时的提示符;
  • -t:指定读取值时等待的时间(秒)。

参数

  • 变量:指定读取值的变量名




相关文章
|
5月前
|
存储 安全 Unix
七、Linux Shell 与脚本基础
别再一遍遍地敲重复的命令了,把它们写进Shell脚本,就能一键搞定。脚本本质上就是个存着一堆命令的文本文件,但要让它“活”起来,有几个关键点:文件开头最好用#!/usr/bin/env bash来指定解释器,并用chmod +x给它执行权限。执行时也有讲究:./script.sh是在一个新“房间”(子Shell)里跑,不影响你;而source script.sh是在当前“房间”里跑,适合用来加载环境变量和配置文件。
522 9
|
5月前
|
存储 Shell Linux
八、Linux Shell 脚本:变量与字符串
Shell脚本里的变量就像一个个贴着标签的“箱子”。装东西(赋值)时,=两边千万不能有空格。用单引号''装进去的东西会原封不动,用双引号""则会让里面的$变量先“变身”再装箱。默认箱子只能在当前“房间”(Shell进程)用,想让隔壁房间(子进程)也能看到,就得给箱子盖个export的“出口”戳。此外,Shell还自带了$?(上条命令的成绩单)和$1(别人递进来的第一个包裹)等许多特殊箱子,非常有用。
503 2
|
8月前
|
Shell
Shell脚本循环控制:shift、continue、break、exit指令
使用这些命令可以让你的Shell脚本像有生命一样动起来。正确使用它们,你的脚本就能像一场精心编排的舞蹈剧目,既有旋律的起伏,也有节奏的跳跃,最终以一场惊艳的表演结束。每一个动作、每一个转折点,都准确、优雅地完成所需要表达的逻辑。如此,你的脚本不只是冰冷的代码,它透过终端的界面,跳着有节奏的舞蹈,走进观众——使用者的心中。
315 60
|
11月前
|
关系型数据库 MySQL Shell
MySQL 备份 Shell 脚本:支持远程同步与阿里云 OSS 备份
一款自动化 MySQL 备份 Shell 脚本,支持本地存储、远程服务器同步(SSH+rsync)、阿里云 OSS 备份,并自动清理过期备份。适用于数据库管理员和开发者,帮助确保数据安全。
|
5月前
|
数据采集 监控 Shell
无需Python:Shell脚本如何成为你的自动化爬虫引擎?
Shell脚本利用curl/wget发起请求,结合文本处理工具构建轻量级爬虫,支持并行加速、定时任务、增量抓取及分布式部署。通过随机UA、异常重试等优化提升稳定性,适用于日志监控、价格追踪等场景。相比Python,具备启动快、资源占用低的优势,适合嵌入式或老旧服务器环境,复杂任务可结合Python实现混合编程。
|
7月前
|
Web App开发 缓存 安全
Linux一键清理系统垃圾:释放30GB空间的Shell脚本实战​
这篇博客介绍了一个实用的Linux系统盘清理脚本,主要功能包括: 安全权限检查和旧内核清理,保留当前使用内核 7天以上日志文件清理和系统日志压缩 浏览器缓存(Chrome/Firefox)、APT缓存、临时文件清理 智能清理Snap旧版本和Docker无用数据 提供磁盘空间使用前后对比和大文件查找功能 脚本采用交互式设计确保安全性,适合定期维护开发环境、服务器和个人电脑。文章详细解析了脚本的关键功能代码,并给出了使用建议。完整脚本已开源,用户可根据需求自定义调整清理策略。
866 1
|
9月前
|
存储 Unix Shell
确定Shell脚本在操作系统中的具体位置方法。
这对于掌握Linux的文件系统组织结构和路径方面的理解很有帮助,是我们日常工作和学习中都可能使用到的知识。以上讲解详细清晰,应用简便,是每一个想要精通操作系统的计算机爱好者必备的实用技能。
276 17
|
Shell
一个用于添加/删除定时任务的shell脚本
一个用于添加/删除定时任务的shell脚本
344 1
|
10月前
|
Linux Shell
在Linux、CentOS7中设置shell脚本开机自启动服务
以上就是在CentOS 7中设置shell脚本开机自启动服务的全部步骤。希望这个指南能帮助你更好地管理你的Linux系统。
947 25
|
9月前
|
Linux Shell
Centos或Linux编写一键式Shell脚本删除用户、组指导手册
Centos或Linux编写一键式Shell脚本删除用户、组指导手册
264 4