6.Shell变量与Shell脚本
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 退出Shellnoclobber
: 禁止文件重定向覆盖文件noglob
: 禁用元字符解析vi
: 设置vi风格的键绑定
-
set -o
: 显示或更改选项的状态
printenv
命令
用于打印当前的环境变量。
alias
/unalias
alias
: 设置命令别名unalias
: 取消命令别名- 临时解除别名:可以使用反斜杠
\
,例如:alias ls='ls -l'
后,'\ls'
会执行原始的ls
命令。
定义Shell函数
-
定义函数语法:
1
2
3function [函数名] () {
运行内容;
}注意:
{
和}
前后需要有空格。 -
定义变量:
$变量名
-
函数名不能与变量名重名。
-
查看已定义的函数:
declare -f
-
删除函数:
unset
Shell脚本
执行Shell脚本
- 脚本命令可以分行书写,并逐行执行。
- 运行脚本时,如果没有执行权限,只需要文件的读取权限和文件夹的运行权限即可。
- 使用
source [脚本名]
或简化版.[脚本名]
执行脚本。 - 如果脚本有执行权限,可以省略
source
,例如:./[脚本名]
。 - 如果脚本不在
PATH
环境变量指定的文件夹中,需要显式指定脚本路径,或者在当前目录使用./
。
- 使用
传入Shell脚本的变量
$0
:脚本文件名(全路径)$1
:第一个传入的变量值$2
:第二个传入的变量值#$
:传入的变量数量$@
:所有传入的变量值(空格分隔)$*
:所有变量值(以系统默认的分隔符分隔)- 脚本执行结束后的返回状态:
echo $?
。正常执行返回0,错误返回1。
文件检查
使用 test
命令或者 [
]
语法进行文件检查:
1 | 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 | if 条件式 |
或者:
1 | if 条件式; then |
case
语句
1 | case 式 in |
注意:每个 执行文
后面要有 ;;
,并且最后使用 esac
结束。
for
循环
1 | for 变量名 in 变量值列表 |
例如:
1 | for var in Vine SUSE Gentoo |
变量值列表可以通过空格分隔,也可以使用 seq
:
1 | for i in `seq 10 15` |
while
循环
1 | while 条件文 |
read
命令
1 | echo -n 'Who are you?:' |
- 如果
echo
后面跟-n
,则输入的提示信息和用户输入将在同一行显示。
指定执行Shell类型
1 |
此行用于指定脚本执行时使用的Shell解释器。