linux shell 编程


linux shell 编程

  • 最近在用Linux倒腾一些东西,发现好多东西都可以使用写成一个shell脚本来简化,所以学习一下shell.

示例

1
2
#! /bin/bash
echo "hello,world!"

shell 变量

1
2
3
4
5
6
7
8
9
10
11
12
13
//注意不能加空格
myname="cuiwenyao"
echo ${myname}
hername="qinmengyao"
echo ${myname} "love" ${hername}
//字符串拼接
string="${myname} "love" ${hername}"
echo string
//获取长度
echo ${#myname}
//提取字串
string=${myname:1:2}
echo string

数组

  • bash 只支持一维数组。
  • shell用小括号表示数组,数组元素用空格分开。
1
2
3
4
5
6
7
8
9
10
11
myarray=(1 2 3 4)
echo ${myarray[0]}
myarray[0]=10
echo ${myarray[0]}
//获取所有元素
echo ${myarray[@]}
//获取数组长度
echo ${#myarray[@]}
echo ${#myarray[*]}
//获取单个元素的长度
echo ${#myarray[0]}

运算符

运算符 说明 举例
+ 加法 `expr $a + $b`
- 减法 `expr $a - $b`
* 乘法 `expr $a * $b`
/ 除法 `expr $a / $b`
% 取余 `expr $a % $b`
= 赋值 `expr $a = $b`
== 相等。 `expr $a == $b`
!= 不相等。 `expr $a != $b`
1
2
3
4
5
6
7
8
9
10
11
12
13
#! /bin/bash
a=10
b=20
r=`expr ${a} + ${b}`
echo ${r}
r=`expr ${a} - ${b}`
echo ${r}
r=`expr ${a} \* ${b}`
echo ${r}
r=`expr ${a} / ${b}`
echo ${r}
r=`expr ${a} % ${b}`
echo ${r}
关系运算符
运算符 说明 举例
-eq 相等 [${a} -eq ${b}]
-ne 不相等 [${a} -ne ${b}]
-gt 大于 [${a} -gt ${b}]
-lt 小于 [${a} -lt ${b}]
-ge 大于等于 [${a} -ge ${b}]
-le 小于等于 [${a} -le ${b}]
! [!false]
-o [${a} -lt 20 -o ${b} -gt 100]
-a [${a} -lt 20 -a ${b} -gt 100]
|| [[${a} -lt 20 || ${b} -gt 100]]
&& [[${a} -lt 20 && ${b} -gt 100]]
字符串运算符
运算符 说明 举例
= 检测两个字符串是否相等,相等返回 true。 [ $a = $b ] 返回 false。
!= 检测两个字符串是否相等,不相等返回 true。 [ $a != $b ] 返回 true。
-z 检测字符串长度是否为0,为0返回 true。 [ -z $a ] 返回 false。
-n 检测字符串长度是否为0,不为0返回 true。 [ -n $a ] 返回 true。
str 检测字符串是否为空,不为空返回 true。 [ $a ] 返回 true。
文件测试运算符
运算符 说明 举例
-b 是否是块设备文件 [ -b $file ]
-c 是否是字符设备文件 [ -c $file ]
-d 是否是目录 [ -d $file ]
-f 是否是普通文件(既不是目录,也不是设备文件) [ -f $file ]
-g 是否设置了 SGID 位 [ -g $file ]
-k 是否设置了粘着位 [ -k $file ]
-p 是否是有名管道 [ -p $file ]
-u 是否设置了 SUID 位 [ -u $file ]
-r 文件是否可读 [ -r $file ]
-w 是否可写 [ -w $file ]
-x 是否可执行 [ -x $file ]
-s 是否为空 [ -s $file ]
-e 检测文件(包括目录)是否存在 [ -e $file ]

流程控制

  • shell的流程不可为空。
    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
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    #! /bin/bash
    num1=$[2*4]
    num2=$[1+5]
    if test $[num1] -eq 8
    then
    echo '两个数字相等!'
    elif test $[num1] -lt $[num2]
    then
    echo '两个数字不相等!'
    else
    echo 'this is else'
    fi

    array=(1 2 3 4)
    for var in ${array[@]}
    do
    echo ${var}
    done

    echo "while 测试 1"
    var=5
    while (( ${var}<=10 ))
    do
    echo ${var}
    var=`expr ${var} + 1`
    done

    echo "while 测试 2"
    var=5
    while test ${var} -ne 10
    do
    echo ${var}
    let "var++"
    done

    echo "while 测试 3"
    echo "按下ctrl+d退出"
    echo "输入a,b的值,我会帮你输出和"
    while read a b
    do
    if test ${a} -eq 10
    then
    echo "退出"
    break
    fi
    echo `expr ${a} + ${b}`
    done

    echo "until 测试 1"
    var=0
    until test ${var} -eq 10
    do
    echo ${var}
    var=`expr ${var} + 1`
    echo ${var}
    let "var++"
    done

    echo "case 测试 1"
    var=1
    case ${var} in
    1)
    echo "1"
    ;;
    2)
    echo "2"
    ;;
    esac

shell 函数

1
2
3
4
5
6
7
8
9
10
11
12
#!/bin/bash
fun(){
echo "这个函数会对三个数字进行相加运算..."
echo "输入第一个数字: "
read aNum
echo "输入第二个数字: "
read anotherNum
echo "两个数字分别为 $aNum$anotherNum !"
return $((${aNum}+${anotherNum}+${1}))
}
fun 10
echo "三个数字之和为 $? !"
参数处理 说明
$1 显示第一个参数
$# 传递到脚本的参数个数
$* 以一个单字符串显示所有向脚本传递的参数
$$ 脚本运行的当前进程ID号
$! 后台运行的最后一个进程的ID号
$@ 与$*相同,但是使用时加引号,并在引号中返回每个参数。
$- 显示Shell使用的当前选项,与set命令功能相同。
$? 显示最后命令的退出状态。0表示没有错误,其他任何值表明有错误。

文件包含

1
2
. test.sh
source test.sh

文章作者: 崔文耀
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 崔文耀 !
  目录