• Shell编程


    Shell编程

     

    本来打算寒假回家好好学习Linux的,为以后学习嵌入式打好基础的!回家之后的学习效率非常低,之前为了搭建Linux环境,折腾了很长时间,学到现在也就勉强才把Shell编程学完了!今天就把自己学习的相关知识点总结整理一下!

    个人感觉shell程序跟windows下的批处理文件有点像,就是将一些系统命令写进一个可执行文件中,然后执行。shell程序的语法跟C语言也很相似,所以有了C语言的基础,对shell程序的理解上有很大的帮助!

    一.shell基础

    1.shell是一个作为用户与linux系统之间接口的程序;

    2.重定向输出

    ls –l > lsoutput.txt     将ls -l输出的内容写到lsoutput.txt文件中。

    ps >>lsoutput.txt      将输出的内容追加到lsoutput.txt文件的末尾

    3.重定向输入

    more <killout.txt 将killout.txt中的内容作为more命令的参数

    4.管道:在linux下通过管道连接的进程可以同时进行,并且随着数据流在他们之间传递可以自动的协调。

    ps | sort | > jingcheng.txt

    5.运行shell程序有两种方式:

    调用shell,将脚本文件名作为shell的参数; /bin/sh first.sh

    将脚本文件设置为可执行; chmod +x first.sh first.sh

    二.shell语法

    1.变量

    所有变量都是看做字符串并以字符串来存储,shell和一些工具程序会在需要的时候将字符串转化成相应的数值。Linux是一个区分大小写的系统。如果字符串里包含空格,就应该将其用引号括起来。*是字符串匹配字符,?是单个字符匹配字符。

    var=hello world
    echo $var hello
    var=”hello world”
    echo $var hello world
    echo “$var” hello world
    echo ‘$var’ var

    2.环境变量

    当一个shell程序开始执行时,一些变量会根据环境变量中的设置的值来进行初始化。主要的环境变量有

    $PATH       以冒号隔开用来搜索命令的目录列表

    $0             shell脚本的名字

    $#            传递脚本参数个数

    $$             shell 脚本的进程号,通常用他来生成临时文件 /tmp/tmpfile_$$

    3.参数变量

    如果脚本程序带有参数,一些额外的变量就回创建。即是没有传递任何参数,环境变量$#也依然存在,只不过值是0

    $* 打印所有参数,并按照环境变量IFS第一个字符来分隔参数

    $@ 将所有参数打印出来,并且不会挤在一起

    $1,$2…分别代表第一个,第二个参数

    set foo bar foo
    echo “$@” foo bar foo
    echo “$1” foo
    echo “$2” bar

    4.条件

    if test –f fred.c if [ –f fred.c ]; then
    then …
    .. fi
    fi

    文件条件测试:

    -f     文件是普通文件即为真

    -d     文件是目录即为真

    5.控制结构,这部分很好理解,类似与C语言中的语法

    if语句

    if condition
    then
      statement
    else
      statement
    fi

    elif语句相当于嵌套if语句,等价于else if

    注意

    if [$var =”yes”]; then 这里判断等于用=,不是C语言中的==,注意!!

    $var”比$var更安全,因为万一$var 的值为空的话,在判断$var=”yes”是就会出现错误,加上引号就不会出现这种问题了。

    for循环

    for var in values  
    do                                                            

    done
    for var in bar fud 43
    do 
      echo $var
    done

    while循环

    while condition do
    statements
    done
    until 语句
    until conditions 条件为假时执行
    do
    statements
    done

    case语句

    复制代码
    case “$var” in 
     y) echo ”yes”;;
     yes) echo “yes”;;
     n) echo “no”;;
     no) echo “no”;; 
     *) echo ”please input again”
    esac
    复制代码
    case “$var” in 
      yes | y)  echo ”yes”;;
      no | n)   echo “no”;; 
      *)       echo  ”please input again”;;
    esac 

    有时候还会采取这样的 [Yy][Ee][Ss] 这样的形式来匹配6种可能的输入形式,保证输入任何形式都有相应的处理。

    命令列表,有时候可能需要将几条命令连接成一个序列。

    and列表 条件1&&条件2&&条件3…

    or列表 条件1 || 条件2 || 条件3…

    6.函数

    函数定义和C语言的形式类似

    函数调用直接用函数名,后面跟上参数,不需要用括号。

    当一个函数被调用时,脚本程序的位置参数($*,$@,$#,$1,$2..)会被替换成函数的参数,当函数执行完之后就回还原原来的值。

    复制代码
    name()
    {
    echo “you your name is $*” 这里就表明这个函数需要参数了
    echo “your first name is $1
    echo “your last name is $2
    }
    echo “please input your name”
    read name
    name “$name”
    exit 0
    复制代码

    三.命令

    命令分为两种,一种是在命令提示符下执行的普通命令,成为外部命令;另一种是内部命令,在shell内部实现的,不能作为外部程序被调用。内部命令执行效率更高。

    1.break命令,和C语言中一样,只跳出一层循环,这里不多讲了。

    2.:命令,相当与一个空命令,可以看作是true,但是执行比true快。

    3.continue命令,跳到下一次循环继续执行,也和C语言中一样。

    4.echo命令,可以使用echo –n 来清除最后的换行符。

    5.eval命令

    foo =10
    x=foo
    y=’$’$x
    echo $y

    这里输出的是 $foo,如果将 y=‘$’$x 换成 eval y=’$’$x,输出的是10,eval的命令就相当于额外的一个$,他给出一个变量值的值。

    6.exit n 使脚本程序以退出码n退出程序,0表示成功退出,1~125表示错误退出,其他退出码有特殊含义。

    7.export命令 export命令将自己的参数创建为一个环境变量,而这个环境变量可以被当前程序调用的其他脚本和程序看见。

    export PATH =/bin:$PATH

    8.expr命令将他的参数当作一个表达式来求值

    x=`expr $x+1`这里的反引号 ` ` 使x的取值等于expr $x+1,也可以用$()来表示。

    9.printf等同于C语言中的用法,格式化输出

    10.return命令,可以作为函数的返回值

    11.set命令,是为shell设置参数变量

    set $(date)
    echo the month is $2
    exit 0

    12.trap命令

    trap 操作命令 信号

    当接收到某个信号时,执行指定的操作命令

    trap ‘rm –f /tmp/my_tmp_file$$’ INT INT为中断信号

    两个重要的命令 

    find命令

    find [路径][选项][测试][行为]

    路径就是查找的路径

    测试(常用的两种)

    -name pattern 文件名按照pattern 匹配

    -newer fileneme 文件比fileneme 要新

    -type c 文件的类型是c,d(目录文件),f(普通文件)

    有时候还会使用组合测试 !/not 测试取反 ; –a/-and 两个测试相与; -o/-or 两个测试相或

    eg:\( –name “_*” –or –newer file2 \) 注意这里的\是转义字符。

    动作

    -exec 命令 执行一个命令,这个动作使用\;字符结束

    -print 打印文件名

    -ls 对当前文件使用命令ls

     

    grep命令

    grep [选项] pattern [files]

    grep -c in file1.txt file2.txt

    -c表示输出匹配行的数目

    -v表示反匹配

    正则表达式

    grep e$ word2.txt 找出结尾是e的行

    $表示一行的结尾

    ^表示一行的开头

    [ ] 表示包含的字符范围

    . 表示任意单个字符

    grep a[[:blank:]] 匹配方式:a加上空格制表符

    [:blank:]空格和制表符

    [:ascii:] ASCII码字符

    grep –E [a-z] \{10\} word2.txt

    如果指定了用于扩展匹配的-E选项,对于grep命令还需要在这些字符之前加上\字符。

    {n} 必须匹配n次

    {n,}必须匹配n次及以上

    {n,m}必须匹配n次到m次之间

    + 必须匹配1次或多次

    * 必须匹配0次或多次

    ?最多匹配一次

    以上就是shell编程的大部分知识,知识点很多很碎,通过这部分可以帮助我们熟悉一下Linux的命令。

     
     
    分类: Linux
  • 相关阅读:
    ubuntu下配置Apache
    ubuntu 下配置Web服务器
    ubuntu 笔记一
    域名解析
    C# Enum,Int,String的互相转换
    C# 得到本机局域网IP地址
    C# 连接 SQLServer 及操作
    C# OpenFileDialog 使用
    如何解决 IntelliJ Idea 编译 Java 项目时,找不到包或找不到符号的问题?
    阿里巴巴 MySQL 数据库之 SQL 语句规约 (三)
  • 原文地址:https://www.cnblogs.com/Leo_wl/p/2889492.html
Copyright © 2020-2023  润新知