shell编程学习整理(shell编程的概念,特殊字符,变量和运算)

基本概念

shell脚本编程可以认为就是一系列的命令的集合,可以说:会用Linux命令就会编写shell程序,但是这样的只是一些顺序执行的指令,比如:将某文件复制到另一个文件夹内,修改其权限,然后执行该程序,就可以用一个shell脚本来描述,但是如果需要更加复杂 的逻辑和功能,就需要引入一些新的概念,比如:变量,表达式,流程控制和函数等等。此时的它已经具备完成程序的特征,但与C程序是有明显的差别的,因为C语言写的程序是源码,需要将.c .h等文件使用编译工具处理成二进制的可执行文件之后,才可以执行看到结果,而shell脚本只需要给 脚本加上执行权限,这与python脚本是相同的。
shell脚本和python脚本的一个显著特征:解释执行。
shell解释脚本的过程是从一个文件读入字符流,然后处理,最后把结果送到一个文件 ,故交互式的shell与执行脚本的shell本质上并无区别,只不过交互式的shell的输入文件是标准输入,输出文件是标准输出。
shell中的注释是#
一般的解释器为:/bin/sh,所以 在shell脚本前一般需要指定解释器#!/bin/sh,如果不指定就是这个,也可以指定为#!/bin/bash

Shell 的模型就是标准的字符流过滤器模型,简单来说,就是一条命令把结果送到标准输出,这个标准输出被连接到下一个命令的标准输入,由此来实现一系列命令之间的联动。每一个命令的输出都是自己过滤后的字符流,接受的输入都是一个需要过滤处理的字符流。故字符串是 Shell 中很重要的数据。

特殊字符

字符串通畅需要用引号,但是单引号和双引号的使用方式有差别:

  • 单引号(’ ')单引号中的字符串 Shell 不会做任何处理,在需要保持字符串原样不变的时候使用。
  • 双引号(" ") 双引号中的字符串 Shell 会进行处理,若其中含有可以求值的部分,会被 Shell 替换为求值的结果,其中包含变量、表达式或命令。
  • 变量:$表示
  • 下面用一个范例来对比这两种情况的差异。先给一个变量 foo 赋值为 bar,如果在字符串中用 $ 符号引用 foo 变量,在单引号中和双引号中结果不同,单引号会原样输出:$ foo,而双引号中的“$foo”会被替换成变量的值 bar。
  • 反引号:
    反引号比较特殊,它一般用来引用一条命令,并且将这个命令的输出结果(输出到标准输出上)作为这个字符串最终的值,作用与符号“$ ()”相同。在反引号中或者在$()符号中的命令的输出会被当作字符串的实际内容。如果反引号引用的命令出现在双引号字符串中,这部分也会被替换为命令的输出。
  • “*”匹配任意多个字符,“?”匹配任意一个字符
  • 冒号(:)表示空命令(NOP no-op),因其返回值恒为 0,在循环条件中,可与 true 命令等价
  • 分号(;)是分行符,可以表示一行命令结束,可用分号将多条命令写在一行中
  • 美元符( $ )用于取值,根据其后的不同结构,可以取变量或表达式的值。$ {var}和$var 均是取变量var 的值,不同之处在于使用大括号({ })可以当变量作为在一个字符串的一部分的时候,变量名不会和字符串内容混淆。
  • $ ()可以取出一个命令的值作为字符串内容,与反引号含义相同
  • $(())可以取出一个数学表达式的 值
  • (())操作符一般可以在 Shell 中支持 C 风格的整数运算
  • 句号 . 等效与source 执行
  • 反斜线 \是转义符,是一种引用单个字符的方式,特殊含义的字符可以通过\进行转义;
  • 空格作为单词边界,touch a b”空格分隔了 a 和 b 两个参数,该命令将会创建文件名为 a 和 b 的两个文件
  • 如果希望一个脚本能够改变当前 Shell 自身的一些属性,则必须在 Shell 进程内执行。如修改了系统配置脚本/etc/profile 或个人配置脚本~/.profile 和~/.bashrc,欲使其生效,必须用 source 命令执行该文件。 source /etc/profile 或者 . /etc/profile
  • 重定向:任何一个进程都至少有三个已经打开的“文件”:标准输入(stdin)、标准输出(stdout)和标准错误(stderr),它们对应的文件描述符通常情况下默认为 0、1 和 2。I/O 重定向其实就是捕捉一个文件、命令、程序、脚本甚至代码块的输出,然后将这个输出作为输入发送给另外一个文件、命令、程序或脚本中。
  • 输出重定向:覆盖与追加的区别,“>”和“>>”,这两个符号是输出重定向,它们可以把标准输出的内容重定向到一个文件中,如果目标文件不存在则创建文件。它们的区别是当目标文件已经存在的时候,“>”会将原文件的长度截断为 0,即表现为覆盖原文件;而“>>”会在文件已经存在的时候将内容追加在文件的原内容之后。
  • 输入重定向:“<”和“<<”是输入重定向,用来将命令的标准输入重定向到一个文件。它们的不同之处就是“<”一般跟着一个文件,这个范例其实我们在执行脚本的五种方式中已经用过。其实就相当于将脚本中的命令通过标准输入逐条输入到 Shell 程序中执行。“<<”一般用于 Here Document,就是将一段文本直接写在脚本之中,以特定的字符序列来表示终止。这一段文字其实就相当于一个独立文件的内容。
  • | 管道用于连接命令,将前一条命令的标准输出内容变成下一条命令的标准输入。

常量 变量 环境变量

  • 注意一点:shell变量赋值是需要注意,等于号两边不能有空格,因为空格属于是特殊字符
  • 变量赋值: c varl="lcy111"
  • 这样赋值则有问题:var1 = “lcy111”
  • 引用变量时一定要使用“ $ ”符号,如果想要引用变量名却没有给其加上“$”符号的话,会直接将变量名作为字符串。变量没有类型。例如 a=1234,它既可以被认为是十进制整数 1234 接参与整数运算,也可以被认为是字符串去参与 Bash 的字符串操作。
  • 问号(?)也是一个变量,通过$?可以引用上一个命令的返回值。需要注意的是这个变量只能使用一次,使用完毕后会立即被当前命令的返回值替换。
环境变量:
  • 环境变量:是可以改变用户接口和 Shell 行为的变量。每一个进程都有自己的环境变量,用于保存进程可能有用的信息。环境变量一般都是约定俗成的,例如 PATH 指示了 Shell 进程查找命令文件的搜索路径。
  • export 语句:任何一个变量都可以使用 export 导出成为环境变量,环境变量可以被子进程继承。所以它也是父进程给子进程传递信息的一种方式。
位置参数
  • 位置参数:位置参数就是按照位置来引用的命令行参数。Shell 脚本被调用时可以传递参数给它,在脚本中按照顺序$0、$1„„来引用,依此类推。其中,$0 代表命令本身,所以一般在 Shell中引用命令行参数时不使用$0。 比如 sh lcy.sh 11 22 33,其中的$0 是lcy.sh本身,$1是11 $2是22 $3是33
  • $# 代表命令行参数的个数
  • $* 代表全部的命令行参数,而且全部参数作为一个单词。引用时必须在“”之中
  • $@ 代表所有的命令行参数,但是每个参数都是一个独立的单词,引用时也要在“”中

操作符号和表达式

  • 数学运算符:+、-、*、/、、%。除了代表的幂运算外,其它运算符与对应的 C 语言运算符意义相同。但 Bash 只支持整数运算,如果需要浮点运算,应该需要调用外部的工具。一般不建议在脚本里进行浮点运算。
  • 逻辑运算符:&&和||,分别代表逻辑“与”和逻辑“或”。对于&&来说,若左边的表达式为假,右边表达式将不用被执行即可确定整个表达式结果为假;反之则需要求值右边的表达式才能确定整个表达式的值。

我们都有美好的未来

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值