http://www.cnblogs.com/maxupeng/archive/2011/07/02/2096551.html
https://blog.csdn.net/xingzhi2014/article/details/22859509
https://www.cnblogs.com/wangkongming/p/4936825.html
一、test命令
test命令是shell内部命令,它计算作为其参数的表达式是真还是假。
如果表达式为真,则test返回0(注意与C语言0表示false不同),如果表达式为假,返回非0。
shell提供了另外一个调用test命令的方式,就是用方括号[]来代替单词test。
调用test命令的格式为:
test expr1 opr expr2 或是 [ expr1 opr expr2 ]
test opr expr1 或是 [ opr expr1 ]
(注意方括号与表达式之间的空格必须存在)
二、逻辑运算符
-a expr1 -a expr2 逻辑与
-o expr1 -o expr2 逻辑或
! !expr1 逻辑非
三、数值判断
-eq num1 -eq num2 是否相等
-ne num1 -ne num2 是否不相等
-gt num1 -gt num2 是否大于
-ge num1 -ge num2 是否大于等于
-lt num1 -lt num2 是否小于
-le num1 -le num2 是否小于等于
四、字符串判断
= str1 = str2 字符串是否相等
!= str1 != str2 字符串是否不等
-n -n str1 字符串长度是否不等于0
-z -z str2 字符串长度是否等于0
五、文件判断
-r -r filename 文件是否存在且可读
-w -w filename 文件是否存在且可写
-s -s filename 文件是否存在且长度非0
-f -f filename 文件是否存在且是普通文件
-d -d filename 文件是否存在且是一个目录
六、命令行参数/位置变量
$0 脚本的名字
$1, $2, ..., $9 脚本第1个到第9个命令行参数
$# 命令行参数的个数
$@ 或是 $* 所有命令行参数
$? 最后一条命令的退出状态
$$ 正在执行进程的ID(PID)
给位置变量赋值:
set One Two Three
echo $1 $2 $3
结果显示:One Two Three
shift命令:
这条命令可以对位置参数进行移动,每次调用都会导致:$1=$2、$2=$3、$3=$4....
以下代码可以打印出所有的参数
while [ -n "$1" ]
do
echo $1
shift
done
七、
当在对变量进行判断时最好将变量用双引号括起来,这样可以避免参数包含空格或是TAB带来的问题。
如:”$HOME“、"$#"
八、变量替换(赋值)
shell提供了变量替换功能,使用户能够检查变量的值并根据选项改变它的值。
$variable 保存在variable中的值
${variable} 保存在variable中的值
${variable:-string} 如果variable的值非空,则值为variable,否则值为string
${variable:+string} 如果variable的值非空,则值为string,否则值为空
${variable:=string} 如果variable的值非空,则值为variable,否则值为string且variable的值设置为string
${variable:?string} 如果variable的值非空,则值为variable,否则显示string并退出
千里之行,始于足下。改变现在,就是改变未来。改变未来,从现在开始。 个人网站:http://www.wangkongming.cn
分类: Linux
谢谢Lee.MaRS很好的建议,他提醒大家:“这篇文章的内容主要适用于bash。不能保证在其他shell中也适用,诸如zsh等。:)”
====
以下是可替换的参数:
${ Parameter } shell 读取从 ${ 到匹配的 } 之间的所有字符,作为同一个字的部分,即使该字包含大括号或元字符。如果有,替换指定的参数的值。以下情况下大括号是必需的:当 Parameter 参数后跟一个不被解释为其名称一部分的字母、数字或下划线时,或当一个命名的参数进行下标操作时。
如果指定的参数包含一个或多个数字,则它是一个位置参数 。多个数字的位置参数必须括起在大括号中。如果变量的值是 * 或 @,则替换每个以 $1 开始的位置参数(由字段分隔符分隔)。如果使用了一个带下标 * 或 @ 的数组标识,则替换每个元素(用字段分隔符分隔)的值。
${# Parameter } 如果 Parameter 参数的值是 * 或 @, 则替换位置参数的数量。否则,替换 Parameter 参数指定的长度。
${# Identifier [* ]} 替换 Identifier 参数指定的数组中的元素数。
${ Parameter :- Word } 如果设置了 Parameter 参数并且不为空,则替换其值;否则,替换 Word 参数的值。
${ Parameter – Word } 如果设置了 Parameter 参数,则替换其值;否则,替换 Word 参数的值。
${ Parameter : = Word } 操作符: 和= 没有空格, 如果未设置 Parameter 参数或其为空,则将它设置为 Word 参数的值。不能用这种方法指定位置参数。
${ Parameter : ?Word } 如果设置了 Parameter 参数并且它不为空,则替换其值。否则,打印 Word 变量的值并从 shell 退出。如果省略 Word 变量,则打印标准消息。
${ Parameter :+ Word } 如果设置了 Parameter 参数并且它不为空,则替换 Word 变量的值。
${ Parameter # Pattern } | ${ Parameter ## Pattern } 如果指定的 shell Pattern 参数匹配 Parameter 参数的值的开始部分,则此替换的值是 Parameter 参数删除匹配部分后的值。否则,替换 Parameter 参数的值。在第一种格式中,删除最小匹配模式。在第二种格式中,删除最大匹配模式。
${ Parameter % Pattern } | ${ Parameter %% Pattern } 如果指定的 shell Pattern 匹配 Parameter 变量的值的结束部分,则此替换的值是 Parameter 变量删除匹配部分后的值。否则,替换 Parameter 变量的值。在第一种格式中,删除最小匹配模式;在第二种格式中,删除最大匹配模式。
在先前的表达式中,Word 变量不被求值,除非它用作替换的字符串。这样,在下例中,pwd 命令只在没有设置 -d 标志或它为空时才执行:
echo ${d:-$(pwd)}
注: 如果 : 被从先前表达式中省略,则 shell 仅检查是否设置了 Parameter 参数。
PS:上述内容主要是来自IBM的shell学习资料.
PS:上述的pattern并不是正则,而是通配符规则。
PS:注意在${}里如果要使用变量,就不用加$符号了。