Shell

Shell 是一个用 C 语言编写的程序,它是用户使用 Linux 的桥梁。Shell 既是一种命令语言,又是一种程序设计语言。
Shell 是指一种应用程序,这个应用程序提供了一个界面,用户通过这个界面访问操作系统内核的服务。
Ken Thompson 的 sh 是第一种 Unix Shell,Windows Explorer 是一个典型的图形界面 Shell。
Shell 编程跟 JavaScript、php 编程一样,只要有一个能编写代码的文本编辑器和一个能解释执行的脚本解释器就可以了。
Linux 的 Shell 种类众多,常见的有:

  • Bourne Shell(/usr/bin/sh或/bin/sh)
  • Bourne Again Shell(/bin/bash)
  • C Shell(/usr/bin/csh)
  • K Shell(/usr/bin/ksh)
  • Shell for Root(/sbin/sh)

Bash,也就是 Bourne Again Shell,由于易用和免费,Bash 在日常工作中被广泛使用。同时,Bash 也是大多数Linux 系统默认的Shell。在一般情况下,人们并不区分 Bourne Shell 和 Bourne Again Shell,所以,像 #!/bin/sh,它同样也可以改为 #!/bin/bash#! 告诉系统其后路径所指定的程序即是解释此脚本文件的 Shell 程序。

运行Shell脚本

作为可执行程序

  1. chmod +x ./test.sh #使脚本具有执行权限
  2. ./test.sh #执行脚本

注意,一定要写成 ./test.sh,而不是 test.sh,运行其它二进制的程序也一样,直接写 test.sh,linux 系统会去 PATH 里寻找有没有叫 test.sh 的,而只有 /bin, /sbin, /usr/bin,/usr/sbin 等在 PATH 里,你的当前目录通常不在 PATH 里,所以写成 test.sh 是会找不到命令的,要用 ./test.sh 告诉系统说,就在当前目录找。

作为解释器参数

这种运行方式是,直接运行解释器,其参数就是 shell 脚本的文件名,如:
/bin/sh test.sh
/bin/php test.php
这种方式运行的脚本,不需要在第一行指定解释器信息,写了也没用。

Shell变量

your_name="runoob.com"

  1. 定义变量不需要$
  2. 变量名和等号之间不能有空格
  3. 命名只能使用英文字母,数字和下划线,首个字符不能以数字开头。
  4. 不能使用标点和bash关键字
  5. 使用变量要加$
  6. readonly myUrl将变量定义为只读不可改
  7. unset myName将变量删除

    字符串

    单引号

  • 字符原样输出,字符串中的变量无效
  • 单引号中不能出现单独的单引号,即使转义也不行,但可以成对出现,作为拼接使用

    双引号

  • 可以出现变量

  • 可以出现转义字符

    获取字符串长度

    1. string="abcd"
    2. echo ${#string} # 输出4

    提取子字符串

    1. string="runoob is a great site"
    2. echo ${string:1:4} # 输出unoo

    查找子字符串

    1. string="runoob is a great site"
    2. echo `expr index "$string" io` # 输出4 查找i或o的位置,哪个先出现就计算哪个

    数组

    只支持一维数组,下标从零开始

    定义数组

    1. array_name(value0 value1 value2)
    2. array_name2(
    3. value0
    4. value1
    5. value2
    6. )
    7. array[0]=value0
    8. array[1]=value1
    9. array[2]=value2

    读取数组

    ```bash valuen=${array_name[n]}

获取数组中的所有元素

valueAll=${array_name[@]}

获取数组元素个数

length=${#array_name[@]}

或者

length=${#array_name[*]}

单个元素长度

lengthn=${#array_name[n]}

  1. <a name="DY65r"></a>
  2. # 注释
  3. `#`
  4. ```bash
  5. :<<EOF
  6. 多行
  7. 注释
  8. EOF

EOF可以替换成任意字符

传参

  1. echo "文件名: $0"
  2. echo "参数1:$1"
  3. echo "参数2: $2"
  4. echo "传递到脚本的个数:$#"
  5. echo "字符串显示所有传参:$*"
  6. echo "脚本运行的当前进程ID: $$"
  7. echo "后台运行的最后一个进程ID: $!"
  8. echo "与$*相同,但是使用时加引号: $@"
  9. echo "显示Shell使用的当前选项,与set命令功能相同: $-"
  10. echo "显示最后命令的退出状态。0表示没有错误,其他任何值表明有错误: $?"

运算符

原生bash不支持简单的数学运算,但是可以通过其他命令来实现,例如 awk 和 expr,expr 最常用。
expr 是一款表达式计算工具,使用它能完成表达式的求值操作。例如,两个数相加(注意使用的是反引号 ` 而不是单引号 ‘):

  • 表达式和运算符之间要有空格,例如 2+2 是不对的,必须写成 2 + 2,这与我们熟悉的大多数编程语言不一样。
  • 完整的表达式要被 包含 ```bash

    !/bin/bash

echo ============算术运算符============= a=10 b=20

val=expr $a + $b echo $val val=expr $a - $b echo $val val=expr $a \* $b #必须加\ echo $val val=expr $b / $a echo $val val=expr $b % $a echo $val if [ $a == $b ] then echo “a=b” else echo “a!=b” fi

echo ==============关系运算符=========== if [ $a -eq $b ] then echo “a等于b” fi if [ $a -ne $b ] then echo “a不等于b” fi if [ $a -gt $b ] then echo “a大于b” fi if [ $a -lt $b ] then echo “a小于b” fi if [ $a -ge $b ] then echo “a大于等于b” fi if [ $a -le $b ] then echo “a小于等于b” fi

echo ============布尔运算符========== if [ $a != $b ] then echo “a不等于b” fi if [ $a -lt 15 -a $b -gt 15 ] then echo “a小于15 且 b大于15” fi if [ $a -lt 10 -o $b -gt 10 ] then echo “a小于10 或 b大于10” fi

echo ============逻辑运算符=========== if [[ $a -lt 100 && $b -gt 100 ]] # 这里需要两个括号 then echo “a小于100且b大于100” fi if [[ $a -lt 100 || $b -gt 100 ]] then echo “a小于100或b大于100” fi

echo ===========字符串运算============= a=”abcd” b=”efgh”

if [ $a = $b ] then echo “a等于b” else echo “a不等于b” fi if [ $a != $b ] then echo “a不等于b” fi if [ -z $a ] then echo “字符串长度为0” fi if [ -n $a ] then echo “字符串长度不为0” fi if [ $a ] then echo “字符串不为空” fi

echo =========文件测试运算符========= file=”C:/Users/ehuasag/Desktop/2.sh” if [ -r $file ] then echo “可读” fi if [ -w $file ] then echo “可写” fi if [ -x $file ] then echo “可执行” fi if [ -f $file ] then echo “是普通文件” fi if [ -d $file ] then echo “是文件夹” fi if [ -s $file ] then echo “文件不为空” fi if [ -e $file ] then echo “文件存在” fi

  1. <a name="YpYw6"></a>
  2. # echo
  3. <a name="UfxnL"></a>
  4. ## 普通字符串
  5. `echo "It is a test"`<br />`echo It is a test`
  6. <a name="DPpvy"></a>
  7. ## 转义字符串
  8. `echo "\"It is a test\""`
  9. <a name="inHlH"></a>
  10. ## 显示换行
  11. `echo -e "OK! \n" # -e开启转义`<br />`echo "Test"`<br />结果:<br />OK!
  12. Test
  13. <a name="bvfVW"></a>
  14. ## 显示不换行
  15. `echo -e "OK! \c" # \c 不换行`<br />`echo "Test"`<br />结果:<br />OK!Test
  16. <a name="MgtWK"></a>
  17. ## 字符原样输出
  18. `echo '$name\"'` 单引号不转义也不取变量
  19. <a name="HnWmV"></a>
  20. ## 显示命令执行结果
  21. `echo `date`` 返回当下日期
  22. <a name="tsKXy"></a>
  23. # test命令
  24. 用于检测某个条件是否成立,可以进行数值、字符、文件测试
  25. <a name="DFQ9L"></a>
  26. ## 数值测试
  27. `-eq等于 -ne不等于 -gt大于 -ge大于等于 -lt小于 -le小于等于`
  28. ```bash
  29. if test $[num1] -eq $[num2]
  30. then
  31. echo "相等"
  32. fi

[]中执行基本的算数运算

  1. a=5
  2. b=6
  3. result=$[a+b] # 两边不能有空格
  4. echo "$result"

字符串测试

=等于 !=不等于 -z字符串长度为零 -n字符串长度不为0

  1. if test $num1 = $num2
  2. then
  3. echo "字符串相同"
  4. fi

文件测试

  1. cd /bin
  2. if test -e ./bash
  3. then
  4. echo "文件存在"
  5. else
  6. echo "文件不存在"
  7. fi

流程控制

if…else…fi

  1. if condition
  2. then
  3. command1
  4. command2
  5. ...
  6. elif condition2
  7. then
  8. commandn
  9. else
  10. command
  11. fi

for循环

  1. for var in item1 item2 ... itemN
  2. do
  3. command1
  4. command2
  5. done

for var in item1 item2; do command1; command2; done;

函数

  1. #!/bin/bash
  2. echo =========== 函数定义 =============
  3. #也可以定义为 function fun()
  4. demoFunc(){
  5. # return省略则返回最后一条命令
  6. echo "shell function"
  7. }
  8. demoFunc
  9. echo ============ 函数返回值 =============
  10. funWithReturn(){
  11. echo "first number:"
  12. read num1
  13. echo "second number:"
  14. read num2
  15. echo "num1 + num2 ="
  16. return $(($num1+$num2))
  17. }
  18. # 返回值在调用该函数后立即通过?来获取,并保存,且?只对上一条指令负责。否则将得到0
  19. funWithReturn
  20. echo "$?"
  21. echo ============ 函数参数 ===============
  22. funWithParam(){
  23. echo "first param: $1"
  24. echo "second param: $2"
  25. echo "tenth param: ${10}" #超过9必须带{}
  26. echo "total number of params are: $#"
  27. echo "output all params as a string: $*"
  28. }
  29. funWithParam 1 2 3 4 5 6 7 8 9 10