视频链接
http://www.imooc.com/learn/336
1. Bash变量
1.1 变量分类
# 用户自定义变量
只在当前Shell中生效(局部变量)
# 环境变量
在当前Shell和这个Shell的所有子Shell中生效(全局变量, 可用pstree | grep bash 命令查看进程树中的子Shell关系)
这种变量中主要保存的是和系统操作环境相关的数据。
变量可以自定义,但是对系统生效的环境变量名和变量作用是固定的。
# 位置参数变量
这种变量主要是用来向脚本中传递参数或数据的,变量名不能自定义,变量作用也是固定的。
# 预定义变量
是Bash中已经定义好的变量,变量名不能自定义,变量作用也是固定的。
1.2 用户自定义变量
# 定义变量('='左右两边没有空格, 变量值中如果有空格, 需要用双引号将变量值引起来)
变量名=变量值
示例:
name=123
name="123 abc"
# 调用变量
echo $变量名
示例:
echo $name
# 叠加变量
x="$x"456
x=${x}456
# 查看变量(查看系统中已生效的所有变量)
set
set -u # -u 参数表示后续调用未声明的变量时会报错(bash: a: unbound variable), 默认无任何提示
# 删除变量
unset 变量名
示例:
unset name
1.3 环境变量
# 设置环境变量
export 变量名=变量值
示例:
x=123 # 设置一个用户自定义变量(局部变量)
export y=abc # 设置一个环境变量(全局变量)
bash # 进入子Shell中
echo $x # 这里看不到父Shell中的变量x
echo $y # 这里可以看到父Shell中的变量y
# 调用环境变量 echo $x
# 叠加环境变量 x="$x"abc
# 查看环境变量
set # 查看所有变量
env # 查看环境变量
# 常用环境变量
echo $HOSTNAME # 主机名
echo $SHELL # 当前Shell
echo $HISTSIZE # 历史命令条数
echo $USER # 当前用户
echo $HOME # 当前用户的家目录
echo $LANG # 当前语系信息
echo $PATH # 系统查找命令的路径
echo $PS1 # 命令提示符设置
# PS1环境变量
\d 显示日期, 格式为"星期 月 日"
\t 显示24小时制时间, 格式为"HH:MM:SS"
\A 显示24小时制时间, 格式为"HH:MM"
\u 显示当前用户名
\w 显示当前所在目录的完整名称
\W 显示当前所在目录的最后一个目录
\$ 提示符, 如果是root用户, 会显示为'#', 如果是普通用户, 会显示为'$'(不同系统会有所不同)
\H 显示完整的主机名
示例:
PS1="[\u@\H \t \w]\$ " # 显示为[root@my-suse 23:25:38 /home]$
PS1="[\e[1;32m\u\e[0m@\H \t \w]\$ " # \e[1; 是设置颜色的起始标识, 32m 表示绿色, \e[0m 是设置颜色的结束标志
# 查询当前系统语系 locale
LANG # 定义系统主语系的变量
LC_ALL # 定义整体语系的变量
locale -a | more # 查看系统支持的所有语系
/etc/sysconfig/i18n # 系统默认语系的配置文件
1.4 位置参数变量
$n # $0 代表命令本身, $1~$9代表第一到第九个参数, 十以上的参数需要用大括号包含, 如${10}
$* # 这个变量代表命令行中所有参数, $*把所有参数看成一个整体
$@ # 这个变量也代表命令行中所有参数, 不过$@把每个参数区分对待
$# # 这个变量代表命令行中所有参数的个数
示例1:
my_suse:~ # vi hello.sh
---------- 文件内容如下 ------------
#!/bin/bash
num1=$1
num2=$2
sum=$(($num1 + $num2))
echo "$1 + $2 = $sum"
------------------------------------
my_suse:~ # ./hello.sh 12 13
# 这里$((...))表示数值运算, 默认$a+$b是表示字符串拼接操作
示例2:
my_suse:~ # vi for.sh
---------- 文件内容如下 ------------
#!/bin/bash
for i in "$*"
do
echo "The params is $i"
done
for y in "$@"
do
echo "The param is $y"
done
------------------------------------
my_suse:~ # ./for.sh 1 2 3 4 5
1.5 预定义变量
$? 最后一次所执行命令的返回状态, 0表示上一个命令执行成功, 非0表示上一个命令执行失败
$$ 当前进程的的进程号(PID)
$! 后台运行的最后一个进程的进程号(PID)
# 接收键盘输入
read [选项] [变量名]
-p "提示信息" # 在等待read输入时, 显示的提示信息
-t 秒数 # read命令默认会一直等待用户输入, 使用此选项可以指定等待时间
-n 字符数 # read命令只接受指定的字符数, 就会执行
-s # 隐藏输入的数据, 适用于机密信息的输入
示例:
my_suse:~ # vi read.sh
---------- 文件内容如下 ------------
#!/bin/bash
read -p "Please input your name: " name
echo "name = $name"
read -p "Please input your age: " -t 30 age
echo "age = $age"
read -p "Please input your passwd: " -s passwd
echo -e "\npasswd = **$passwd**"
read -p "Please input your sex [M/F]: " -n 1 sex
echo -e "\nsex = **$sex**"
------------------------------------
my_suse:~ # ./read.sh
2. 条件判断
2.1 文件判断
-b 文件 # 该文件是否存在, 并且是否为块设备文件
-c 文件 # 该文件是否存在, 并且是否为字符设备文件
-d 文件 # 该文件是否存在, 并且是否为目录
-e 文件 # 该文件是否存在
-f 文件 # 该文件是否存在, 并且是否为普通文件
-L 文件 # 该文件是否存在, 并且是否为符号链接文件
-p 文件 # 该文件是否存在, 并且是否为管道文件
-s 文件 # 该文件是否存在, 并且是否为非空
-S 文件 # 该文件是否存在, 并且是否为套接字文件
2.2 文件权限判断
-r 文件 # 该文件是否存在, 并且是否有读权限
-w 文件 # 该文件是否存在, 并且是否有写权限
-x 文件 # 该文件是否存在, 并且是否有执行权限
-u 文件 # 该文件是否存在, 并且是否有SUID权限
-g 文件 # 该文件是否存在, 并且是否有SGID权限
-k 文件 # 该文件是否存在, 并且是否有SBit权限
2.3 两个文件比较
文件1 -nt 文件2 # 文件1的修改时间 是否比 文件2的修改时间 新
文件1 -ot 文件2 # 文件1的修改时间 是否比 文件2的修改时间 旧
文件1 -ef 文件2 # 文件1的索引号 是否和 文件2的索引号 一致, 用于判断硬链接
2.4 整数比较
整数1 -eq 整数2 # 整数1 是否等于 整数2
整数1 -ne 整数2 # 整数1 是否不等于 整数2
整数1 -gt 整数2 # 整数1 是否大于 整数2
整数1 -lt 整数2 # 整数1 是否小于 整数2
整数1 -ge 整数2 # 整数1 是否大于等于 整数2
整数1 -le 整数2 # 整数1 是否小于等于 整数2
2.5 字符串比较
-z 字符串 # 字符串 是否为 空
-n 字符串 # 字符串 是否为 非空
字符串1 == 字符串2 # 字符串1 是否等于 字符串2
字符串1 != 字符串2 # 字符串1 是否不等于 字符串2
2.6 逻辑判断
判断1 -a 判断2 # 逻辑与, 两个都为true, 结果才为true
判断1 -o 判断2 # 逻辑或, 有一个为true, 结果就为true
!判断 # 逻辑非
########################################################
# 通过 while 循环读取文件内容
#!/bin/bash
#
while read line
do
userName=$(echo $line | cut -d':' -s -f1)
userId=$(echo $line | cut -d':' -s -f3)
if [ $userId -gt 500 ]; then
echo "userName=$userName, userId=$userId"
fi
done < /etc/passwd
# end
# 相关链接
https://code.csdn.net/snippets/623740/master/linux-常用命令/raw
-- END