1.1 简介
1 打开终端后,就会出现一个提示符,形式通常如下
username@hostname$ 或者root@hostname#
2 $表示的是普通用户,#表示的是超级用户。超级用户是Linux中权限最高的用户
3 有两种运行脚本的方式
sh script.sh 或者是 path script (path是脚本所在的目录)
4 在bash中每个命令是通过分号";"来分开的
1.2 终端打印
1 echo是用于终端打印的基本命令,在默认情况下echo在每次调用后都会添加一个换行符
2 另一个可以用来终端打印的命令是printf,printf的参数和C语言中的printf函数一样
3 在默认情况下,echo会将一个换行符追加到输出文本的尾部,可以使用-n来忽略结尾的换行符
4 如果需要使用转义序列,则采用echo -e ”包含转义序列的字符串"这种形式
1.3 玩转变量和环境变量
1 我们可以使用pgrep来快速找到一个进程的pid,假如有一个gedti正在运行,那么我们通过pgrep gedit就可以快速知道这个gedit的进程id
2 一个变量可以通过以下方式来进行赋值 var=value,var是变量名,value是变量值,如果value不包含任何空白字符,那么他不需要使用引号来进行引用,否则就需要使用引号进行引用
3 环境是未在当前进程中定义,而从父进程中继承来的变量
4 export命令用来设置环境变量
5 获得字符串的长度 length=${#var},可以用来求变量var的长度
1.4 通过shell进行数学运算
1 在bash环境中,我们可以使用let (()) 和[]来进行基本的算数操作,在进行高级的运算中,可以使用expr和bc
2 当使用let的时候,变量名之前是不需要再添加$,例如let res=num1+num2
3 let支持++和--等各种操作
4 操作符[]的使用方法和let命令类似,例如res=$[ num1 + num2 ]
5 也可以使用(()),但是使用(())时,变量名之前要加上$,例如res=$(( num1 + num2 ))
6 我们可以使用scale=2来将小数点位数设置为2
1.5 玩转文件描述符和重定向
1 文件描述符是于文件输入,输出相关联的整数,他们用来跟踪与打开的文件,最常见的文件描述符是stdin,stdout,stderr。
2 文件描述符是与一个打开的文件或数据流相关联的整数,文件描述符0,1和2是系统预留的
0 - stdin标准输入,1 - stdout标准输出,2 - stderr标准错误
3 用下面的方法可以把输出文本重定向到一个文件中
echo "this ...." > out , 这样便可以把输出的字符串重定向到out文件中
4 >和>>并不相同,前者是会先清空文件再写入内容,而后者是会将内容追加到现有的文件的尾部
5 当使用重定向操作符的时候,重定向的内容不会出现在终端,而是直接被导入文件。重定向操作默认使用标准输出
6 >等同于1>;对于>>来说,等同于1>>
7 借助重定向,我们可以使用stdin那样从文件中读取数据 cmd < file
8 我们可以使用exec命令创建自定义的文件描述符
1.6 数组和关联数组
1 bash同时支持数组和关联数组,普通数组只能使用整数做为数组索引,而关联数组可以使用字符串做为数组索引
2 定义数组的方法有很多种
第一种:array_var=(1 2 3 4 5),这些值会存储在以0为起始索引的连续位置上
第二种:array_var[0]=1
array_var[1]=2
......................
3 打印特定元素的数组内容,${array_var[index]},将会打印处索引为index的内容
4 以清单形式打印处数组中的所有值,${array_var[*]}
5 打印数组的长度${#array_var[*]}
6 在关联数组中,我们可以使用任意的文本做为数组索引,在普通数组中,只能用整数做为索引
7 首先我们需要单独的声明语句将一个变量名声明为关联数组declare -A ass_array
1.7 使用别名
1 别名有多种实现方式,可以使用函数,也可以使用alias命令
2 可以按照以下方式来创建一个别名 alias new_command='command'
3 alias命令的作用只是暂时的,我们要写在~/.bashrc中,然后用source ~/.bashrc这样就可以长久的使用别名
4 如果要删除别名,我们可以使用unalias或者直接删除~/.bashrc
1.8 获取终端信息
1 获取终端的行数和列数 tput cols 和 tput lines
2 打印当前的终端名 tput longname
3 删除当前光标位置到行尾的所有内容 tput ed
1.9 获取/设置日期和延时
1 我们使用date来打印处日期
2 打印纪远时 date +%s,纪远时被定义为从世界标准时间1970年1月1号0时0分0秒至当前时刻的总秒数
3 用格式串结合+作为date命令的参数,可以按照你的选择打印出对应的格式和日期
4 我们可以使用sleep time来延时time秒
5 tput sc是用来存储光标位置,tput rc是恢复光标位置,tput ed是清除从当前光标位置到行末的内容
1.10
1 使用-x,启动跟踪调试shell脚本,运行带有-x标志的脚本能够打出所执行的每一行命令及当前状态
2 针对每一种情况,我们可以在脚本中设置启用或是禁止调试打印
set -x 在执行时显示参数和命令
set +x 禁止调试
set -v 当命令进行读取时显示输入
set +v 禁止打印输入
3 我们可以直接使用shebang #!/bin/bash改成#!/bin/bash -xv不用其它显项直接进行调试
1.11
1 函数定义
function fname(){
statements
}
或者是
fname(){
statements
}
2 只要使用函数名就可以调用某个函数 fname,就会执行fname函数
3 参数可以传递给函数 fname arg1 arg2
4 类似地,参数可以传递给脚本并通过script来访问
$1 是第一个参数
$2 是第二个参数
$n 是第n个参数
$@ 被扩展成"$1" “$2" "$3"
$* 被扩展成"$1c$2c$3",其中c是IFS的第一个字符
$@ 用的比较多,由于$*把所有的参数都当作单个字符串,因此很少被利用
5 在bash中每一条命令执行之后都会返回一个值,如果是0表示执行成功,其它表示执行失败
1.12
1 我们使用管道pipe来连接每一个过滤器,例如$cmd1 | cmd2 | cmd3,这里组合了三个命令,cmd1输出传递给cmd2,而cmd2传递给cmd3,最终输出将会被打印或导入某个文件
2 我们有两种方法取得命令序列的输出
第一种:output=$(cmd),这样就会把cmd命令的结果输出到output上
第二种:output=`cmd`,这样就会把cmd命令的结果输出到output上
3 假设我们使用子shll或反引用的方法将命令的输出读入一个变量中,可以将它放入双引号中,以保留空格和换行符
1.13 字段分割符和迭代器
1 内部字段分割符IFS是shell脚本中一个重要的概念,默认的IFS是空白字符(换行符,制表符或者空格)
2 我们可以轻松的生成不同序列
echo {1..50} 这样能够生成一个从1到50的序列
echo {a..z} 这样能够生成a到z的序列
3 for循环
for i in list
do
statements
done
4 while循环
while condition
do
statements
done
1.14 比较和测试
1 if条件
if condition
then
statements
elif condition
statements
else
statements
fi
2 我们可以使用逻辑运算符来减少if else的使用
[ condition ] && action 如果condition条件为真,那么执行action
[ condition ] || action 如果condition条件为假,那么执行action
3 算术比较
-eq: 相等
-ne: 不相等
-gt: 大于
-lt: 小于
-ge: 大于等于
-le: 小于或等于
4 文件系统相关测试
[ -f $file ] 如果给定的文件是普通文件则返回真
[ -x $file ] 如果给点的文件具有执行权限则返回真
[ -d $file ] 如果给点的文件是目录则返回真
[ -e $file ] 如果文件file存在则返回真
[ -c $file ] 如果给定的文件是字符设备文件则返回真
[ -b $file ] 如果给点的文件是块设备文件则返回真
[ -w $file ] 如果给点的文件具有可些权限则返回真
[ -r $file ] 如果文件file具有可读权限则返回真
[ -L $file ] 如果给点的文件file是一个符号链接文件则返回真
5 字符串比较
1 使用字符串比较的时候,最好使用双中括号,因为有时候采用单个中括号会产生错误
2 [[ $str1 = $str2 ]],当str1等于str2的时候,返回真
[[ $str1 != $str2 ]],当str1不等于str2的时候,返回真[[ $str1 > $str2 ]],当str1大于str2的时候,返回真
[[ $str1 < $str2 ]],当str1小于str2的时候,返回真
[[ -z $str ]]如果str是空字符串返回真
[[ -n $str ]]如果str是非空字符串则返回真
6 test命令同样可以用来执行条件检测,有助于避免过多的括号