【Linux】shell中if判断/while循环/数组/整数运算

本文介绍了Bash Shell脚本中的关键概念,包括if判断语句的空格规范,函数定义及返回值,while循环中的变量作用域,以及定时检查文件的方法。此外,还讲解了数组的使用和整数运算,并提供了相关示例代码。通过这些内容,读者可以更好地理解和掌握Shell脚本编程。
摘要由CSDN通过智能技术生成

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}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值