打算花1个小时学习下shell脚本,希望学的完,边学边记录。 开始!!
1. sehll 大概介绍
Shell 是一个用 C 语言编写的程序,它是用户使用 Linux 的桥梁。Shell 既是一种命令语言,又是一种程序设计语言。 Shell 是指一种应用程序,这个应用程序提供了一个界面,用户通过这个界面访问操作系统内核的服务。 Shell 脚本(shell script),是一种为 shell 编写的脚本程序。
1.1 shell 环境
1.2 运行Shell的方法
1、作为可执行程序
chmod +x ./test.sh #使脚本具有执行权限
./test.sh #执行脚本
2、作为解释器参数
/bin/sh test.sh
/bin/php test.php
2. Shell变量
2.1 shell变量
使用变量:
your_name="qinjx"
echo $your_name # 一般不用
echo ${your_name}
只读变量:
#!/bin/bash
myUrl="https://www.google.com"
readonly myUrl
myUrl="https://www.runoob.com"
删除变量
#!/bin/sh
myUrl="https://www.runoob.com"
unset myUrl
echo $myUrl
变量类型
运行shell时,会同时存在三种变量:
局部变量 局部变量在脚本或命令中定义,仅在当前shell实例中有效,其他shell启动的程序不能访问局部变量。环境变量 所有的程序,包括shell启动的程序,都能访问环境变量,有些程序需要环境变量来保证其正常运行。必要的时候shell脚本也可以定义环境变量。shell变量 shell变量是由shell程序设置的特殊变量。shell变量中有一部分是环境变量,有一部分是局部变量,这些变量保证了shell的正常运行
2.2 shell字符串
字符串是shell编程中最常用最有用的数据类型(除了数字和字符串,也没啥其它类型好用了),字符串可以用单引号,也可以用双引号,也可以不用引号。
拼接字符串
使用双引号拼接
your_name="runoob"
# 使用双引号拼接
greeting="hello, "$your_name" !"
greeting_1="hello, ${your_name} !"
echo $greeting $greeting_1
# 使用单引号拼接
greeting_2='hello, '$your_name' !'
greeting_3='hello, ${your_name} !'
echo $greeting_2 $greeting_3
输出结果为:
hello, runoob ! hello, runoob !
hello, runoob ! hello, ${your_name} !
获取字符串长度
提取子字符串
第一个索引为0
查找子字符串
2.3 shell数组
bash支持一维数组(不支持多维数组),并且没有限定数组的大小。
类似于 C 语言,数组元素的下标由 0 开始编号。获取数组中的元素要利用下标,下标可以是整数或算术表达式,其值应大于或等于 0。
定义数组
读取数组
获取数组的长度
2.4 shell注释
单行注释
以 # 开头的行就是注释,会被解释器忽略。
每一行加个#符号太费力了,可以把这一段要注释的代码用一对花括号括起来,定义成一个函数,没有地方调用这个函数,这块代码就不会执行,达到了和注释一样的效果。
多行注释
:< 注释内容... 注释内容... 注释内容... EOF :<<' 注释内容... 注释内容... 注释内容... ' 3. shell传递参数 我们可以在执行 Shell 脚本时,向脚本传递参数,脚本内获取参数的格式为:$n。n 代表一个数字,1 为执行脚本的第一个参数,2 为执行脚本的第二个参数,以此类推…… 4. Shell数组 数组中可以存放多个值。Bash Shell 只支持一维数组(不支持多维数组),初始化时不需要定义数组大小(与 PHP 类似)。 与大部分编程语言类似,数组元素的下标由 0 开始。 Shell 数组用括号来表示,元素用"空格"符号分割开,语法格式如下: array_name=(value1 value2 … valuen) 读取数组 关联数组 declare -A array_name 获取数组中的所有元素 使用 @ 或 * 可以获取数组中的所有元素 使用场景: 获取所有元素 + 获取关联数组所有元素值 + 获取关联数组所有键 一:普通数组 二:关联数组 获取数组的长度 5. Shell运算符 Shell 和其他编程语言一样,支持多种运算符,包括: 算数运算符关系运算符布尔运算符字符串运算符文件测试运算符 原生bash不支持简单的数学运算,但是可以通过其他命令来实现,例如 awk 和 expr,expr 最常用。 expr 是一款表达式计算工具,使用它能完成表达式的求值操作。 例如,两个数相加(注意使用的是反引号 ` 而不是单引号 '): 算数运算符 关系运算符 关系运算符只支持数字,不支持字符串,除非字符串的值是数字。 下表列出了常用的关系运算符,假定变量 a 为 10,变量 b 为 20: 布尔运算符 逻辑运算符 字符串运算符 文件测试运算符 6. Shell echo命令 echo string 可以使用echo实现更复杂的输出格式控制。 显示普通字符串 echo “It is a test” 这里的双引号完全可以省略,以下命令与上面实例效果一致: echo It is a test 显示转义字符 echo ““It is a test”” 结果将是: “It is a test” 同样,双引号也可以省略 显示变量 read 命令从标准输入中读取一行,并把输入行的每个字段的值指定给 shell 变量 显示换行 显示不换行 显示结果定向至文件 echo “It is a test” > myfile 原样输出字符串,不进行转义或取变量(用单引号) echo ‘$name"’ 输出结果: $name" 显示命令执行结果 7. Shell printf 命令 一章节我们学习了 Shell 的 echo 命令,本章节我们来学习 Shell 的另一个输出命令 printf。 printf 命令模仿 C 程序库(library)里的 printf() 程序。 printf 由 POSIX 标准所定义,因此使用 printf 的脚本比使用 echo 移植性好。 printf 使用引用文本或空格分隔的参数,外面可以在 printf 中使用格式化字符串,还可以制定字符串的宽度、左右对齐方式等。默认的 printf 不会像 echo 自动添加换行符,我们可以手动添加 \n。 %s %c %d %f 都是格式替代符,%s 输出一个字符串,%d 整型输出,%c 输出一个字符,%f 输出实数,以小数形式输出。 %-10s 指一个宽度为 10 个字符(- 表示左对齐,没有则表示右对齐),任何字符都会被显示在 10 个字符宽的字符内,如果不足则自动以空格填充,超过也会将内容全部显示出来。 %-4.2f 指格式化为小数,其中 .2 指保留2位小数。 转义序列 8. Shell test 命令 Shell中的 test 命令用于检查某个条件是否成立,它可以进行数值、字符和文件三个方面的测试。 8.1 数值测试 8.2 字符测试 9. Shell流程控制 if语句相关: for 循环 当变量值在列表里,for 循环即执行一次所有命令,使用变量名获取列表中的当前取值。命令可为任何有效的 shell 命令和语句。in 列表可以包含替换、字符串和文件名。 in列表是可选的,如果不用它,for循环使用命令行的位置参数。 while语句 无限循环 until循环 case … esac case … esac 为多选择语句,与其他语言中的 switch … case 语句类似,是一种多分支选择结构,每个 case 分支用右圆括号开始,用两个分号 ;; 表示 break,即执行结束,跳出整个 case … esac 语句,esac(就是 case 反过来)作为结束标记。 可以用 case 语句匹配一个值与一个模式,如果匹配成功,执行相匹配的命令。 case … esac 语法格式如下: Shell输入输出重定向 跳出循环 10. 函数 函数实例 格式: [ function ] funname [()] { action; [return int;] } 1、可以带function fun() 定义,也可以直接fun() 定义,不带任何参数。 2、参数返回,可以显示加:return 返回,如果不加,将以最后一条命令运行结果,作为返回值。 return后跟数值n(0-255) 函数参数 11. Shell输入\输出重定向 大多数 UNIX 系统命令从你的终端接受输入并将所产生的输出发送回到您的终端。一个命令通常从一个叫标准输入的地方读取输入,默认情况下,这恰好是你的终端。同样,一个命令通常将其输出写入到标准输出,默认情况下,这也是你的终端。 输出重定向 输入重定向 和输出重定向一样,Unix 命令也可以从文件获取输入,语法为: command1 < file1 这样,本来需要从键盘获取输入的命令会转移到文件读取内容。 注意:输出重定向是大于号(>),输入重定向是小于号(<)。 重定向讲解 /dev/null文件 11. Shell文件包含 Shell 也可以包含外部脚本。这样可以很方便的封装一些公用的代码作为一个独立的文件。 . filename # 注意点号(.)和文件名中间有一空格 或 source filename 好吧, 本来说看一个小时结束的,实操了一些标本,不知不觉超出了半个小时,以此文记录今天 下午3:00-4:30. 好了,准备刷LeetCode了。 本文主要来自菜鸟教程的Shell,链接如下:shell教程 主要是做个目录,方便之后查! 相关文章
发表评论