shell编程学习笔记(也许会不定期更新

最近部门考核,考核内容是写一个UML的编译脚本,虽然并不是很难,但他不布置这些东西我想我也不会去学,因为不知道很多东西。。。所以,就算是一个很水的部门(不是指一些人的实力水,而是其他方面-、-),也想争取留下来。。。不想离一些人越来越远了……
笔记都是摘抄自菜鸟编程

运算


1. 关系运算符

关系运算符只支持数字,不支持字符串,除非字符串的值是数字。

if [ $a -eq $b ]
then
   echo "$a -eq $b : a 等于 b"
else
   echo "$a -eq $b: a 不等于 b"
fi

巧记:


NQ 就是 NOT EQUAL不等于 

GT 就是 GREATER THAN大于  

LT 就是 LESS THAN小于 

GE 就是 GREATER THAN OR EQUAL 大于等于 

LE 就是 LESS THAN OR EQUAL 小于等于

2. 布尔运算符

! 非运算,表达式为 true 则返回 false,否则返回 true。 [ ! false ] 返回 true。
-o 或运算,有一个表达式为 true 则返回 true。 [ $a -lt 20 -o $b -gt 100 ] 返回 true。
-a 与运算,两个表达式都为 true 才返回 true。 [ $a -lt 20 -a $b -gt 100 ] 返回 false。
a=10
b=20

if [ $a != $b ]
then
   echo "$a != $b : a 不等于 b"
else
   echo "$a != $b: a 等于 b"
fi

3. 逻辑运算符

if [[ $a -lt 100 && $b -gt 100 ]]
then
   echo "返回 true"
else
   echo "返回 false"
fi

4. test 命令

num1=100
num2=100
if test $[num1] -eq $[num2]
then
    echo '两个数相等!'
else
    echo '两个数不相等!'
fi

注意,之前的比较全都是被[]括起来了,这里用test替换。

流程控制

1. if

if condition
then
    command1 
    command2
    ...
    commandN 
fi
if [ $(ps -ef | grep -c "ssh") -gt 1 ]; then echo "true"; fi

if else

if condition
then
    command1 
    command2
    ...
    commandN
else
    command
fi

if else-if else

if condition1
then
    command1
elif condition2 
then 
    command2
else
    commandN
fi

2. for循环

for var in item1 item2 ... itemN
do
    command1
    command2
    ...
    commandN
done
for var in item1 item2 ... itemN; do command1; command2… done;

3. while

while condition
do
    command
done

4. until 循环

until condition
do
    command
done

5. case

case 值 in
模式1)
    command1
    command2
    ...
    commandN
    ;;
模式2)
    command1
    command2
    ...
    commandN
    ;;
esac

6. 跳出循环

break,continue,esac

#!/bin/bash
while :
do
    echo -n "输入 1 到 5 之间的数字:"
    read aNum
    case $aNum in
        1|2|3|4|5) echo "你输入的数字为 $aNum!"
        ;;
        *) echo "你输入的数字不是 1 到 5 之间的! 游戏结束"
            break
        ;;
    esac
done
#!/bin/bash
while :
do
    echo -n "输入 1 到 5 之间的数字: "
    read aNum
    case $aNum in
        1|2|3|4|5) echo "你输入的数字为 $aNum!"
        ;;
        *) echo "你输入的数字不是 1 到 5 之间的!"
            continue
            echo "游戏结束"
        ;;
    esac
done

函数

[ function ] funname [()]

{

    action;

    [return int;]

}
#!/bin/bash
# author:菜鸟教程
# url:www.runoob.com

funWithParam(){
    echo "第一个参数为 $1 !"
    echo "第二个参数为 $2 !"
    echo "第十个参数为 $10 !"
    
    #注意,$10 不能获取第十个参数,获取第十个参数需要${10}。当n>=10时,需要使用${n}来获取参数。
    
    echo "第十个参数为 ${10} !"
    echo "第十一个参数为 ${11} !"
    echo "参数总数有 $# 个!"
    echo "作为一个字符串输出所有参数 $* !"
}
funWithParam 1 2 3 4 5 6 7 8 9 34 73

输出:

第一个参数为 1 !
第二个参数为 2 !
第十个参数为 10 !
第十个参数为 34 !  
第十一个参数为 73 !
参数总数有 11 个!
作为一个字符串输出所有参数 1 2 3 4 5 6 7 8 9 34 73 !

遇到的贼坑

1. 把命令输出赋值给变量

参考:https://gxnotes.com/article/30492.html

pwd=`pwd`
pwd=$(pwd)

等号后面绝对绝对不能有空格!

2. if判断格式

a=1
b=2
if [ $a < $b ]
then
    echo "hhh"
fi

我的天,这个格式比python还奇葩。if判断的[]里面,变量和比较符绝对要空格隔开,和方框左右两边也绝对有空格。。。。

你可能感兴趣的:(shell编程学习笔记(也许会不定期更新)