1.shell脚本
文件开头#!/bin/sh #!/bin/bash #! 是一个约定标记,告诉系统这个脚本需要什么解释器来执行,即使用哪一种 Shell
2.运行shell
- cd 到相应目录,然后 ./test.sh
- 注意:一定要写成 ./test.sh,而不是 test.sh,直接写 test.sh,linux 系统会去 PATH 里寻找叫 test.sh ,当前目录通常不在 PATH 里,所以写成 test.sh会找不到命令的,用 ./test.sh 告诉系统说,在当前目录找
3.shell注释
- 单行注释:以 # 开头
- 多行注释:用:<<! 语句1 语句2 !(其中!可以替换为其他符号)
4.shell变量
- 命名规则
- 英文字母、数字、下划线,不能有特殊字符、标点、空格等
- 且不能用数字开头;
- 不能使用bash里的关键字(用help命令即可查看保留关键字)
- 变量类型
- 全局变量(环境变量)
- 作用范围:
- 定义:
- 方法一:export variable_name=value
- 方法二:variable_name=value export variable_name
- 局部变量
- 作用范围:一般在脚本或命令中进行定义,只在当前的shell中有效,其他shell启动的程序该变量无效,不能访问
- 定义:variable_name=name
- 全局变量(环境变量)
- 使用变量
- 使用一个定义过的变量,只要在变量名前面加美元符号即可,如$name,${your_name}-----建议变量外加上花括号,避免一些麻烦
- 只有使用变量的时候需要加上$符号,赋值等不需要
- 只读变量
- readonly 变量名即可,之后修改改变量运行时会保存
- 删除变量
- unset 变量名
5.shell字符串
- 可使用单引号也可使用双引号
- 单引号
- 单引号中所有的字符都会原样的输出,单引号字符串中的变量是无效的
- 单引号中无能再出现单个引号了,对单引号转义也无效,必须成对出现
- 双引号
- 双引号里可以有变量
- 双引号里可以出现转义字符
- 举例子
- 单引号
#!/bin/bash
name="Lucy"
greeting_1='hello,${name}!' # hello,${name}!
greeting_2='hello,'$name'!' #hello,Lucy!
greeting_3='hello,'${name}'!' #hello,Lucy!
greeting_4="hello,${name}!" #hello,Lucy!
greeting_5="hello,"$name"!" #hello,Lucy!
greeting_6="hello,"${name}"!" #hello,Lucy!
greeting_7="hello,"$name"!" #hello,"Lucy"!
echo $greeting_1 $greeting_2 $greeting_3 $greeting_4 $greeting_5 $greeting_6 $greeting_7
- 获取字符串长度
string="John Wilson" echo ${#string} #输出 11(空格也算)
- 提取字符串:第一个字符的索引值为 0
string="John Wilson" echo ${string:0:7} #输出John Wi
- 查找字符串
string="John Wilson"
echo `expr index "$string" oJ` #结果为1,意为查找字符 “o 或 J” 的位置
6.shell数组
- 仅支持一维数组,不支持多维数组;下标从0开始,获取数组中的元素要利用下标,下标可以是整数或算术表达式,其值应大于或等于 0
- 定义
- 数组名=(值1 值2 … 值n)
- 赋值
array_name=(value0 value1 value2 value3)
array_name[1]=1111
array_name[n]=valuenuuuu
array_name[q]=valuenmmm
echo ${array_name[0]} ${array_name[1]} ${array_name[2]} ${array_name[3]} ${array_name[n]} ${array_name[q]}
echo ${array_name[@]}
echo ${#array_name[@]} ${#array_name[*]}
结果如下:
#输出:valuenmmm 1111 value2 value3 valuenmmm valuenmmm
#输出:valuenmmm 1111 value2 value3
#输出:4 4
- 读取数组
- 获取单个元素:${数组名[下标]}
- 获取数组所有元素:echo ${数组名[@]}
- 获取数组长度
- 获取数组长度(元素个数)${#数组名[@]} ${#数组名[*]}
- 获取数组单个元素长度${#array_name[n]}