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

参数

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




相关文章
|
4天前
|
监控 Unix Shell
shell脚本编程学习
shell脚本编程
22 12
|
7天前
|
Shell
shell脚本变量 $name ${name}啥区别
shell脚本变量 $name ${name}啥区别
|
10天前
|
人工智能 监控 Shell
常用的 55 个 Linux Shell 脚本(包括基础案例、文件操作、实用工具、图形化、sed、gawk)
这篇文章提供了55个常用的Linux Shell脚本实例,涵盖基础案例、文件操作、实用工具、图形化界面及sed、gawk的使用。
26 2
|
1月前
|
Shell
Shell脚本有哪些基本语法?
【9月更文挑战第4天】
43 17
|
1月前
|
存储 Unix Shell
shell脚本编程基础
【9月更文挑战第4天】
36 12
|
29天前
|
网络协议 关系型数据库 MySQL
Shell 脚本案例
Shell 脚本案例
36 8
|
1月前
|
Shell Linux 开发工具
linux shell 脚本调试技巧
【9月更文挑战第3天】在Linux中调试shell脚本可采用多种技巧:使用`-x`选项显示每行命令及变量扩展情况;通过`read`或`trap`设置断点;利用`echo`检查变量值,`set`显示所有变量;检查退出状态码 `$?` 进行错误处理;使用`bashdb`等调试工具实现更复杂调试功能。
|
2月前
|
分布式计算 资源调度 Hadoop
Hadoop入门基础(五):Hadoop 常用 Shell 命令一网打尽,提升你的大数据技能!
Hadoop入门基础(五):Hadoop 常用 Shell 命令一网打尽,提升你的大数据技能!
|
2月前
|
Java Shell Linux
【Linux入门技巧】新员工必看:用Shell脚本轻松解析应用服务日志
关于如何使用Shell脚本来解析Linux系统中的应用服务日志,提供了脚本实现的详细步骤和技巧,以及一些Shell编程的技能扩展。
31 0
【Linux入门技巧】新员工必看:用Shell脚本轻松解析应用服务日志
|
1月前
|
存储 Ubuntu Shell
shell 用法入门
本文档详细介绍了Shell脚本的基础知识,包括基本写法、变量定义与使用、命令置换、环境变量、数组操作、算术运算、输入输出处理、控制语句及循环结构等内容。文档还提供了丰富的示例代码,帮助读者更好地理解和掌握Shell编程技巧。此外,还介绍了如何使用`if`语句进行条件判断、`case`语句进行模式匹配以及`while`、`for`循环等控制结构。最后,文档还涵盖了函数定义与调用的方法。适合初学者和有一定基础的开发者参考学习。