sh脚本学习
Last updated on a day ago
什么是 sh 脚本
sh 脚本就是 Shell,简单来说可以自动进行命令行的操作
环境配置
只需要有文本编辑器和解释器就可以了,linux 常见的有
Bourne Shell(/usr/bin/sh 或/bin/sh)
Bourne Again Shell(/bin/bash)
C Shell(/usr/bin/csh)
K Shell(/usr/bin/ksh)
Shell for Root(/sbin/sh
这里讲的是 Bash
helloworld
1 | |
#!标记会告诉系统使用什么解释器来执行#表示注释,后面的内容都会被解释器忽略echo "hello world"表示输出文本
执行脚本
首先需要让文件有被执行的权限,在命令行输入以下命令
1 | |
然后就可以执行脚本了
1 | |
如果想指定解释器,还可以将脚本作为解释器参数
1 | |
这种写法会忽略第一行的解释器指定
变量
声明变量
shell 声明变量类似 python,直接变量名+赋值就好了
1 | |
注意,等号前后不能有空格,等号两侧出现空格可能会导致错误
使用变量
在使用变量时,只需在变量名前加$就可以了
1 | |
如上,其中{}花括号用于帮助解释器识别变量的边界,比如下面这种写法
1 | |
$hellohello会被认为是使用了一个名为hellohello的变量(其值为空),${hello}hello则会打印出“worldhello”
只读变量
可以使用readonly命令将变量定义为只读,其值不能被改变
使用时慎重,这个操作不可逆
1 | |
也可以在声明的时候定义
1 | |
删除变量
使用unset命令可以删除变量,但不能删除只读变量
1 | |
变量类型
和其他语言一样,shell 也有变量类型
- 字符串类型
默认情况下,变量通常被视为字符串,比如
1 | |
上面的代码虽然看着是赋值了一个整形,但其实是会作为字符串解释的,所以 b 的值是“1+1”
也可以使用单引号或双引号定义字符串
- 整数
可以使用declare或typeset(在 bash 中typeset是declare的别名,用法一致)命令来定义整数变量,但这是不一定的,有些 shell 并不是用这两个命令,所以开头指定解释器很重要
1 | |
- 数组
数组可以分为索引数组和关联数组,其实两者的区别只是键值对的区别而已,索引数组使用下标作为键,关联数组使用字符串作为键
1 | |
想要调用数组需要用{}将变量名+索引括起来
1 | |
还可以使用!和*,获取索引或所有值
1 | |
- 环境变量
环境变量由用户或系统设置的特殊变量,比如PATH
1 | |
可以使用 export 查看环境变量,会有类似下面的返回值
1 | |
-x表示变量为环境变量
1 | |
- 特殊变量
有一些特殊变量在 Shell 具有特殊含义,例如$0表示脚本的名称,$1,$2, 等表示脚本的参数。
$#表示传递给脚本的参数数量,$?表示上一个命令的退出状态等。
Shell 字符串
单双引号区别
单引号和双引号都可以用来表示字符串(甚至可以不用引号),但两者还是有些区别
- 单引号
- 无视变量,所有内容都会原样输出
- 单引号字符串中不能出现单独一个单引号(用转义符也不行),但可以成对出现,作为
1 | |
- 双引号
- 双引号内可以有变量
- 双引号内可以有转义字符
1 | |
字符串长度
1 | |
#用于获取元素的长度,可以指定索引。对于字符串而言str就是str[0],可以`$