Linux bash学习一篇即可"/>
Linux bash学习一篇即可
1. “CA=1 GO_TAGS=GM make.bash”引出的思考
格式: 在一条命令行中前半部分是变量赋值,后面是一个脚本执行时?
含义: 对变量赋值且变量的作用域仅局限于该行且make.bash脚本中,
如果make.bash脚本中需要引用这些变量则用${}形式引用
2. $ {PWD},${HOME}环境变量
- ${PWD}:当前脚本或者命令行所在目录绝对路径, $ {PWD}是系统变量,而pwd是命令
- ${HOME}:表示当前用户的home目录绝对路径
3. Shell、Linux命令行中的双引号、单引号以及倒引号含义
- Shell中会通过#!/bin/xxx的首行来指定shell脚本文件中命令行的解释器
- Linux终端命令行是由$SHELL系统变量来决定的
因此:Shell和Linux中的双引号和单引号用法一样
4. Shell中,if、while的条件表达式
格式: if [ 条件表达式 ];then
常见参数:
- -n:表示变量中字符串长度是否为0,如果为0返回真。如 -n ${CA}
- 逻辑运算符:
-a:and之意。只有当所有的表达式为真时,才为真。
-o:or之意。只有当所有的表达式为假时,才为假。 - 文件属性判断(以下xxx为绝对路径):
-f xxx:是否为普通文件
-e xxx:文件是否存在
-d xxx:是否是目录 - 比较大小:
-ne:不等于
-eq:等于
-le:小于等于
-lt:小于
-ge:大于等于
-gt:大于
5. 非交互模式
在非交互模式下,shell从文件或者管道中读取命令并执行。 当shell解释器执行完文件中的最后一个命令,shell进程终止,并回到父进程。
6. 返回值
- 命令的返回值: 每个命令都有一个返回值(返回状态或者返回码)。命令执行成功的返回值总是0(零值),执行失败的命令,返回一个非0值(错误码)。每个命令的返回值或者返回码赋值给$?环境变量中
- 脚本程序的返回值: exit指令可以指定特定的返回值赋值给$?,所以经常在脚本程序中用exit指令传递特定的返回值并中止脚本程序。 当exit命令不带参数时,它会中止当前脚本的执行并返回在它之前最后一个执行的命令的返回值。
- 函数的返回值: 可以使用return命令来结束一个函数的执行并将返回值返回给调用者。如果在函数内部使用exit,不但会中止函数的继续执行,而且会中止整个程序的执行。
7.变量
bash中没有数据类型。变量只能包含数字或者由一个或多个字符组成的字符串。
7.1.局部变量
- 仅限在脚本内部的局部变量:
- 仅限在脚本函数内部的局部变量:
7.2.环境变量
环境变量是指当前shell会话内所有程序或脚本都可见的变量.使用关键字export。
export GLOBAL_VAR=“I’m a global variable”
环境变量表
7.3.位置参数的变量
还有一种写法就是 在一条命令行中前半部分是变量赋值,后面是一个脚本执行,如:CA=1 GO_TAGS=GM make.bash
7.4当局部变量和环境变量中含有空格时需要注意它们在引号中的扩展.
INPUT="A string with strange whitespace."
echo $INPUT # A string with strange whitespace.
echo "$INPUT" # A string with strange whitespace.
第一个echo 认为$ INPUT拓展为 echo A string with strange whitespace. 则对echo传递了5个参数即5个分隔的单词。
第二个echo认为$ INPUT扩展为echo “A string with strange whitespace.”,则对echo传递了1个参数即一个由5个单词组成的字符串。
综上所述,如果把多个单词看作是一个整体则必须用双引号括起来。
8. Shell扩展
- 大括号扩展:生成有规律的字符串
2. {}中可以包含所有要生成字符串的选择字符
echo beg{i,a,u}n #标准输出结果:begin began begun
3. {}中可以为可迭代的循环闭区间,其中可以设置循环区间的步长
{开始数字..结束数字} or {开始数字..结束数字..步长}
echo {0..5} #标准输出结果:0 1 2 3 4 5
echo 0{0..8..2} #标准输出结果:00 02 04 06 08
2.算数扩展:由于shell脚本中所有的字符都看作是字符串,所以如果存在数字计算则必须在$(())中计算
注:在算数扩展中使用变量无需带上$前缀
result=$(( ((10 + 5*3) - 7) / 2 ))
echo $result # 9x=4
y=7
echo $(( x + y )) # 11
echo $(( ++x + y++ )) # 12
echo $(( x + y )) # 13
9.数组
在bash中,数组下标也是从0开始,也就是说,第一个元素的下标是0。
与数组打交道,要注意一个特殊的环境变量$IFS,保存了数组中元素的分隔符。它的默认值是一个空格IFS=’ '。
9.1.数组声明
在bash中,可以通过简单地给数组变量的某个下标赋值来创建一个数组,也可以通过复合赋值
fruits[0]=Apple
fruits[1]=Pear
fruits[2]=Plum
或者
fruits=(Apple Pear Plum)
9.2.数组扩展
9.3.数组切片
可以通过${数组名[*]:左闭区间:右开区间}
fruites=(Apple Pear Plum)&&echo "${fruits[*]:0:3}"#Apple Pear Plum
${fruits[@]}扩展为整个数组,:0:3取出了数组中取出下标为[0,3)的元素。
9.4.数组添加元素
利用数组的复合赋值方法,在原数组中添加元素
第一行中"$ {fruits[]:0:3}"把“Apple Pear Plum”看作一个数组元素使得fruits最后数组长度为4,所以echo "$ {fruits[]:0:3}“结果为Orange Apple Pear Plum Banana
第一行中”$ {fruits[]:0:3}" 把“Apple Pear Plum”看作三个数组元素使得fruits最后数组长度为6,所以echo "$ {fruits[]:0:3}"结果为Orange Apple Pear
9.5.数组删除元素
利用unset命令删除变量或者数组元素
9.6.流、管道以及序列
9.6.1管道
流和管道的区别:流是将字符串重定向至文件中,而管道是将字符串重定向至另一个程序或命令中
管道可以将一个命令的输出作为另一个命令的输入。
command1|command2|command3
command1命令的输出作为command2命令的输入,然后将command2的输出作为command3的输入,这样的结构称为管道。
管道的返回值通常是管道中最后一个命令的返回值。shell会等到管道中所有的命令都结束后,才会返回一个值。
9.6.2命令序列
命令序列是由**; & && ||**这四个运算符分隔的一个或多个管道序列。
- ;:命令会依次执行,一个接一个
command1;command2 #当command1执行完后才执行command2 等价于 command1 command2
- &:如果一个命令以&结尾,shell将会在一个子shell中异步执行这个命令。换句话说,这个命令将会在后台执行。
参考
bash教程
注:本博客仅限学习和交流,不作商用。有些图片摘自其他优秀博客。
更多推荐
Linux bash学习一篇即可
发布评论