Shell脚本和编程 | 青训营笔记

77 阅读2分钟

学习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...]