VsCode使用插件
shell-format(格式化插件)
补全插件为tabnine,目前遗留问题,函数无法如其他语言点击跳转
变量
变量类型
- 局部变量 局部变量在脚本或命令中定义,仅在当前shell实例中有效,其他shell启动的程序不能访问局部变量。
- 环境变量 所有的程序,包括shell启动的程序,都能访问环境变量,有些程序需要环境变量来保证其正常运行。必要的时候shell脚本也可以定义环境变量。
- shell变量 shell变量是由shell程序设置的特殊变量。shell变量中有一部分是环境变量,有一部分是局部变量,这些变量保证了shell的正常运行
声明变量
# /bin/bash
name="hello world" # 声明变量 `=` 前后不能有空格!
echo "${name}"
# or
# echo "$name"
# 使用`${variable name}` or `$VariableName` 调用变量
只读变量
使用
readonly命令可以将变量定义为只读变量
# /bin/bash
readonly name="hello world"
name="test"
echo $name
output:
line 3: name: readonly variable
删除变量
使用
unset可以删除变量
# /bin/bash
name="hello world"
unset name
echo $name
Tip:注意如果声明了只读变量会无法删除:
unset: name: cannot unset: readonly variable
注意事项
字符串问题
- 单引号内不能包含变量,无法使用转义符
查找字符串
name="hello world" echo `expr index "$name" o`注意
expr index为查询命令,必须带上数组
bash支持一维数组,不支持多维数组且没有数组长度限制,数组之间用空格分割
# /bin/bash name=() name[0]="hello" name[1]="world" echo "list is : ${name[1]}"多行注释
:<<EOF 注释内容... 注释内容... 注释内容... echo "hello world" EOF echo "hello world"后面的EOF可以自定义,随意更换,但结尾必须是定义的字符
传递参数
接受命令行所传递的参数
$#获取传递参数的总数量$*以一个单字符串显示所有向脚本传递的参数。- 如:"1 n"的形式输出所有参数。
$$脚本运行的当前进程ID$!后台运行的最后一个进程ID号$@与$*相同,但是使用时加引号,并在引号中返回每个参数。- 如"1" "n" 的形式输出所有参数。
$?显示最后命令的退出状态。0表示没有错误,其他任何值表明有错误。$-显示Shell使用的当前选项,与set命令功能相同。
注意事项
- @ 区别:
- 相同点:都是引用所有参数。
- 不同点:只有在双引号中体现出来。假设在脚本运行时写了三个参数 1、2、3,,则 " * " 等价于 "1 2 3"(传递了一个参数),而 "@" 等价于 "1" "2" "3"(传递了三个参数)。