Hello World!
#! /bin/bash
echo "Hello World!"
第一行是注释,声明用bash作为此脚本的解释器。注释分为两种:
# 单行注释
:<<EOF
多行
注释
EOF
# 其中EOF可以替换为任意字符串
第二行的echo
用于在控制台上输出内容并自动换行。准确的说,echo
会输出传递给它的所有参数,以空格分隔。 "Hello World!"
是字符串,后面会详细介绍。
保存后可以使用bash filename.sh
运行,或者:
chmod +x filename.sh # 赋予可执行权限
./hw.sh # 作为可执行文件执行
变量
- 定义可变变量
v1=123
v2=123.4
v3=fifcom
v4="fifcom"
v5='fifcom'
declare v6=fifcom
# 变量默认为字符串,在使用时会根据需求自动转换类型
# 注意:定义变量时等号的左右两边不可以有空格
# 否则可能被解析器作为系统命令来执行
- 定义只读变量
readonly v1="immut" # 定义只读变量
v2="mut"
readonly v2 # 转换为只读变量
declare -r v3="immut" # 定义只读变量
- 使用变量
使用变量需要加上$
或${}
符号。 ${}
可以帮助解释器识别变量名
v1=fifcom
echo $v1 # 输出fifcom
echo ${v1} # 输出fifcom
echo ${v1}v1 # 输出fifcomv1
- 删除变量
用unset
删除变量。只读变量不可删除。
v1=fifcom
unset v1
echo $v1 # 输出为空
- 自定义变量与环境变量
自定义变量可以理解为局部变量,子进程不能访问自定义变量。
环境变量可以理解为全局变量,子进程可以访问环境变量。
子进程:可简单理解为当前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[*]}