一.shell中单引号和双引号的区别:

1)、单引号属于强引用,它会忽略所有被引起来的字符的特殊处理,被引用起来的字符会被原

  封不动的使用,唯一需要注意的点是不允许引用自身;

2)、双引号属于弱引用,它会对一些被引起来的字符进行特殊处理,主要包括以下情况:

  1:$加变量名可以取变量的值 ,比如:

  [root@localhost ~]# echo '$PWD'
  $PWD  

  [root@localhost ~]# echo "$PWD"

  /root

  2:反引号和$()引起来的字符会被当做命令执行后替换原来的字符,比如:

  [root@localhost ~]# echo '$(echo hello world)'
  $(echo hello world)
  [root@localhost ~]# echo "$(echo hello world)"
  hello world

[root@localhost ~]# echo '`echo hello world`'
`echo hello world`
[root@localhost ~]# echo "`echo hello world`"
hello world

  3:当需要使用字符($  `  "  \)时必须进行转义,也就是在前面加\ ;

[root@localhost ~]# echo '$ ` " \'
$ ` " \
[root@localhost ~]# echo "\$ \` \" \\"
$ ` " \

二.shell通配符(元字符):

*表示匹配任意多个字符

?匹配任意一个字符

[]匹配括号中任意一个字符

()在子shell中执行(cd /boot;ls)

{}集合touch file{1....9}

\转义字符

补充:echo带有颜色的输出:echo -e "\e[1();31(30-37是前景色,37-47是背景色显示颜色的数字)m需要打印的内容\e[0m"

例子:echo -e "\e[1;35mthis is text[0m" 

交接printf格式化输出

三.shell变量

用特定的字符串表示不同的内容,变量需要以字母和下划线开头,区别大小写,使用变量为$变量名,$符号为引用变量的意思$变量名或者${变量名},$1、$2、$3.....为位置变量,把脚本需要输入的参数分别赋值给变量

read 参数就是键盘输入参数给脚本或者用$1....等直接用bash 脚本名 参数

自定义变量的作用域为当前shell

环境变量的作用域为当前shell和子shell,可以用export 变量名定义环境变量或者export 自定义变量名转换为环境变量

取消环境变量:unset 变量名

查看环境变量为 echo $变量名 env显示当前shell的所有环境变量 例如:env |greo back_dir2

source加载文件

位置变量:$1 $2 $3.....${10}

预定义变量:$0---脚本名   $*---所有的参数   $@---所有的参数   $#---参数的个数   $$---当前进程的PID   $!---上一个后台进程的PID   $?---上一个命令的返回值0表示成功

basename:取文件名 dirname:取路径名

变量赋值方式:

1.显示赋值:变量名=变量值,如:ip1=192.13.21.1(把字符串赋值给变量)  school="Nanjing university"(如果把字符串赋值给变量,字符串中有空格的时候,需要用双引号引起来) today1=`date + %F`是反引号引起来,相当于执行反引号里面的语句再赋值,today2=$(data + %F)跟反引号的意思是一样的。以上均为字符串的赋值

2.read 从键盘赋值:

read 变量名      read -p(为加提示信息的意思)  "提示信息:" 变量名     read -t 5(加上倒计时,等待5秒的时间) -p " "提示信息:" 变量名"      read -n 2(只要前面两个字符) 变量名

··(反引号,命令替换)等价于$()的意思

shell当中变量是没有数据类型的,全部是字符串类型

变量的运算:

1.整数运算

方法一:expr,例如:expr 1 + 2        expr $num1 + $num2

方法二:$(()),例如:$(($num1+$num2))    $((num1 + num2))

方法三:$[],例如:$[5+2]

方法四:let     let sum=2+3

注意:脚本中运用比较多的是方法二和方法四

注意:bash -vx 要执行的脚本 为调试状态执行脚本

2.小数运算:

"2*4" |bc    "2^4" |bc(2的4次方)  “scale=2;6/4” |bc

变量内容的删除和替换:

获取变量的长度${#变量名},如:url是变量名,${#url}

从前往后删除:${url#*.}从前往后最短匹配

从前往后删除到匹配到的最后一个:${url ##*.},正则匹配,从前往后最长匹配,贪婪模式

从后往前最短匹配:${url%*.}

从后往前最长匹配,贪婪模式:${url%%*.}

索引及切片:

${url:0:5}----取从第0个到第5个     ${url:5}----- 从第5个开始切到最后一个          ${url:5:5}-----从第5个开始取后面5个

内容的替换:

${url/被替换的内容/需要替换的内容}    贪婪替换:${url//被替换的内容/需要替换的内容}

变量的替代:

unset 变量名为取消变量

echo(必须加上$) ${变量名-新的变量值}:变量没有被赋值:会使用”新的变量值“替代,变量有被赋值(包括空值):不会被替代

变量赋默认值有两种方式-或者:-两种

有类型变量(declare和typeset命令都是用来定义变量类型的):

declare命令参数:

-r:将变量设为只读     -i:将变量设为整数    -a:将变量定为数组   -f:显示此脚本前定义过的所有函数及内容  -F:仅显示此脚本前定义过的函数名    -x:将变量声明为环境变量

例如:declare -r(命令参数) 变量名 

取消变量声明:declare +r     declare +x等

shell中特殊符号的意思:

()------在子shell中执行命令,(())-----数值比较,运算C语言, $()命令替换(和反引号··的意思一样,先执行里面的命令)。$(())----整数运算,{}----集合,${}----变量的应用或者变量的替换,[]---条件测试,[[]]-----条件测试,支持正则=~,$[]-----整数运算

执行脚本:

./01.sh                 需要执行权限    在子shell中执行   此种执行为脚本路径执行

bash 01.sh         不需要执行权限    在子shell中执行

.01.sh                  不需要执行权限     在当前shell中执行

source 01.sh      不需要执行权限 在当前shell中执行

提示:通常修改系统配置文件中如/etc/profile的PATH等变量后,使之在当前shell中生效

脚本调试:

sh -n 02.sh   仅调试syntax error

sh -vx 02.sh 以调试的方式执行,查询整个执行过程(可以看到整个脚本的执行过程)

 四.shell条件测试:有三种类型文件测试 数值比较 字符串比较

格式1:test条件表达式

格式2:[条件表达式]

格式3:[[条件表达式]]

man test(test是条件测试的命令)

====文件测试[操作符 文件或目录]

例如:[ -d /home ]      [-e dir|file]-----只要一个存在就返回真值

4.If条件判断语句:

shell脚本开始是固定表达式:#!/usr/bin/bash定义用哪个解释器执行叫做shellbang

if (表达式)

  语句1

else

  语句2

fi

逻辑运算符解析:

-f:判断文件是否存在 eg:if [ -f filename ]

-d:判断目录是否存在eg: if [ -d dic ]

-eq:等于 整型比较

-ne:不等于  整型比较

-lt :小于

-gt :大于

-le :小于或者等于

-ge:大于或等于

-a:双方都成立(and)逻辑表达式 -a 逻辑表达式

-o:单方成立(or)逻辑表达式

-z :空字符串

C风格的比较:

例如:((a > b))    ((a==b)) 这类的

字符串比较:

注意:使用双引号,字符串变量最好加上引号

["$USER"="root"];echo $?     ["$USER"=="root"];echo $?

[ -z "$BBB"]   字符长度是为0    [ -n "$BBB"]  字符长队不为0

[条件1 -a 条件2]----两个条件为真才为真    [条件1 -o 条件2] ----其中一个为真就为真

[[条件1 && 条件2]]----与上面一样            [[条件1 || 条件2]]-----与上面一样

shell特性补充:

/bin/bash -n 脚本名称:测试脚本是否存在问题,如果没有输出则脚本没有问题。

>符号是覆盖原来的内容,>>是追加或者添加的意思.

$0当前脚本名称(环境变量)$1(环境变量)脚本需要输入的参数,$?前一个命令的返回值,$符号的意义就是引用变量的意思

``(反引号)代表里面的代码执行会出现一个结果

$UID系统环境变量,显示当前的登陆用户,如果是0就是root用户

bash和./都是在子shell中执行,.bash和source +脚本名都是在当前shell执行,如果想要执行的脚本影响到当前shell则采用后面两种执行方法。

系统级别的文件/etc/profile /etc/bashrc

用户级别的文件:~./bashrc是用户家目录下的文件,~/.bash_profile

<<-EOF

输入

EOF,把输入传给程序去执行

命令排序:

;不具有逻辑判断,&& || 具有逻辑判断

命令 1 &&  命令2,命令1执行成功才执行命令2

命令 1 ||  命令2,命令1执行失败才执行命令2

命令 1; 命令2,命令1执行成功不成功都会执行命令2

命令 &--后台执行

命令 &>/dev/null-- 混合定向(标准输出1,错误输出2)

判断一个变量是数字[ [ $num1 = ~^[0-9]+$ (正则表达式)] ]---判断这个变量是不是匹配这个正则的模式

5.case语法结构

case 变量 in

模式1)

  命令序列1

  ;;

模式2)

  命令序列2

  ;;

*)

  无匹配后命令序列

esac

嵌套判断:

if [条件];then

  语句

elif[条件];then

  语句

else

  语句

fi

((条件计算用了运算符号,如用4>5)),[[判断目录是否存在或者用比较符号不是运算符号]]

Shell编程学习记录的更多相关文章

  1. Linux 下shell 编程学习脚手架

    linux body { font-family: Helvetica, arial, sans-serif; font-size: 14px; line-height: 1.6; padding-t ...

  2. shell编程学习之使用jq对json数据进行提取

    shell编程学习之使用jq对json提取 jq命令允许直接在命令行下对JSON进行操作,包括分片.过滤.转换等 ,jq是用C编写,没有运行时依赖,所以几乎可以运行在任何系统上.预编译的二进制文件可以 ...

  3. shell编程学习笔记(一):编写我的第一段代码

    目前在学习Shell编程,我会把我的学习笔记记录在这里.大神可以直接略过~ 嗯,第一段代码,肯定是要输出Hello World了~ 以下蓝色字体的内容为linux命令,红色字体的内容为输出的内容: # ...

  4. shell编程学习笔记之sed编辑器

    在shell编程中,大多数处理的都是文本文件.对文本文件进行处理除了使用交互式文本编辑器(vi[m],gedit......)也可以使用另外一类:流编辑器. 流编辑器:使用预定义的编辑规则来对文本进行 ...

  5. shell编程学习1

    1.shell是操作系统的终端命令行 (1)shell可以理解为软件系统提供给用户操作的命令行界面,可以说它是人机交互的一种方式.    (2)我们可以使用shell和操作系统.uboot等软件系统进 ...

  6. Linux Shell编程学习笔记——目录(附笔记资源下载)

    LinuxShell编程学习笔记目录附笔记资源下载 目录(?)[-] 写在前面 第一部分 Shell基础编程 第二部分 Linux Shell高级编程技巧 资源下载 写在前面 最近花了些时间学习She ...

  7. shell编程学习笔记【原创】

    本文为本人学习笔记,如有转载请注明出处,谢谢 一.Bourne Shell 有如下四种变量: 用户自定义变量 位置变量,即命令行参数 预定义变量 环境变量 二.位置变量 $ 与键入的命令行一样,包含脚 ...

  8. (七)shell编程学习

    1.shell程序练习:创建一个dir文件夹,在dir文件夹里再创建一个cd.c文件 首先vim hello.sh 2.shell中的变量定义和引用 (1)变量定义和初始化.shell是弱类型语言(语 ...

  9. shell编程学习笔记(十):Shell中的for循环

    shell编程中可以实现for循环遍历 先来写一个最简单的吧,循环输出从1到10,脚本内容为: #! /bin/sh for i in {1..10} do echo $i done 上面的代码从1到 ...

随机推荐

  1. 数论--扩展欧几里得exgcd

    算法思想 我们想求得一组\(x,y\)使得 \(ax+by = \gcd(a,b)\) 根据 \(\gcd(a,b) = \gcd(b,a\bmod b)\) 如果我们现在有\(x',y'\) 使得 ...

  2. SQL基础-创建新的输出字段

    一.创建新的输出字段 1.建表.插数据 ### CREATE TABLE `t_stock_trans_dtl` ( `trans_id` varchar(100) NOT NULL COMMENT ...

  3. uni app 零基础小白到项目实战-1

    uni-app是一个使用vue.js开发跨平台应用的前端框架. 开发者通过编写vue.js代码,uni-app将其编译到Ios,android,微信小程序等多个平台,保证其正确并达到优秀体验. Uni ...

  4. nbbnbnbnbnb

    1.本章学习总结(2分) 1.1 学习内容总结 结构体的定义与赋值 结构类型定义的一般形式为: struct 结构名 { 类型名 结构成员1: 类型名 结构成员2: ... 类型名 结构成员3: }; ...

  5. react用脚手架创建一个react单页面项目,react起手式

    官网地址:https://react.docschina.org/ 确保本地安装了Node.js node的版本大于8.10    npm的版本大于5.6 1.在本地的某个位置创建一个文件夹,执行以下 ...

  6. Eclipse各个版本及其对应代号、下载地址列表【转】

    Eclipse各个版本及其对应代号.下载地址列表 Eclipse各个版本及其对应代号.下载地址列表版本号 代码 日期 下载地址Eclipse 3.1 IO[木卫一,伊奥] 2005 http://ar ...

  7. fluent meshing建立周期性网格

    原视频下载地址:https://pan.baidu.com/s/1pKUXKgz 密码: 6pwh

  8. 下载根目录下的pdf文件, 浏览器下载

    public void outPut(HttpServletRequest request, HttpServletResponse response, Integer type) { ClassPa ...

  9. 微信小程序之页面传参

    效果图: 点击编辑值传过去了,那么编辑支出类型这个界面又是如何获取到值呢? 传值代码: type.js editType: function (e) { var typeId = e.currentT ...

  10. 第09组 Alpha冲刺(1/4)

    队名:软工9组 组长博客: https://www.cnblogs.com/cmlei/ 作业博客: 组员进度 ● 组员一(组长) 陈明磊 ​ ○过去两天完成了哪些任务 ​ ●文字/口头描述 ​ 初步 ...