if判断符前后加空格
bash中使用if
判断,需要注意判断符前后加空格。
a="abc"
if [ $a == "x" ];then # 判断符号前后有空格!
echo "$a a==x"
else
echo "$a a!=x"
fi
b="abc"
if [ $b=="x" ];then # 判断符号前后没有空格!
echo "$b b==x"
else
echo "$b b!=x"
fi
a="a"
b="b"
if [ $a == "a" ] && [ $b == "b" ];then
echo "right"
fi
执行结果:
abc a!=x # 判断输出正确
abc b==x # 判断输出错误!!!
附上《鸟哥的Linux私房菜》网页版截图:
截图来源:http://cn.linux.vbird.org/linux_basic/0340bashshell-scripts.php#test_2
常用Linux索引:http://cn.linux.vbird.org/linux_basic/1010index.php
shell定义函数
一个简单的示例,判定两个字符是否相等,相等则返回这个字符,不相等则退出
如果return是字符,使用return
出现报错:numeric argument required
。如果要用字符输出使用echo
。
# filename: tst.sh
function demo1(){
test1="Test str1"
test2="Test str2"
if [ "${test1}" == "${test2}" ]; then
# return ${test1} # 报错
# echo ${test1} # 输出 ${test1} 的值
return 9 # 返回 9
else
exit 1
fi
}
demo1
echo $?
定义函数的exit,在当前shell中echo的$?
还是0,在执行完tst.sh后,再echo $?,会输出1。
while循环重定义全局变量
path_all=""
cat $1 | while read line
do
if [ "$path_all" == "" ];then
path_all=$line
else
path_all=$path_all,$line
fi
done
echo $path_all > $one_file
https://www.jb51.net/article/142311.htm
管道符与重定向的区别
cat $file_name | while read line
do
#deal with line
done
while read line
do
#deal with line
done < $file_name
while循环内部变量作用域
参考:https://blog.csdn.net/ls4034/article/details/76005929
变量作用域问题:while
循环时使用重定向<
,sum变量作用于全局
sum=0
while read myf
do
if [ -f ${myf} ]; then
((sum+=1))
fi
done < files.lst
echo $sum # 输出的sum是检查存在文件个数
但如果while
循环时使用管道符|
,循环内部的变量则只能在局部起作用。
sum=0
cat files.lst | while read myf
do
if [ -f ${myf} ]; then
((sum+=1))
fi
done
echo $sum # 输出还是0,while循环累加的sum只在内部使用
定时检查文件
需求:当某些文件存在时,执行一些命令。
思路:设定每30min执行一次检查某些文件是否存在,重复30次检查,然后执行某个命令,执行后退出命令。
实现:
allc=`wc -l files.lst | awk '{print $1}'` # files.lst 中每行一个文件路径, 要检查的文件数
for i in $(seq 1 30); do
echo "time ${i}: [`date`]"
sum=0
while read myf
do
if [ -f ${myf} ]; then
((sum+=1))
fi
done < files.lst
echo ${sum} ${allc}
if [ "${sum}" == "${allc}" ]; then
# 文件都存在时,执行自定义命令:
cat ./sample.lst | xargs -I {} echo "qsub -wd `pwd`/{} -l vf=20G -l p=16 -l h=host -V -S /bin/sh `pwd`/{}/{}.sh" | bash # 比如执行投递的脚本在`pwd`/${sample}/${sample}.sh
break
else
echo "bam not done: ${sum} (<${allc})"
fi
sleep 30m
done
使用数组
数组定义和增加元素
# 初始化
unset arr
# cnt=0
cat tst.lst | while read x
do
for n in ${arr[@]}
do
if [ $n == ${x} ]; then
echo "$n==${x} continue"
continue
fi
done
# arr[${cnt}]=${x}
arr+=("${x}") # arr中增加元素
echo ${arr}
done
整数运算
参考:https://zhuanlan.zhihu.com/p/197719268
1.(()):用于整数运算的常用运算符
2.let:用于整数运算
3.expr:也可用于整数运算,还有其他额外功能
4.bc:计算机程序,适用整数记小数运算
5.$[]:用于整数运算
6.awk:可以用于整数运算,也可用于小数运算
7.declare:定义变量值和属性
运算符:
1.+、-:加减
2.*、/、%:乘、除、取余
3.**:幂运算
4.++、–:增加记减少
5.!、&&、||:取反,并且,或
6.<,<=,>,=> :比较符号:小于,小于等于,大于,大于等于
7.==、!=、=:比较符号:相等,不相等
8.<<,>> :向左移,向右移
9.+=、-=:赋值运算,+=相当于i=i+1,-+相当于i=i-1
sum=0
let sum+=1
((sum+=1))
sum=`expr $sum + 1`
sum=`sum=100;echo $sum+1 | bc`
sum=$[${sum}+1]
echo | awk -v sum=${sum} '{print sum+1}'
echo "$sum 1" | awk '{print $1+$2}'
declare -i sum=10; sum+=1; echo ${sum}