学习shell的价值:
- Linux服务器的基本操作和管理
- 前端Node.js服务的进程管理、问题排查、资源监控等运维操作
- 使用shell编写TCE、SCM、Docker脚本,完成服务编译和部署
命令和语法
单行注释
每行中#之后的内容均是注释。
# 这是一行注释
echo 'Hello World' # 这也是注释
变量
- 定义变量
定义变量,不需要加$符号,例如:
name1='wzh' # 单引号定义字符串
name2="wzh" # 双引号定义字符串
name3=wzh # 也可以不加引号,同样表示字符串
- 使用变量
使用变量,需要加上{}符号。花括号是可选的,主要为了帮助解释器识别变量边界。
name=wzh
echo $name # 输出wzh
echo ${name} # 输出wzh
echo ${name}0102 # 输出wzh0102
- 只读变量
使用readonly或者declare可以将变量变为只读。
name=yxc
readonly name
declare -r name # 两种写法均可
name=abc # 会报错,因为此时name只读
- 删除变量
unset可以删除变量。
name=wzh
unset name
echo $name # 输出空行
数组
数组中可以存放多个不同类型的值,只支持一维数组,初始化时不需要指明数组大小。
数组下标从0开始。
定义
数组用小括号表示,元素之间用空格隔开。例如:
array=(1 abc "def" yxc)
也可以直接定义数组中某个元素的值:
array[0]=1
array[1]=abc
array[2]="def"
array[3]=yxc
- 读取数组中某个元素的值
格式:
${array[index]}
例如:
array=(1 abc "def" yxc)
echo ${array[0]}
echo ${array[1]}
echo ${array[2]}
echo ${array[3]}
- 读取整个数组
格式:
${array[@]} # 第一种写法
${array[*]} # 第二种写法
例如:
array=(1 abc "def" wzh)
echo ${array[@]} # 第一种写法
echo ${array[*]} # 第二种写法
数组长度
类似于字符串
${#array[@]} # 第一种写法
${#array[*]} # 第二种写法
例如:
array=(1 abc "def" yxc)
echo ${#array[@]} # 第一种写法
echo ${#array[*]} # 第二种写法
expr命令
expr命令用于求表达式的值,格式为:
expr 表达式
表达式说明:
- 用空格隔开每一项
- 用反斜杠放在shell特定的字符前面(发现表达式运行错误时,可以试试转义)
- 对包含空格和其他特殊字符的字符串要用引号括起来
- expr会在stdout中输出结果。如果为逻辑关系表达式,则结果为真时,stdout输出1,否则输出0。
- expr的exit code:如果为逻辑关系表达式,则结果为真时,exit code为0,否则为1。
read命令
read命令用于从标准输入中读取单行数据。当读到文件结束符时,exit code为1,否则为0。
参数说明
- -p: 后面可以接提示信息
- -t:后面跟秒数,定义输入字符的等待时间,超过等待时间后会自动忽略此命令
echo命令
- echo用于输出字符串。命令格式:
echo STRING
- 显示普通字符串
echo "Hello World"
echo Hello World # 引号可以省略
printf命令
printf命令用于格式化输出,类似于C/C++中的printf函数。
默认不会在字符串末尾添加换行符。
命令格式:
printf format-string [arguments...]