Linux学习之Shell

GitHub特殊的查找资源小技巧

常用前缀后缀

- 找百科大全 awesome xxx
- 找例子 xxx sample
- 找空项目架子 xxx starter / xxx boilerplate
- 找教程 xxx tutorial

正文

在vim编辑器中显示行号,在命令中输入:set nu

单行注释 #
多行注释

1
2
3
:<<!
多行注释
!

后台运行脚本 ./myShell.sh &

位置参数 $* 和 $@ 都是将后面的参数当作整体,但是在for中有区别,$*会返回一个整体语句 执行一次;$@会遍历执行多次 打印多行结果

创建shell脚本

  • 创建shell文件。vim myShell.sh
  • 写代码。第一行通常#!/bin/bash 接下来再输入命令 比如:echo "hello,world!"
  • ll命令 可以看到myShell文件
  • 执行
    • 方式一:添加权限 chmod 744 myShell.sh 给所有者一个x权限 ls命令 看到绿色的myShell.sh 输入./myShell.sh 得到输出hello,world!
    • 方式二:sh执行 sh ./myShell.sh 得到输出hello,world!

shell变量

变量分为:系统变量和用户自定义变量

  • 系统变量:$HOME $PWD $USER 等

    输出系统变量:echo "PATH=$PATH"

    或者用`set | more` 命令分页显示
  • 自定义变量

    变量名称一般习惯为大写,等号两侧不能有空格

    1
    2
    3
    4
    A = 100
    echo "A=$A"
    unset A
    echo "A=$A"

    readonly 变量 不能 unset

    • 将命令返回值赋给变量
      • A=``反引号,运行里面的命令,并把结果返回给变量A
      • A=$()等价于反引号
  • 基本语法:

    • export 变量名=变量值 (将shell变量输出为环境变量)
    • source 配置文件 (让修改后的配置信息立即生效)
    • echo $变量名 (查询环境变量的值)
  • 创建脚本程序

    vim position.sh

    echo “$0 $1 $2”

    echo “$*” //30 6

    echo “$@”//30 6

    echo “参数个数=$#” //参数个数2

    chmod 744 position.sh

    ./position.sh 30 6

    //得到输出 ./position.sh 30 60

  • 预定义变量

    $$ 当前进程号

    $! 最后的进程号

    $? 执行的值

shell运算符

  • 基本语法

    “$[运算式]”

    expr m + n //注意expr运算符间要有空格,用反引号括起来

shell控制语句

  • 条件控制

    • [ condition ] (注意codition前后要有空格)

    • codition非空返回true

    • [ codition ]&& echo Ok || echo notok 条件满足,执行后面的语句

    • 条件判断

      • 两个整数的比较

        = 字符串比较

        -lt 小于

        -le 小于等于

        -eq 等于

        -gt 大于

        -ge 大于等于

        -ne 不等于

      • 文件权限判断

        -x 有执行权限 [ -x 文件 ]

      • 文件类型

        -f 文件存在并且是一个常规文件

        -e 文件存在

        -d 文件存在并使一个目录

    • 案例

      • 案例一:“OK”是否等于”OK”

        1
        2
        3
        4
        if [ "ok" = "ok" ]
        then
        echo "equal"
        fi
      • 案例二:23是否大于等于22

        1
        2
        3
        4
        5
        6
        7
        if [23 -gt 22]
        then
        echo "大于"
        elif [23 -eq 22]
        then
        echo "等于"
        fi
  • case语句

    • 案例:当命令行参数是1时,输出”周一”,是2时,就输出“周二”,其他情况输出”other“

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      case $1 in
      "1")
      echo "周一"
      ;;
      "2")
      echo "周二"
      ;;
      *)
      echo "other"
      ;;
      esac
  • for循环

    • 案例

      • 案例一:打印命令行输入的参数

        1
        2
        3
        4
        for i in "$@"
        do
        echo "the num is $i"
        done

        遍历的是$@

      • 案例二:从1加到100

        1
        2
        3
        4
        5
        6
        SUM=0
        for((i=1;i<=100;i++))
        do
        SUM=$[$SUM+$i]
        done
        echo "sum=$SUM"
  • while循环

    while后面要有空格

    • 案例一:从命令行输入一个数n,累加1+2+…+n的值

      1
      2
      3
      4
      5
      6
      7
      8
      SUM=0
      i=0
      while [ $i -le $1 ]
      do
      SUM=$[$SUM+$i]
      i=$[$i+1]
      done
      echo "sum=$SUM"

shell读取控制台输入

前面通过位置参数来读取的是通过命令行的数据

  • 基本语法

    read 选项 参数

    选项:

    -p 提示信息

    -t 时间范围内,等待时间

    参数:

    变量:指定读取值的变量名

    • 案例

      • 案例一:读取控制台输入一个num值

        1
        2
        read -p "请输入一个数num=" NUM
        echo "你输入的是num=$NUM"
- 案例二:读取控制台输入一个num,在10秒内输入

  
1
2
read -t 10 -p "请输入一个数num=" NUM
echo "你输入的值是num=$NUM"

shell函数

  • 系统函数

    • diranme 得到路径
    • basename 得到文件名
  • 自定义函数

    • 基本语法

      定义语法见案例,调用直接写函数名funname[值]

      shell函数定义的时候不需要写形参

    • 案例

      • 案例一:计算两个参数的和

        1
        2
        3
        4
        5
        6
        7
        8
        9
        function sum(){
        SUM=$[$n1+$n2]
        echo "和是=$SUM"
        }
        read -p "请输入第一个数n1" n1
        read -p "请输入第二个数n2" n2

        #调用
        sum $n1 $n2

实验:

设计一个程序cuts,由标准输入设备上读入数据、获取由第一个参数n和第二个参数m所限定范围的字符串,其中n和n都是整数。即从输入的字符串中提取出n和m之间限定的所有字符,(要求必须使用变量引用表达式和基本的过程控制语句)。例如命令输入:

$cuts 3 5

用户输入 abcdefg,则程序输出cde

脚本:(其实直接调用现成的截取字符串的方法就可以,老师不让)

vim cuts.sh

chmod 744 cuts.sh

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
read -p "请输入字符串str:" STR
n=$1
m=$2
RESULT=""
#echo $n $m $STR

#字符串检验
if [ -z $STR ]
then
echo "The string '$STR' is empty."
elif [ $STR ]
then
LEN=${#STR} # 或者LEN=`expr length ${STR}`
fi
#echo $LEN

#n,m合法性判断
if [ $n -lt 1]
then
n=1
elif [ $n -gt $LEN ]
then
m=$LEN
fi

if [ $m -lt 1]
then
m=1
elif [ $m -gt $LEN]
then
m=$LEN
fi

if [ $m -lt $n ]
then
echo "error 请重新输入n,m"
fi

#截取操作
function getStr(){
for((i=$n;i<=$m;i++))
do
RESULT=$RESULT${STR:$[$i-1]:1}
done
echo $RESULT
}
getStr $n $m $STR