当前shell执行命令。./或者source
新建shell:/bin/bash ./file.sh bash
$$;当前进程pid
pstree:查看进程关系。
文本流
输出重定向:干预0,1,2输出的数据,将输出到控制台的数据,输出到指定文件里
ls 1> te:覆盖
ls 1>> te :追加。
将1,2各输出到一个文件:
ls / /ccc 1>>t1 2>>t2
将1,2输出到同一个文件:
ls / /ccc 1>t.txt 2>&1
ls / /ccc >& t.txt
ls / /ccc &> t.txt
如果ls / /ccc 2>&1 1>t.txt,错误输出重定向到1,而此时的1却仍然定向到控制台,下一个1才重定向t.txt,所以报错会输出到控制台,而正确的会输出到t.txt.
0 标准输入
1标准输出
2错误输出
输入重定向:
read aaa <<< "hello xxx"
echo $aa
hello xxx
read aaa <<ab
ab停止输入
cat 0<file:
exec:
type -a ls
变量:
变量定义:
1.变量名=变量值
2.变量名='变量值',不解析变量值的内容,整体
3.变量名=“变量值” 变量值中如果有变量存在,先解析变量,再
拼接。
命令变量:将命令作为变量
变量名=``
变量名=$(命令)
注意使用命令变量时,注意初次定义才会执行。
如,
变量的访问:
1.$变量名 ,空
2."$变量名" 空字符串,保证变量不存在,得到是空字符串。
3.${变量名} 区分是否有变量名
4."${变量名}" 2,3合并,
unset 变量名 取消变量名
变量分类:
本地变量:在当前shell,生命周期随shell
局部变量:,只能用于local函数,当前函数中使用。
local a
全局变量:当前系统所有的环境使用
env # 只显示全局变量
export 变量名=值:子bash继承父bash,不能跨bash。比如新开终端。
shell内置变量/位置变量:
$0:获取脚本名
$1,$2,${11} $1,接受参数。
-脚本 -函数使用
数组a=(1 2 3)
特殊变量;
$*:参数列表 双引号引用为一个字符串
$@:参数列表,双引号引用位单独的字符串
$#:参数个数
$?执行上一个命令成功,返回0,失败非0
$BASHPID:真实pid
$$:当前shellpid,接收者
管道:2.开启子bash。
获取变量名长度:
name=1111
echo ${#name}
4
替换变量的部分值:
${变量名//匹配值/替换后值}
字符串截取
${变量名:strat:截取长度}
b=12456
echo ${b:0-3:2}
取变量后几个值时:
echo ${变量: -数字},注意空格,否则输出变量值。
echo ${变量#匹配符},匹配从左到右,截取匹配后的字符,取右边
echo ${变量##匹配符},匹配从右到左,截取匹配后的字符,取右边
echo ${变量%匹配符},匹配从右到左,截取匹配后的字符,取左边
echo ${变量%%匹配符},匹配从左到右,截取匹配后的字符,取左边
执行字符串拼接后的命令
#! /bin/bash
a="ls /root/"
$a
默认值相关
1.${变量:-默认值}
有变量输出变量值,没有就是默认值输出
2.${变量:=默认值}
变量不存在,将默认值赋值给变量,输出。
3.${变量:+提示信息}
变量存在的时候,输出提示信息
echo ${a:+eee}
eee
表达式:
test 条件表达式
[ 条件表达式 ]
状态返回值,真值0
-eq 等于
-gt 大于
-lt 小于
-le 小于等于
-ge 大于等于
-ne 不等于
字符串比较:
str1 == str2
str1 != str2
逻辑表达式:
&& 和
如果命令1执行成功,那么执行命令2
如果命令1执行失败,那么不执行命令2
或者 ||
如果命令1执行成功,那么不执行命令2
如果命令1执行失败,那么执行命令2
文件表达式:
-f 判断输入内容是否是一个文件
-d 判断输入内容是否是一个目录
-x 判断输入内容是否可执行
计算表达式:进行算数计算
$((计算表达式)):+-*/,只能做整数运算
let 计算表达式
& :将命令从前台转到后台。
grep
-c:只输出匹配行的计数
-n 显示匹配行及行号
-v:匹配不包含匹配文本的所有行。
-r:所有文件搜索。
find 【路径】【参数】【关键字】
参数:
-name 文件名查找
-perm 文件权限查找
-user 文件属主来查找文件
-group 文件所属的组
!:取反命令。
流程控制:
分支语句:
if
if [ 条件 ]
then
指令1
elif [ 条件2 ]
then
指令2
else
指令3
fi
case
case 变量名 in
值1)
指令1
;;
值n)
指令n
;;
*)
指令
;;
esac
循环语句:
for 值 in 列表
do
执行语句
done
while 条件
do
执行语句
done
until 条件
do
执行语句
done
函数:
函数名(){
命令
}
函数名
shell内参数:
dayin(){
echo "wo de mingzi shi $1"
}
dayin 111
脚本传参:
canshu ="$1"
dayin(){
echo"wo de mingzi shi $1"
}
dayin "${canshu}"