目录
1. read 命令
介绍:
从键盘读取变量的值,通常在 shell 脚本中与用户进行交互的场合。该命令可以一次读取多个变量的值,变量和输入的值都需要使用空格隔开。在 read 命令后面,如果没有指定变量名,读取的数据将被自动赋值给特定的变量 REPLY。
实例:
从标准输入读取一行并赋值给变量:
读取多个值:
隐藏输入:
限制输入的时间:
限制输入的长度:
提示符:
2. 流程控制语句 if
单分支:
if 条件
then
commands
fi
双分支:
if 条件
then
commands
else
commands
fi
多分支:
if 条件1
then
commands
elif 条件2
then
commands
elif 条件3
then
commands
......
else
commands
fi
实例:
判断用户在系统中是否存在,是否存在家目录:
3. test 测试命令
数值比较:
参数 | 说明 | 示例 |
-eq | 等于则为真 | [ "$a" -eq "$b" ] |
-ne | 不等于则为真 | [ "$a" -ne "$b" ] |
-gt | 大于则为真 | [ "$a" -gt "$b" ] |
-ge | 大于等于则为真 | [ "$a" -ge "$b" ] |
-lt | 小于则为真 | [ "$a" -lt "$b" ] |
-le | 小于等于则为真 | [ "$a" -le "$b" ] |
字符串比较:
参数 | 说明 | 示例 |
== | 等于则为真 | [ "$a" == "$b"] |
!= | 不等于则为真 | [ "$a" != "$b"] |
-z 字符串 | 字符串的长度为零则为真 | [ -z "$a" ] |
-n 字符串 | 字符串的长度不为空则为真 | [ -n "$a" ] |
str1 > str2 | str1 大于 str2 则为真 | [ str1 \> str2 ] |
str1 < str2 | str1 小于 str2 则为真 | [ str1 \< str2 ] |
文件比较:
参数 | 说明 | 示例 |
-e 文件名 | 如果文件或目录存在则为真 | [ -e file ] |
-r 文件名 | 如果文件存在且可读则为真 | [ -r file ] |
-w 文件名 | 如果文件存在且可写则为真 | [ -w file ] |
-x 文件名 | 如果文件存在且可执行则为真 | [ -x file ] |
-s 文件名 | 如果文件存在且至少有一个字符则为真 | [ -s file ] |
-d 文件名 | 如果文件存在且为目录则为真 | [ -d file ] |
-f 文件名 | 如果文件存在且为普通文件则为真 | [ -f file ] |
-c 文件名 | 如果文件存在且为字符型文件则为真 | [ -c file ] |
-b 文件名 | 如果文件存在且为块文件则为真 | [ -b file ] |
file1 -nt file2 | 检查 file1 是否比 file2 新 | [ file1 -nt file2 ] |
file1 -ot file2 | 检查 file1 是否比 file2 老 | [ file1 -ot file2 ] |
实例:
比较两个数的大小:
判断用户是不是超级用户:
清空日志:
4. 流程控制过程中复杂条件和通配符
三种判断:
if [ 条件判断1 ] &&(||) [ 条件判断2 ]
if [ 条件判断1 -a(-o) 条件判断2 ]
if [[ 条件判断1 &&(||) 条件判断2 ]]:双 "[]" 对 *、<、> 等符号不需要转义
通配符:
字符 | 含义 | 实例 |
* | 匹配 0 或多个字符 | a*b,如 aab、ab、axyzb |
? | 匹配任意一个字符 | a?b,a 与 b 之间只能有一个字符,如 aab、acb |
[list] | 匹配 list 中的任意单一字符 | a[xyz]b,a 与 b 之间必须只能有一个字符,如 axb、ayb |
[!list] | 匹配除 list 中的任意单一字符 | a[!0-9]b,a 与 b 之间必须只能有一个字符,如 acb、a-b |
[c1-c2] | 匹配 c1-c2 中的任意单一字符 | a[0-9]b,如 a0b、a9b |
{string1,string2,...} | 匹配 string1 或 string2 或(...)其一字符串 | a{qwe,asd,zxc}b,如 aqweb、aasdb |
实例:
设置 umask: