shell脚本使用笔记

本文最后更新于:2022年4月22日 早上

shell脚本使用笔记

文章仍在施工中。。。

1.基础知识

  • 第一行使用 #!/bin/bash 来指定使用的shell。如果写的那个shell不存在那么默认不会执行。外部指定shell可以覆盖脚本内部指定的
  • 变量使用$variable来保存,弱类型,默认都是字符串,赋值时等号不要写空格
  • 父子shell的变量不共用
  • 环境变量在当前shell以及任意子shell中可以使用
  • !!为上一条指令
  • 单引号不能识别特殊语法。需要变量替换要使用双引号
  • 使用bash会开启一个子shell,使用source不会开启新shell
  • 反引号括起来的执行结果会被保存下来,其效果相当于a=$(ls)
  • nohup XXX & 1>/dev/null 后台执行命令

2.变量

  • 用户个人环境变量配置文件~/.bash_profile,远程登录用户特有~/.bashrc。全局配置文件/etc/profile/etc/bashrc。系统建议最好创建在/etc/profile.d而不是直接修改全局配置。全局配置影响所有登录用户,个人配置优先生效
  • set/declare,输出所有变量,包括全局、局部
    • env,只显示全局变量
    • export,显示和设置环境变量值
  • 设置变量前加readonly,那么shell结束前此变量值不可更改
  • export |awk -F '[ :=]' '{print $3}' 打印环境变量的命令(第三列)
  • 变量加载顺序:/etc/profile/etc/profile.d$HOME/.bash_profile$HOME/.bashrc/etc/bashrc
  • 特殊参数

    • $0,获取shell脚本文件名,以及脚本路径

    • $n,获取shell脚本的第n个参数,n在1~9之间,大于9则需要写${10},参数空格隔开

    • $#,获取执行的she11脚本后面的参数总个数

    • $*,获取shell脚本所有参数,不加引号等同于$@作用,加上引号作用是接收所有参数为单个字符串

    • $@,不加引号效果同上;加引号,是接收所有参数为独立字符串

1
2
3
4
5
#!/bin/bash
for var in "$@"
do
echo "$var"
done
  • 特殊状态
    • $?,上一次命令执行状态返回值,正确,非0失败
    • $$,当前shell脚本的进程号
    • $!,上一次后台进程的PID
    • $_,获取上次执行命令最后一个参数
1
2
3
4
5
6
#!/bin/bash
[$# -ne 2] && {
echo "输入俩参数"
exit 119 # 返回值给$?变量
}
echo "OK"

3.shell子串

3.1.bash基础内置命令

  • echo
    • -n,不换行输出
    • -e,解析字符串中的转义符
  • eval,执行多个命令
  • exec,不创建子进程,执行后续命令。执行完毕后自动exit

3.2.子串

  • ${a},变量值

  • $ #a},变量字符串长度

    扩号应该有左半边。别问我为啥没打~问就是mathjax渲染不出来

  • ${a:start},变量start数值位置以及之后的字符(索引从0开始)

  • ${a:start:length},变量start数值之后的length长度字符

  • ${a#word},从变量开头,删除最短匹配的word子串

  • ${a##word},从变量开头,删除最长匹配的word

  • ${a%word},从变量结尾删除最短的word

  • ${a%%word},从变量结尾开始删除最长匹配的word

  • ${a/pattern/string},用string代替第一个匹配的pattern

  • ${a//pattern/string},用string代替所有的pattern


本博客所有文章除特别声明外均为原创,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!