Shell变量与Shell脚本

Bash设定文档

  • /etc/profile: 登录时执行,适用于所有用户
  • ~/.bash_profile: 登录时执行
  • ~/.bash_login: 当 ~/.bash_profile 不存在时,登录时执行
  • ~/.profile: 当 ~/.bash_profile~/.bash_login 都不存在时,登录时执行
  • ~/.bashrc: 每次启动 Bash 时执行
  • ~/.bash_logout: 登出时执行

Shell环境定制化

export命令

用于将shell变量转化为环境变量,使得该变量能够被其他程序或子进程访问。

set命令

  • set: 显示打印当前的环境变量和Shell变量

  • set [-o] [+o] option

    • -o:启用该选项
    • +o:禁用该选项
    • 常用选项:
      • allexport: 自动将变量导出为环境变量
      • emacs: 设置Emacs风格的键绑定
      • ignoreeof: 禁止通过 Ctrl+D 退出Shell
      • noclobber: 禁止文件重定向覆盖文件
      • noglob: 禁用元字符解析
      • vi: 设置vi风格的键绑定
  • set -o: 显示或更改选项的状态

printenv命令

用于打印当前的环境变量。

alias/unalias

  • alias: 设置命令别名
  • unalias: 取消命令别名
  • 临时解除别名:可以使用反斜杠 \,例如:alias ls='ls -l' 后,'\ls' 会执行原始的 ls 命令。

定义Shell函数

  • 定义函数语法:

    1
    2
    3
    function [函数名] () {
    运行内容;
    }

    注意:{} 前后需要有空格。

  • 定义变量:$变量名

  • 函数名不能与变量名重名。

  • 查看已定义的函数:declare -f

  • 删除函数:unset

Shell脚本

执行Shell脚本

  • 脚本命令可以分行书写,并逐行执行。
  • 运行脚本时,如果没有执行权限,只需要文件的读取权限和文件夹的运行权限即可。
    • 使用 source [脚本名] 或简化版 .[脚本名] 执行脚本。
    • 如果脚本有执行权限,可以省略 source,例如:./[脚本名]
    • 如果脚本不在 PATH 环境变量指定的文件夹中,需要显式指定脚本路径,或者在当前目录使用 ./

传入Shell脚本的变量

  • $0:脚本文件名(全路径)
  • $1:第一个传入的变量值
  • $2:第二个传入的变量值
  • #$:传入的变量数量
  • $@:所有传入的变量值(空格分隔)
  • $*:所有变量值(以系统默认的分隔符分隔)
  • 脚本执行结束后的返回状态:echo $?。正常执行返回0,错误返回1。

文件检查

使用 test 命令或者 [ ] 语法进行文件检查:

1
2
test 条件文
[ 条件文 ]

常见条件文:

  • -f 文件名:检查文件是否存在且为普通文件
  • -d 文件夹名:检查文件夹是否存在
  • -r 文件名:检查文件是否有读取权限
  • -w 文件名:检查文件是否有写入权限
  • -x 文件名:检查文件是否有执行权限
  • -s 文件名:检查文件是否为空
  • -L 文件名:检查是否为软链接
  • -e 文件名:检查文件是否存在
  • 文件名1 -nt 文件名2:文件1是否比文件2新
  • 文件名1 -ot 文件名2:文件1是否比文件2旧
  • 数值比较:-eq, -ge, -gt, -le, -lt, -ne(等于、大于等于、大于、小于等于、小于、不等于)
  • 字符串比较:-n(字符串长度大于0),-z(字符串长度为0)
  • 字符串相等:字符串1 = 字符串2
  • 字符串不等:字符串1 != 字符串2
  • 逻辑操作:
    • !:条件非
    • -a:与(and)
    • -o:或(or)

条件分歧

if语句

1
2
3
4
5
6
if 条件式
then
执行文1
else
执行文2
fi

或者:

1
2
3
4
5
if 条件式; then
执行文1
else
执行文2
fi

case语句

1
2
3
4
5
6
7
8
casein
值1)
执行文1 ;;
值2)
执行文2 ;;
*)
执行其他文 ;;
esac

注意:每个 执行文 后面要有 ;;,并且最后使用 esac 结束。

for循环

1
2
3
4
for 变量名 in 变量值列表
do
执行文
done

例如:

1
2
3
4
for var in Vine SUSE Gentoo
do
echo $var Linux
done

变量值列表可以通过空格分隔,也可以使用 seq

1
2
3
4
for i in `seq 10 15`
do
echo $i
done

while循环

1
2
3
4
while 条件文
do
执行文
done

read命令

1
2
3
echo -n 'Who are you?:'
read username
echo "Hello, $username!"
  • 如果 echo 后面跟 -n,则输入的提示信息和用户输入将在同一行显示。

指定执行Shell类型

1
#!/bin/bash

此行用于指定脚本执行时使用的Shell解释器。