VSCode 编写 Shell 脚本
用到的插件:
- shellman: 语法提示
- shell-format: 格式化
- shellcheck: 语法错误检查
- Remote-WSL(可选): 远程打开WSL(子系统) 上的目录, 运行 shell
shellman
直接从应用市场安装即可
shell-format
前提:
-
shell-format依赖于 shfmt
-
shell-format会调用本地的 shfmt 可执行文件.
-
如果要使用 shell-format, 必须要下载 shfmt
-
shfmt的各个版本在发行页
使用:
-
比如下载 shfmt_v3.0.0-beta1_windows_amd64 版本
-
把文件名重命名短一点, 然后放到
D:\App\shfmt_v3.0.0.exe
目录下 -
从VSCode的商店安装 shell-format
-
打开配置文件
setting.json
添加如下配置:"shellformat.path": "D:\\App\\shfmt_v3.0.0.exe", "shellformat.flag": "-i=2 -sr -kp -ci",
shellformat.path
用来指定 shfmt 的路径shellformat.flag
表示功能配置. 具体内容参考 shfmt# like -i=4 indent_style = space indent_size = 4 shell_variant = posix # like -ln=posix binary_next_line = true # like -bn switch_case_indent = true # like -ci space_redirects = true # like -sr keep_padding = true # like -kp
shellcheck
前提:
- vscode-shellcheck 依赖于 shellcheck
- 安装 shellcheck 可执行文件
使用前说明:
- 在 shellcheck 的可执行文件中, 也包含 windows 版本, 但是不知道为什么不可用.
- 将 shellcheck的 Linux 版本安装到 WSL(子系统) 中. 然后配置使用 WSL 中的shellcheck
使用:
-
安装 WSL – 具体内容可以百度
- 在
控制面板
中找到启用或关闭WIndows功能
- 在列表的最下面找到
适用于 Linux 的 Windows 子系统
, 在前面的打勾
并确定
. - 电脑会提示重启.
- 重启后, 在
应用商店
里搜索Linux
, 选择Ubuntu
安装. - 添加用户, 设置密码. root密码可以用
sudo passwd root
来设置.
- 在
-
下载 shellcheck 的 Linux 版本, 放在D盘下面, 路径为:
D:\shellcheck-stable.linux.x86_64.tar.xz
-
从
开始
菜单打开Ubuntu
, 从 Windows 中复制到 Linux 中/usr/local/bin
sudo cp /mnt/d/shellcheck-stable.linux.x86_64.tar.xz /usr/local/bin
-
解压
shellcheck-stable.linux.x86_64.tar.xz
sudo xz -d shellcheck-stable.linux.x86_64.tar.xz sudo tar -xvf shellcheck-stable.linux.x86_64.tar
要解压两边
-
解压后得到
shellcheck-stable
目录, 里面有三个文件LICENSE.txt README.txt shellcheck
-
将
shellcheck
移动到/usr/local/bin
目录下mv /usr/local/bin/shellcheck-stable /usr/local/bin
-
从 VSCode 安装 shellcheck 的插件
-
修改配置文件
setting.json
"shellcheck.enable": true, "shellcheck.useWSL": true,
也可以通过可视化配置.
Remote-WSL(可选)
运行 shell 脚本的方法有很多, 用 git 中的 bash 也是很好的选择.
Remote-WSL的作用就像是在 Linux 上安装一个 VSCode, 直接编辑 Linux 上的文件.
错误提示:
Syntax error: Bad for loop variable
原因:
从 ubuntu 6.10 开始,ubuntu 就将先前默认的 bash shell 更换成了 dash shell;其表现为 /bin/sh 链接倒了 /bin/dash 而不是传统的 /bin/bash。
$ ls -l /bin/sh
lrwxrwxrwx 1 root root 4 Aug 12 14:29 /bin/sh -> dash
所以在使用 sh 执行检测的时候实际使用的是 dash,而 dash 不支持这种 C 语言格式的 for 循环写法。
解决办法:
-
将默认 shell 更改为 bash。(bash 支持 C 语言格式的 for 循环)
sudo dpkg-reconfigure dash
在选择项中选 No
-
直接使用 bash :
bash -n xxx.sh
-
为了确保 shell 脚本的可移植性,直接更改 shell 脚本,使用 shell 支持的 for 循环格式:
for a in `seq $num`