变量的定义:
1.=左右不要有空格
2.如果内容有空格,需要使用单引号括起来
3.双引号支持转义 $开头的变量会
a=1
b=severiruby
d="hello from testerhome"
e='hello from "大家伙"'
f=`ls`
变量的使用:
echo:是向屏幕输出
echo $a
单引号:括起来的内容包括$x,都会被当成字符串
双引号:括起来的内容中的$x,会被引用
反引号:反引号里面的内容会被当成一个命令去执行
a=`ls`
echo $a 输出:输入当前目录的显示的文件
array=(`ls`) 将当前目录下的文件赋值一个变量
echo ${array[@]} 输出:当前目录下的所有显示的文件
;(分号)表示一行命令的结束即放在多行执行
例如:
a=123
echo 'this is $a' 输出是:this is $a
echo "this is $a" 输出是:this is 123
打印没有定义的变量:
例如:a=123
echo ${a}_1 输出:123_1
预定义变量:
echo $PWD:打印当前目录的路径
echo $UESR:打印的用户
echo $HOME:打印当前的家目录
echo $PATH:打印当前的环境变量
which:只会在当前的环境变量里面去查找
数组:一个连续的内存段,或者可以理解为一个集合
数组的定义:用小括号括起来,用空格分隔开
array=(1 2 3 4 5)
echo ${array[@]} 取出所有的值,@加上双引号还是被当做数组来处理
echo ${array[*]} 取出所有的值,*加上双引号会被当成字符串来处理
echo ${array[2]} 取出下标为2的值
特殊字符:
1.反斜杠:\ 转义字符
2.$(()),对变量进行操作,例如加减乘除
a=1;b=3
echo $((a+b))
3.$(ls) 表示ls执行后的结果,与``反引号类似,不过可以嵌套
4.``反引号,代表命令的输出
5.(()) 是整数扩展,把里面的变量当做整数去处理
a=1;b=2
(($a>$b));echo $? 输出结果为:1 1>2结果是错误的,所以显示1
(($a<$b));echo $? 输出结果为:0 1<2结果是正确的,所以显示0
$?:表示上个语句的执行结果
在bash里面0代正确,1代表错误的
array=(`seq 1 10`) 创建1到10的数组
数字变量操作:
a=1
echo $(($a+1))或者
((a+=1))
echo $a
字符串操作:
s='hello from testerhome'
echo ${s:6:3}
第一个参数存储的字符串的变量
第二个参数是从第几项开始,包括这一项
第三个参数是从第几项结束,包括这一项
${#s}:计算字符串的长度
去掉头部:
echo ${s#hello}:删除字符串开头的“hello”,默认去掉后面空格
echo "${s#hello}":加上双引号不会去掉后面的空格
echo ${s#*o}:删除“o”以前的字符(包括本身),非贪婪匹配,值匹配到第一个
echo ${s##*m}:贪婪匹配,删除字符串中所以有m之前的字符串(包括m本身)
去掉尾部:
echo ${s%h*}:从后面是删除,已"h"开头的后面的字符(包括其本身),非贪婪匹配
echo ${s%%o*}:贪婪匹配,删除所有已"o"开头的后面的字符(包括其本身)
替换:
echo ${s/testerhome/severiruby} :用severiuby替换testerhome
echo ${s/h/xxx}:将字符串中第一个h字符替换成xxx,非贪婪替换
echo ${s//h/xxx}:
布尔变量:
true
false
❖ 命令执⾏返回值 $?
❖ 任何命令执⾏都会有⼀个返回值
❖ 0表⽰正确
❖ ⾮0表⽰错误
算数判断:
[ 2 –eq 2 ] 相等
❖ [ 2 –ne 2 ] 不等
❖ [ 3 –gt 1 ] 大于
❖ [ 3 –ge 3 ] 大于等于
❖ [ 3 –lt 4 ] 小于
❖ [ 3 –le 3 ] 小于等于
❖ (())也可以表⽰算术⽐较。((10>=8)) ,((10==10))
字符串比较:
a="test";b="hello test"
[ $a = $b ] :如果两个字符串相等,则结果为真
[ $a != $b ] : 如果两个字符串不相同,则结果为真
[ -n "$a" ] : 如果字符串不是空,则结果为真
[ -z "$a" ] : 如果字符串是空,则结果为真
逻辑判断:
-a:与--只有一个为假,则结果为假
-o:或--只要一个为真,则结果为真
[ 2 -ge 1 -a 3 -ge 4 ];echo $? 表示:1大于等于1与3大于等于4,求“与”,结果为:假
[ 2 -ge 1 -o 3 -ge 4 ];echo $? 表示:1大于等于1与3大于等于4,求“或”,结果为:真
[[ 2 -ge 1 && 3 -ge 4 ]];echo $? 与
[[ 2 -ge 1 || 3 -ge 4 ]];echo $? 或
[ ! 2 -ge 1] 非 表示2不大于等于1,结果为假
if 条件判断;
then
为真时执行的语句;
else
为假时执行的语句;
fi
if [ -e 1.txt ];then echo exist;else echo not exist;fi 如果1.txt是文件,那么输出exist;否则,输出not exist
简写:
ls 1.txt && echo exist || echo not exist 如果1.txt存在,输出exist;否则输出not exist
[ -e test ] || echo exist && echo not exist
||:表示当判断为false的时候执行
&&:表示当判断为true的时候执行
for 语法:
for ((i=0;i<10;i++));
do
满足条件是执行的语句
done
不满足条件是执行
for循环:
例子:
数组:用小括号括起来
array=(a b c d e)
for ((i=0;i<${#array[*]};i++));do echo ${array[i]};done
for遍历循环:
例子:
array=(a b c d e)
for x in ${array[*]};do echo $x;done
遍历目录下的所有文件:
for x in *;do echo $x;done
while循环:
i=0;
while ((i<3));do
echo $i;
((i=i+1));
done
while read line;do echo $line;done < 2
循环读取文件2中字符
read:读入一个标准输入
read -p "enter:" x;echo 我刚刚输入了:$x
-p:想当于input
退出循环:
break:直接跳出循环
for x in *;do echo $x;if [ -d $x ];then break;fi;done
continue:跳出本次循环,进入下次循环
for x in *;do echo $x;if [ -f $x ];then $x is file;else continue;fi;done
$$:获取当前的进程号
(a=1;echo $a):小括号表示的子shell
{a=1;echo $a}:大括号表示当前的语句块
&;放在后台执行进程
$!:获取后台的最后一个进程的进程号
jobs:显示后台运行的进程
fg:将从后台进程放到前台执行
vim文件中的操作:
set number 设置行号
set nonu 取消行号
gg 跳转到文件头部 (在esc模式下)
GG 跳转到文件尾部 (在esc模式下)
在文件中复制:
在esc模式下,按住v,按上下左右进行选中要复制的内容,然后在按v,再按p进行复制
>:表示将内容输出到某个文件,并且第二次输出,会覆盖上一次的内容
>>:不会覆盖上一次的内容
echo "hello testerhome" > 1.txt
<:将某个文件中内容输入
read x < 1.txt
将错误信息输入到某个文件:
ls ddd > a 2>&1:将错误信息写入到a,2>&1是固定的
Shell 输入与输出
echo ,printf可以简单输出变量。
> file 将输出重定向到另⼀个⽂件
>> 表示追加 等价于tee -a
< file 输⼊重定向
| 表示管道,也就是前一个命令的输出传一个命令的输入
echo "* ????":放入到引号中可以避免转义
Shell环境变量
set 可以获得当前的所有变量,declare
unset 可以释放变量
env 可以获得可以传递给⼦进程的变量
export aa=bbbb 把私有变量导出,等价于declare -x
Linux三剑客
grep:基于正则表达式查找满足条件的行,即数据查找定位
awk:根据定位到的数据行处理其中的分段, 即数据切片
sed :根据定位到的数据行修改数据, 数据修改