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:指定读取值时等待的时间(秒)。

参数

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




相关文章
|
3天前
|
分布式计算 Hadoop Shell
使用shell脚本实现自动SSH互信功能
使用shell脚本实现自动SSH互信功能
10 1
|
3天前
|
Unix Shell Linux
轻松编写 AIX Shell 脚本
轻松编写 AIX Shell 脚本
11 1
|
4天前
|
监控 关系型数据库 Shell
Shell脚本入门:从基础到实践,轻松掌握Shell编程
Shell脚本入门:从基础到实践,轻松掌握Shell编程
|
4天前
|
关系型数据库 MySQL Shell
在Centos7中利用Shell脚本:实现MySQL的数据备份
在Centos7中利用Shell脚本:实现MySQL的数据备份
|
6天前
|
Shell Linux 编译器
C语言,Linux,静态库编写方法,makefile与shell脚本的关系。
总结:C语言在Linux上编写静态库时,通常会使用Makefile来管理编译和链接过程,以及Shell脚本来自动化构建任务。Makefile包含了编译规则和链接信息,而Shell脚本可以调用Makefile以及其他构建工具来构建项目。这种组合可以大大简化编译和构建过程,使代码更易于维护和分发。
24 5
|
6天前
|
Shell 程序员 数据安全/隐私保护
shell 脚本 if-else判断 和流程控制 (基本语法|基础命令)
shell 脚本 if-else判断 和流程控制 (基本语法|基础命令)
|
6天前
|
存储 Shell C语言
shell脚本 编程 变量 基本入门(详解)
shell脚本 编程 变量 基本入门(详解)
|
7天前
|
Shell Linux 编译器
C语言,Linux,静态库编写方法,makefile与shell脚本的关系。
总结:C语言在Linux上编写静态库时,通常会使用Makefile来管理编译和链接过程,以及Shell脚本来自动化构建任务。Makefile包含了编译规则和链接信息,而Shell脚本可以调用Makefile以及其他构建工具来构建项目。这种组合可以大大简化编译和构建过程,使代码更易于维护和分发。
15 3
|
12天前
|
弹性计算 运维 监控
|
13天前
|
存储 弹性计算 运维
自动化收集员工信息的Shell脚本
【4月更文挑战第30天】
11 0