两种格式: test condition 或 [ condition ](注意两边加了空格)
condition可以是多个子条件的逻辑运算,逻辑运算符号有以下几种:
-a 逻辑与
-o 逻辑或
! 逻辑否
&&, ||
【实例】
$ ls aaa && echo "yes" || echo "no"
有文件aaa时会输出yes,否则输出no
文件测试利用条件测试的方式测试一个文件或者目录的状态,如是否存在、是否可读等,具体的测试参数如下:
-d 目录
-f 普通文件(Regular file)
-L 符号链接
-r Readable(文件、目录可读)
-b 块专用文件
-e 文件存在
-g 如果文件的set-group-id位被设置则结果为真
-s 文件长度大于0,非空
-z 文件长度=0
-w Writable(文件、目录可写)
-u 文件有suid位设置
-x Executable(文件可执行、目录可浏览)
-c 字符专用文件
-L 符号链接
例如测试文件file.txt是否存在,可以这样测试:
$test -e file.txt 或者 [ -e file.txt ]
字符串测试可以测试字符串是否为空,测试两个字符串是否相等等,具体的测试参数如下:
= 两字符串相等
!= 两字符串不等
-z 空串 [zero]
-n 非空串 [nozero]
数值测试用于测试两个参数的大小、相等等情况,格式是:“number” numberic_operator “number” 或 [ “number” numberic_operator “number”],numberic_operator取值如下:
-eq 数值相等(equal)
-ne 不等(not equal)
-gt A>B(greater than)
-lt A<B(less than)
-le A<=B(less、equal)
-ge A>=B(greater、equal)
(疑问:好像不能用一个变量跟一个数值常量比较,要将值赋给变量然后比较两个变量,待考证!)
if 条件1
then
命令1
elif 条件2
then
命令2
else
命令3
fi
case variable in
pattern [| pattern] …..) #匹配模式之间用"|"隔开
命令….
;;
模式2)
命令…..
;;
*) #匹配所有
…….
;;
esac
for 变量名 in 列表
do
命令1
命令2
done
例子:
用于数值序列:
for loop in 1 2 3 4 5
for i in {1..10}
for ((i = 1; i <= 10; i++))
用于字符串序列:
for loop in “orange red blue grey”
用于命令的执行结果:
for loop in `ls`
无限循环:
for files in *
until condition
do
命令…..
done
while condition
do
命令1
命令2
done
hard quote:' ' (单引号),凡在 hard quote 中的所有 meta 均被关闭。
soft quote: " " (双引号),在 soft quoe 中大部份 meta 都会被关闭,但某些则保留(如 $ )。
escape : \ (反斜杠),只有紧接在 escape (跳脱字符)之后的单一 meta 才被关闭。
例如:命令echo '$0 outside function is '$0,第一个$0不会解开,直接输出字符"$0",而第二个$0会被解开,输出当前shell script的路径;
如果用命令echo "$0 outside function is "$0,则两个$0都会被解开,因此不能达到想要的结果。
(注意:在vim中编写shell script时,vim的颜色提示就可以看出符号是否解开,即是按普通字符串处理,还是按meta处理)
逐行读取文件
while read line
do
echo $line
done < file.txt
num1=123 num2=100 #(1)declare声明方式 declare -i sum=$num1+$num2 #(2)$(())操作符方式 sum=$((num1 + num2)) #(3)expr命令方式,$()为执行命令,expr是计算命令 sum=$(expr $num1 + num2 ) 注意:方式1中+左右不能有空格,方式2可有可无,方式3中必须加空格,否则会按字符串方式连接; 另外,方式2中变量前的$符号可以省略。
http://www.cnblogs.com/barrychiao/archive/2012/10/22/2733210.html
计算字符串长度:
${#string}
抽取子串:
${string:position} #从名称为$string的字符串的第$position个位置开始抽取子串
${string:position:length} #从名称为$string的字符串的第$position个位置开始抽取长度为$length的子串
删除子串:
${string#substring} #删除string开头处与substring匹配的最短子串
${string##substring} #删除string开头处与substring匹配的最长子串
${string%substring} #删除string结尾处与substring匹配的最短子串
${string%%substring} #删除string结尾处与substring匹配的最长子串
替换子串:
替换子串命令都是${…}格式,可以在任意处、开头处和结尾处替换满足条件的子串
${string/substring/replacement} #仅替换第一次与substring相匹配的子串
${string//substring/replacement} #替换所有与substring相匹配的子串
${string/#substring/replacement} #替换string开头处与substring相匹配的子串
${string/%substring/replacement} #替换string结尾处与substring相匹配的子串