Hello World!

#! /bin/bash
echo "Hello World!"

第一行是注释,声明用bash作为此脚本的解释器。注释分为两种:

# 单行注释

:<<EOF
多行
注释
EOF

# 其中EOF可以替换为任意字符串

第二行的echo用于在控制台上输出内容并自动换行。准确的说,echo会输出传递给它的所有参数,以空格分隔。 "Hello World!" 是字符串,后面会详细介绍。

保存后可以使用bash filename.sh运行,或者:

chmod +x filename.sh # 赋予可执行权限
./hw.sh # 作为可执行文件执行

变量

  1. 定义可变变量
v1=123
v2=123.4
v3=fifcom
v4="fifcom"
v5='fifcom'
declare v6=fifcom
# 变量默认为字符串,在使用时会根据需求自动转换类型
# 注意:定义变量时等号的左右两边不可以有空格
# 否则可能被解析器作为系统命令来执行
  1. 定义只读变量
readonly v1="immut" # 定义只读变量
v2="mut"
readonly v2 # 转换为只读变量
declare -r v3="immut" # 定义只读变量
  1. 使用变量

使用变量需要加上$${}符号。 ${} 可以帮助解释器识别变量名

v1=fifcom
echo $v1 # 输出fifcom
echo ${v1} # 输出fifcom
echo ${v1}v1 # 输出fifcomv1
  1. 删除变量

unset删除变量。只读变量不可删除

v1=fifcom
unset v1
echo $v1 # 输出为空
  1. 自定义变量与环境变量

自定义变量可以理解为局部变量,子进程不能访问自定义变量。

环境变量可以理解为全局变量,子进程可以访问环境变量。

子进程:可简单理解为当前shell创建的进程。

# 自定义变量->环境变量
v1=fifcom

export v1
# 或
declare -x v1

# 此时就可以在子进程里使用v1了
# 示例:

# bash
# echo $v1 # 输出fifcom
# exit
# 环境变量->自定义变量
export v1=fifcom #定义环境变量
declare +x v1

# 此时子进程无法使用v1
# 示例:

# bash
# echo $v1 # 输出空行
# exit

字符串

字符串可以用单引号、双引号括起来,也可以不用引号

# 定义字符串
v1=fifcom
v2="fifcom"
v3='fifcom'

单引号与双引号的区别:

  • 单引号中的内容会原样输出,不可执行,不能取变量,不支持转义
  • 双引号中的内容可以执行,可以取变量,可以转义
  • 双引号比单引号慢
entity=World
echo 'Hello $entity !' # 输出Hello $entity !
echo "Hello $entity !" # 输出Hello World !

可以在变量名之前加上#来获取字符串长度

entity=World
echo ${#entity} # 输出5

支持获取子串:

entity=ImaginaryWorld
echo ${entity:9:5} # 截取从下标为9开始的5个字符,输出World

默认变量

可以向shell脚本传递参数,比如向filename.sh传递三个参数:

./filename.sh param1 param2 param3

在shell脚本中可以通过$i(i是第i个参数,如第二个参数param2$2)来读取这些参数:

#! /bin/bash

echo "脚本路径 : " $0
 # 第0个参数,是命令的第一段
echo "参数1 : " $1
echo "参数2 : " $2
echo "参数3 : " $3

:<<out
输出:
脚本路径 :  ./filename.sh
参数1 :  param1
参数2 :  param2
参数3 :  param3
out

注意:当参数个数超过9时必须使用${i}来读取,如${10}${100}

还有一些与参数相关的默认变量,如下:

用法

说明

$#

文件传入的参数个数,不包括第0个参数

$*

由所有参数构成的用空格隔开的一个字符串,如"$1 $2 $3"

$@

每个参数分别用双引号括起来的多个字符串,如"$1" "$2" "$3"

$$

返回脚本的进程ID

$?

上一条命令的退出状态(EXIT CODE),正常退出的程序退出状态为0

$(cmd)

返回cmd这条命令的stdout(可嵌套)

`cmd`

返回cmd这条命令的stdout(不可嵌套)

数组

shell中的数组类似下标为数字类型的键值对,值可以为任意类型,仅支持一维数组,下标默认从0开始。初始化时无需指定大小。

定义数组的两种方法:

a1=(1 '2' "fifcom") # 下标默认从0开始,因此该例子下标最大为2
# 或
a2[0]=1
a2[1]='2'
a2[2]="fifcom"
a2[100]="数组下标不需要连续"

读取数组中元素的值

echo ${a1[i]} # 读取第i个元素
echo ${a1[@]} # 读取整个数组
echo ${a1[*]} # 同上

获取数组长度

echo ${#a1[@]} # 或者
echo ${#a1[*]}