Shell脚本 运作方式与解释型语言相当,如果有语言基础,学起 Shell 脚本就非常容易,但是 Shell 与常见的语言不同,一些常见的函数在 Shell 中需要组合一些命令得以实现
工具推荐Shell 似乎没有定制的 IDE,这里推荐 VS Code 搭配对应的插件:
shellman 智能提示和自动补全,在插件页面有介绍常用代码片段的触发关键词,作者在 Shellman reborn 中写到了 Shellman 诞生的故事,挺有趣的
shellcheck 语法静态检查工具,插件安装后需要本地安装 shellcheck,参考 ,Mac OS 可以使用 brew install shellcheck,这样在写 Shell 的时候,语法有误的地方就会以波浪线的方式提示
shell-format 代码整理,Win 快捷键:Alt + Shift + F,Mac OS 快捷键:option + shift + F
Code Runner 脚本运行,右键 Run Code,Win 快捷键:Ctrl + Alt + N,Mac OS 快捷键:control + option + N
运行 shell 脚本新建脚本:test.sh
#!/usr/bin/env bash # 使用echo 打印字符串或者变量 echo 'hello world'可以用 Code Runner 运行,就会输出:hello world
在 Shell脚本 的第一行一般会写 #!/bin/bash 这个是 Shebang,#! 后面是解释器的绝对路径,脚本将用该解释器执行。还有一种写法是:#!/usr/bin/env bash,/usr/bin/env 是 env 命令的绝对路径,而 env 命令用于显示系统中已存在的环境变量,其中包含了 $PATH ,会在 $PATH 包含的目录依次找 bash,常见的命令行解释器有:sh ,bash ,zsh(Mac OS 默认解释器)
如果在 Linux 或 类Unix 下运行,有这么几种方式:
先给脚本添加执行权限:chmod +x test.sh,然后运行脚本:./test.sh,这种方式执行会读取 Shebang,用指定的解释器执行脚本
sh test.sh,使用 sh 这个解释器执行脚本,当然也可以用其他执行,比如:bash test.sh。与第一种方式相同,当前的 shell 是父进程,生成一个子 shell 进程(子进程会继承父进程的环境变量),在子 shell 中执行脚本,脚本执行完毕,退出子 shell 回到当前 shell
source 点命令方式:source test.sh 等效于 . test.sh。source 让脚本在当前 shell 执行,不生成新的子进程。使用 source 执行脚本,脚本中对于环境变量的修改会作用于当前 shell,这就是为什么我们在修改了一些配置如:~/.bashrc,执行 source ~/.bashrc 后配置就生效了
exec 方式:有需要先给脚本添加执行权限:chmod +x test.sh,执行 exec ./test.sh,也是让脚本在同一个进程上执行不生成新的子进程,与 source 的区别就是,在脚本执行完成后进程会被结束
基础命令可以按照 [Bash Shell] Shell学习笔记 学习,这篇文章讲的非常详细,本篇博客也是在学习这篇文章后写下的
获取输入使用 read 命令,从标准输入流 (stdin) 获取输入
#!/usr/bin/env bash read var echo "${var}"运行脚本,输入任意字符,回车确认,输入的值会赋值给变量 var,并打印出该变量
输出 #!/usr/bin/env bash var=1 # 输出变量 echo ${var} # 输出字符串 显示部分字符需要转义 echo "\"hello world\"" # "hello world" # 换行使用 -e 参数:使转义字符生效 # 使用 \n 换行 echo -e "newline\n"也可以让 shell 输出不同颜色的字符,可以参考:shell脚本中echo显示内容带颜色
#!/usr/bin/env bash echo -e "\033[30m 黑色字 \033[0m" echo -e "\033[31m 红色字 \033[0m" echo -e "\033[32m 绿色字 \033[0m" echo -e "\033[33m 黄色字 \033[0m" echo -e "\033[34m 蓝色字 \033[0m" echo -e "\033[35m 紫色字 \033[0m" echo -e "\033[36m 天蓝字 \033[0m" echo -e "\033[37m 白色字 \033[0m" 变量使用 # = 两边不能有空格 var="hello world" num=100 # 在引用变量时,这种方式可以,但是推荐下面一种 echo $var # 推荐在使用字符串变量时,在两侧加上双引号,否则如果变量字符串中存在空格,则字符串会被切分 echo "$var" # 如果涉及字符串拼接,可以在变量名两侧加上花括号 echo "变量为: ${var}." # 将变量设置为只读,再次修改会报错 readonly var # var="wolrd" # 删除变量,不能删除 readonly 修饰的变量 unset num变量赋值时,变量名命名规则和其他语言类似,注意变量赋值时 = 两边不能有空格
使用时在变量名前加上 $,推荐所有的变量都使用 ${} 的方式使用变量
运算算术运算:Bash 原生不支持数学运算,可以使用 awk 和 expr
注意乘号需要加上转义:\*,而且运算符两侧必须空格
a=10 b=3 val=`expr $a + $b` echo "a + b : $val" val=`expr $a - $b` echo "a - b : $val" val=`expr $a \* $b` echo "a * b : $val" val=`expr $b / $a` echo "b / a : $val" val=`expr $b % $a` echo "b % a : $val" 执行命令$()与 ``(反引号)都可以用于执行命令,并会将执行的结果返回,shellcheck 推荐使用第一种 $() 的方式
#!/usr/bin/env bash result=`date "+%Y-%m-%d"` echo "${result}" result=$(date "+%Y-%m-%d") echo "${result}" 运算符