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判断的[]里面,变量和比较符绝对要空格隔开,和方框左右两边也绝对有空格。。。。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 基础命令 主要的命令和快捷键 Linux系统命令由三部分组成:cmd + [options]+[operation...
    485b1aca799e阅读 1,142评论 0 0
  • FreeCodeCamp - Basic JavaScript 写在前面: 我曾经在进谷前刷过这一套题,不过当时只...
    付林恒阅读 16,537评论 5 28
  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 31,874评论 18 399
  • 有一种心理很卑鄙。 我不爱你,但是你既然说了爱我,你就要从一而终,敢中途跑票那就是你不够专情你朝三暮四。 但我可以...
    苏噼里阅读 259评论 2 3
  • 文/新晴 我喜欢,喜欢有这样一个人喜欢着我喜欢的,有着我喜欢的心,做着我喜欢的事,说着我喜欢的话,成为我喜欢的人。...
    雪霁新晴阅读 363评论 0 2