********空格
1.定义变量,等号赋值时不能有空格
var="/etc/passwd"
2.条件测试字符串比较,等号前后要有空格
[ $str1 = $str2 ]
3.命令与选项间有空格
4.管道|前后可有可无
5.[是test的别名,其后必须有空格,]表示[的结束
test expression 即 [ expression ]
********命令替换
1.`cmd`
2.$(cmd)
允许将命令替换的结果赋值给变量
var=$[$(cat /proc/meminfo | grep MemTotal | tr -d "MemTotal :kB")*256] 物理内存的1/4赋值给var
********整数运算
1.$[ operation ]
2.$(( operation ))
********改变IFS内部字段分隔符
默认IFS是space,tab,newline在处理含有空格的数据(文件名)时可以替换默认分隔符
IFSback=$IFS #保存默认分隔符
IFS=$'
' #指定
为新的分隔符(搜索结果中含有空格)
command......
IFS=$IFSback
1.IFS=$'
'文本中的空白行不会输出(同理IFS=$' ')
IFS=$"
"文本中的空白行会输出
2.其他符号可以直接赋值
IFS=;:"?
******条件判断
1.字符串判断(s1和s2)
s1 = s2 s1和s2有相同内容和长度
s1 != s2 s1和s2不同
-n s1 s1长度非0
-z s1 s1长度为0
s1 > s2 s1大于s2
s1 < s2 s1小于s2
2.数字判断(i1和i2均为整数)
i1 -eq i2 i1等于i2
i1 -ne i2 i1不等于i2
i1 -gt i2 i1大于i2
i1 -ge i2 i1大于等于i2
i1 -lt i2 i1小于i2
i1 -le i2 i1小于等于i2
3.文件判断
-r fn 文件可读
-w fn 文件可写
-x fn 文件可执行
-b fn 文件存在且是块文件
-c fn 文件存在且是字符文件
-d fn 文件存在且是目录
-e fn 文件存在(Linux一切皆文件)
-f fn 文件存在且是普通文件
-g fn 文件存在且设置组id
-G fn 文件存在且属于有效组id
-h fn 文件存在且是符号链接
-k fn 文件存在且设置sticky位
-o fn 文件存在且属于有效用户
-p fn 文件存在且是管道文件
-s fn 文件存在且大小非0
-t fn 文件描述符指定的设备是终端
fn1 -nt fn2 fn1创建日期比fn2新
fn1 -ot fn2 fn1创建日期比fn2旧
4.复杂逻辑判断在[]内
-a 与
-o 或[ $yn = y -o $yn = Y ]
! 非
5.复杂逻辑在[]外
&& 与
|| 或
6.支持正则的字符串匹配[[]]
[[ $var == regexpression ]] 变量var等于正则表达式
[[ $var =~ regexpression ]] 变量var匹配正则表达式
******if
1.expression为真(返回值为0)时执行then后面的command,then和if同行要求then前有;
if [ expression ];then
command
fi
2.expression1为真执行command1并结束,否则expression1为假expression2为真执行command2并结束,否则执行command3并结束
if [ expression1 ];then
command1
elif [ expression2 ];then
command2
else
command3
fi
******for
1.遍历list(数组,$var变量列表,$()命令替换结果集,通配符目录/home/*)
for var in list
do
command
done
2.类似C的for循环,要求双括号
for ((i=0;i<5;i++))
do
command
done
********while
expression为真执行command,command中要有改变expression的值避免陷入死循环
while expression
do
command
done
********until
until expression
do
command
done
********break
终止最内层循环,break n终止由内到外第n层循环
********continue
终止本次循环的剩余命令,继续开始下次循环
********数组
1.定义
array=(v0 v1 v2 v3...)
array[0]=v0,array[1]=v1......
array=($(command))
2.取值
${array[$i]}
3.长度
${#array[@]}
${#array[*]}
4.遍历
for i in ${array[*]}或${array[@]}
do
echo $i
done
5.删除
unset array 清除整个数组
unset array[$i] 清除单个元素
6.替换
${array[@]/s1/s2} s2替换s1,不修改原数组,如需修改需用()赋值给新数组
${array[*]/s1/s2} s2替换s1,不修改原数组,如需修改需用()赋值给新数组
7.分片
${array[@]:start:length} 截取start开始,长度length的新数组
${array[*]:start:length} 截取start开始,长度length的新数组
${array[*]:0:3}=(array[0] array[1] array[2])
********函数
1.定义
function function_name{
command
}
function_name(){
command
}
2.调用时传入的参数arg1,arg2在函数内部以$1,$2引用
function_name arg1 arg2
3.返回值
只能用return语句返回一个0-255的整数
********变量扩展
********使用技巧
1.用&&和||简化if else语句
[ $num -lt 5 ] && echo "The number is less than 5" || echo "The number is great equal 5"
2.vim中不需root权限保存编辑的文件
:w !sudo tee %
3.判断输入是y,Y,yes,YES