Shell编程基础

注:

  1. 本文说的都是bash(Bourne Again Shell),是sh(Bourne Shell)的扩展
  2. 扩展名不会影响脚本执行,见名知意就行,一般情况下扩展名是sh
  3. Shell注释:以 # 开头的行就是注释,会被解释器忽略,但是sh里面没有多行注释,只能每行加一个#
  4. 从Ubuntu 6.10开始,默认使用dash,需要手动执行命令将dash改为bash, 至于bash和dash的区别,详见https://blog.csdn.net/hshl1214/article/details/51122663
    1. 命令:sudo dpkg-reconfigure dash
    2. 然后在出现的页面中选择NO,之后就可以正常运行脚本了

运行Shell脚本的两种方法:

  1. 作为可执行程序

    1. 让脚本文件具有可执行权限
      chmod +x file 加上执行权限,否则会提示无执行权限。
    2. ./文件名
    3. 注意,例要执行test.sh脚本,一定要写成 ./test.sh,而不是 test.sh,运行其它二进制的程序也一样,直接写 test.sh,linux 系统会去 PATH 里寻找有没有叫 test.sh 的,而只有 /bin, /sbin, /usr/bin,/usr/sbin 等在 PATH 里,你的当前目录通常不在 PATH 里,所以写成 test.sh 是会找不到命令的,要用 ./test.sh 告诉系统说,就在当前目录找。
  2. 作为解释器参数

    /bin/sh test.sh
    
    /bin/php test.php
    

Shell变量

  1. 定义变量的时,变量前不加美元符号,变量名和等号之间不能有空格

    name="小明"
    
  2. 使用语句给变量赋值

    for file in `ls /etc`
    for file in $(ls /etc)
    
  3. 使用变量
    使用一个定义过的变量,只要在变量名前加 $ 符号即可
    第二次给变量赋值的时候也不能加 $
    变量名外加上花括号能够帮助识别器识别变量的边界,推荐给所有变量加上花括号

  4. 只读变量 readonly

    myUrl="http://www.w3cschool.cc"
    readonly myUrl
    
  5. 删除变量 unset

    unset 变量名
    
  6. Shell字符串
    字符串可以用单引号,也可以使用双引号,也可以不用引号。

    1. 获取字符串长度

      string="abcd"
      echo ${#string} #输出 4
      
    2. 提取子字符串

      #从第2个字符开始截取4个字符
      string="runoob is a great site"
      echo ${string:1:4} # 输出 unoo
      
    3. 查找字符串

      string="runoob is a great company"
      echo `expr index "$string" is`  # 输出 8
      
  7. Shell数组
    Shell只支持一维数组

    1. 定义数组
      数组名=(值1 值2 值3 ……)

      array_name[0]=value0
      array_name[1]=value1
      array_name[n]=valuen

    2. 读取数组
      ${数组名[下标]}
      使用@符号可以获取数组中的所有元素
      例:echo ${array_name[@]}

    3. 获取数组的长度

      length=${#array_name[@]}
      length=${#array_name[*]}
      

Shell传递参数

请参考:菜鸟教程参数传递
在执行脚本的时候可以向脚本传递参数,脚本获取参数的格式为:$n

Shell基本运算符

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

    #!/bin/bash
    
    val=`expr 2 + 2`
    echo "两数之和为 : $val"
    
  2. 注意:条件表达式要放在方括号之间,并且要有空格,例如: [\(a==\)b] 是错误的,必须写成 [ $a == $b ]。

  3. == != 用来比较两个数字

Shell test命令

请参考:菜鸟教程 test命令

Shell流程控制

  1. 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
    
  3. while 循环

    while condition
    do
        command
    done
    
  4. 无限循环

    #无限循环语法格式:
    while :
    do
        command
    done
    #或者
    while true
    do
        command
    done
    #或者
    for (( ; ; ))
    
  5. util 循环
    until循环执行一系列命令直至条件为真时停止。

    until condition
    do
        command
    done
    
  6. case
    例:

    echo '输入 1 到 4 之间的数字:'
    echo '你输入的数字为:'
    read aNum
    case $aNum in
        1)  echo '你选择了 1'
        ;;
        2)  echo '你选择了 2'
        ;;
        3)  echo '你选择了 3'
        ;;
        4)  echo '你选择了 4'
        ;;
        *)  echo '你没有输入 1 到 4 之间的数字'
        ;;
    esac
    
  7. 跳出循环

    1. break
    2. continue

Shell函数

  1. 函数定义

    [ function ] funname [()]
    
    {
        action;
        [return int;]
    }
    
  2. 函数参数

    funWithParam(){
        echo "第一个参数为 $1 !"
        echo "第二个参数为 $2 !"
        echo "第十个参数为 $10 !"
        echo "第十个参数为 ${10} !"
        echo "第十一个参数为 ${11} !"
        echo "参数总数有 $# 个!"
        echo "作为一个字符串输出所有参数 $* !"
    }
    funWithParam 1 2 3 4 5 6 7 8 9 34 73
    

Shell 输入/输出重定向

请参考:菜鸟教程 Shell 输入/输出重定向

1. 常见符号

	```
	>  >>  <  <<
	``` 

2. 输出重定向
	
	```
	command1 > file1
	```
	注意:任何file1内的已经存在的内容将被新内容替代。如果要将新内容添加在文件末尾,请使用>>操作符
3. 输入重定向	

	```
	command1 < file1
	```
4. Here Document
	Here Document 是 Shell 中的一种特殊的重定向方式,用来将输入重定向到一个交互式 Shell 脚本或程序。
	
	```
	command << delimiter
    document
	delimiter
	```
注意:结尾的delimiter前后一定要顶格写,前面及后面都不能有任何字符  
例:

	```
	cat << EOF
	欢迎来到
	菜鸟教程
	www.runoob.com
	EOF
	```

5. /dev/nul是一个特殊的文件,写入到它的内容都会被丢弃,将命令的输出重定向到它会起到“禁止输出”的效果
	
	```
	$ command > /dev/null
	```

Shell 文件包含

. filename   # 注意点号(.)和文件名中间有一空格
或
source filename

例:
有两个脚本,内容如下
test1.sh

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

url="http://www.runoob.com"

test2.sh

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

#使用 . 号来引用test1.sh 文件
. ./test1.sh

# 或者使用以下包含文件代码
# source ./test1.sh

echo "菜鸟教程官网地址:$url"

然后执行test2.sh

$ chmod +x test2.sh 
$ ./test2.sh  
#结果:菜鸟教程官网地址:http://www.runoob.com

注:本文参考:菜鸟教程文档
如需转载请注明出处:http://www.cnblogs.com/zhuchenglin/p/8743180.html

posted @ 2018-04-08 09:59  lin_zone  阅读(466)  评论(0编辑  收藏