Bash 变量、配置及测试运算简介

bash 变量说明

根据变量的生效范围为标准:

  • 本地变量:生效范围为当前 shell 进程,对当前 shell 进程之外的进程或当前 shell 的子进程和父进程均无效。
  • 环境变量:生效范围为当前 shell 进程及其子进程。

  • 局部变量:生效范围为当前 shell 进程中某代码片段(函数)。

  • 位置变量: $1$2$3 等来表示,用于让脚本在脚本代码中调用通过外部脚本或命令行传递给它的参数。

  • 特殊变量: $?$0$*$@$# 等来表示,系统自带用户存储特殊数据。

本地变量

变量赋值

name='value'

(1) 直接字串,name="username"

(2) 变量引用,name="$username"

(3) 命令引用,name=$(COMMAND)

变量引用

${name}$name

"" 弱引用,其中的变量引用会被替换为变量值;

'' 强引用,其中的变量引用不会被替换为变量值,而保持原字符串;

显示已定义的所有变量

set

销毁变量

unset name

环境变量

bash 有许多内建的环境变量: PATH , SHELL , UID , HISTSIZE , HOME , PWD , OLD , HISTFILE , PS1 等,自建环境变量时尽可能避免跟系统内建变量冲突。

变量赋值

export name=VALUEdeclare -x name=VALUE

变量引用

$name${name}

显示所有环境变量

exportenvprintenv

销毁环境变量

unset name

变量命名法则

  • 不能使程序中的保留字:例如 iffor

  • 只能使用数字、字母及下划线,且不能以数字开头;

  • 见名知义;

只读变量

readonly name=VALUE

declare -r name=VALUE

位置变量

在脚本代码中调用通过命令行传递给脚本的参数;

$1$2$3 对应调用第1、第2、第3参数;

$0 命令本身;

$* 传递给脚本的所有参数;

$@ 传递给脚本的所有参数;

$# 传递给脚本的参数的个数;

shift [n] 剔除参数,n表示剔除n个,可多次使用。

eg1:

echo $1
shift
echo $1 # 由于前一个$1被剔除,此时$1为实际$2的值

eg2:

echo $1
shift 3
echo $1 # 由于$1-$3被剔除,此时$1为实际$4的值

bash配置文件

profile

为交互式登录的 shell 提供配置:

  • 直接通过终端输入账号密码登录的用户;

  • 使用 su - UserNamesu -l UserName 切换的用户;

生效范围

  • 全局

/etc/profile

/etc/profile.d/*.sh

  • 个人

~/.bash_profile

  • 功用

(1) 用于定义环境变量;

(2) 运行命令或脚本;

读取顺序

/etc/profile > /etc/profile.d/*.sh > ~/.bash_profile > ~/.bashrc > /etc/bashrc

bashrc

为非交互式登录的shell提供配置:

  • su UserName

  • 图形界面下打开的终端;

  • 执行脚本;

生效范围

  • 全局

/etc/bashrc

  • 个人

~/.bashrc

  • 功用

(1) 定义命令别名;

(2) 定义本地变量;

读取顺序

~/.bashrc > /etc/bashrc > /etc/profile.d/*.sh

bash算术运算符

+, -, *, /, %, **

使用 help let 来查看帮助信息。

实现算术运算的方式

  • 以加法为例:

  1. let a=$a+$b

  2. a=$[$a+$b],建议使用;

  3. a=$(($a+$b))

  4. a=$($a + $b + $c ...),某些特殊运算符需要转义,不建议使用;

  • 内建的随机数生成器

$RANDOM

  • 取60以内的随机数(60的余数必定小于60)

a=$[$RANDOM%60+1]

增强型赋值

+=, -=, *=, /=, %=

let a+=1 等价于 a=$[$a+1]

自增,自减:

++, --

let a++ 等价于 a=$[$a+1]

let a-- 等价于 a=$[$a-1]

bash条件测试

测试命令

test EXPRESSION 系统内建命令;

[ EXPRESSION ] 系统内建命令,等价于test,对系统兼容性更佳;

[[ EXPRESSION ]] bash关键字,只能在bash下使用,但是对命令兼容性和扩展性更佳;

具体使用可通过 help testhelp [help [[ 查看;

数值测试:

[] 中必须使用以下运算符进行数字比较。

-gt 是否大于;

-ge 是否大于等于;

-eq 是否等于;

-ne 是否不等于;

-lt 是否小于;

-le 是否小于等于;

字符串测试:

[[]] 中以下运算符也可以用于数字比较。

== 是否等于;

> 是否大于;

< 是否小于;

!= 是否不等于;

=~ 左侧字符串是否能够被右侧的PATTERN所匹配;

-z "STRING" 测试字符串是否为空,空则为真,不空则为假;

-n "STRING" 测试字符串是否不空,不空则为真,空则为假;

用于字符串比较时的用到的操作数都应该使用引号!

文件测试

help test 可查看所有参数,比较常用的有如下几类。

存在性测试

-a FILE 文件存在性测试,存在为真,否则为假;

-e FILE 等价于 -a FILE

存在性及类别测试

-b FILE 是否存在且为块设备文件;

-c FILE 是否存在且为字符设备文件;

-d FILE 是否存在且为目录文件;

-f FILE 是否存在且为普通文件;

-h FILE-L FILE 存在且为符号链接文件;

-p FILE 是否存在且为命名管道文件;

-S FILE 是否存在且为套接字文件;

文件权限测试

对于 root 用户无效。

-r FILE 是否存在且可读;

-w FILE 是否存在且可写;

-x FILE 是否存在且可执行;

文件特殊权限测试

-g FILE 是否存在且拥有 sgid 权限;

-u FILE 是否存在且拥有 suid 权限;

-k FILE 是否存在且拥有 sticky 权限;

文件大小测试

-s FILE 是否存且非空;

文件是否打开

-t fd fd 表示文件描述符是否已经打开且与某终端相关;

-N FILE 文件自从上一次被读取之后是否被修改过;

-O FILE 当前有效用户是否为文件属主;

-G FILE 当前有效用户是否为文件属组;

双目测试

FILE1 -ef FILE2 FILE1 与 FILE2 是否指向同一个设备上的相同 inode ;

FILE1 -nt FILE2 FILE1 是否新于 FILE2 ;

FILE1 -ot FILE2 FILE1 是否旧于 FILE2 ;

组合测试条件

  • 第一种方式:

COMMAND1 && COMMAND2

COMMAND1 || COMMAND2

! COMMAND

eg:

[ -e FILE ] && [ -r FILE ]

[[ -e FILE && -r FILE ]]

  • 第二种方式:

EXPRESSION1 -a EXPRESSION2

EXPRESSION1 -o EXPRESSION2

! EXPRESSION

eg:

[ -z "$HOSTNAME" -o "$HOSTNAME"=="localhost.localdomain" ] && hostname www.huangzhongzhang.cn

不能用于 [[]]

Leave a Reply

Your email address will not be published. Required fields are marked *