Linux相关
/proc/$PID
:表示进程的文件/dev/null
:垃圾箱,黑洞
shell内部构造
- 变量:变量分为:局部变量,环境变量,shell变量。
- shell变量:一部分是局部变量,一部分是环境变量,对shell很重要。比如:
IFS
,PS1
是局部shell变量 - 环境变量使用
export
进行导出,环境变量可以让子进程继承
- shell变量:一部分是局部变量,一部分是环境变量,对shell很重要。比如:
.bashrc
:在每次创建bash进程时会执行一次- 标准输入输出以及对应的文件描述符:
stdin-0
,stdout-1
,stderr-2
。
bash
特殊符号总结
反引号
:子shell,若要获得值,直接var=`command`
即可。单引号
:字符串,原样双引号
:字符串,支持转义字符和变量[]
:算术运算[[]]
:是[]
在用作条件运算时的扩展{}
:将变量和周围的字符串隔离开来,如echo "some strange ${Java}Script"
()
- 子shell:
(ls)
或var=$(ls)
- 数组:
array=(1 2 3)
- 子shell:
(())
:算术运算$
:表示取出变量的内容,直接取出变量的值相当于执行命令var=(expr 3 + 4); $var;
语句格式
#
:注释:
:空语句- 一般语句没有分号要求
变量
- 声明:等号前后不能有空格:
var="acc"
- 读取:
echo ${var}
- 删除变量:
unset var
- 只读变量
字符串
- 单引号:原样打印:
var='test_acc'
- 双引号:计算变量:
acc="aod ${var}"
- 获得字符串长度:
echo ${#var}
- 单个字符查找:需要借助
expr
:echo `expr index ${var} char`
- 子串:
echo ${str:start:length}
- 还有很多字符串操作,截取等
# ## % %%
数组
- 数组元素可以为空,元素类型可以不同
- 定义数组
array_1=(1 2 3); # 整体 array_2[1]=23; # 分开来 array_3=( # 支持换行 1 2 )
- 数组操作
- 获得某个元素:
echo ${array[index]}
- 获得所有元素:
echo ${array[*/@]}
。 - 获得元素数量:
echo ${#array[*/@]}
- 获取所有索引:
echo ${!array[*/@]}
。(对于散列数组很有用)
- 获得某个元素:
- 关联(散列)数组:需要先声明
declare -A array_hash array_hash=([a]=aa [b]=bb); array_hash[c]=cc;
运算
- 算术运算:不推荐使用原生算术运算
- 算术运算:子shell + 命令的方法。(expr必须有严格的空格,因为空格区分参数)
var=$(expr 5 + 4); var=`expr 5 + 4`
- 整数关系运算:只能用于判断语句中,空格要求
-eq
,-ne
,gt
,lt
,ge
,le
,-a
,-o
if [[ 23 -eq 24 -o 24 -eq 34 ]]; ...
- 字符关系运算
=
,!=
,-z
,-n
if [[ "acc" = "bibi" ]]; ...
- 文件关系运算符
- 是否存在,是否是符号连接,是否是目录,是否是块设备,等等等
- 可以使用
test
指令进行判断,可用于if
中
命令参数
$x
特殊变量。可用于终端,脚本,函数- - - - - - $0
名称 $n
参数 $$
PID $#
参数数量 $*
所有参数 $@
所有参数 $?
退出状态
函数
- 一般格式,可以不用换行
[function] func_name[()] { action; [return int;] }
条件控制
- if
if [[ $(ps -ef | grep -c "sh") -gt 1 ]]; then echo "sh than 1"; elif [[ $(ps -ef | grep -c "sh") -lt 1 ]]; then echo "sh not than 1"; fi
- case:采用模式进行匹配,使用
;;
作为终止,使用*
作为默认。用于字符串模式匹配时,不要引号case $name in *saku*) echo "1"; ;; *) echo "2"; ;; esac
循环控制
- for
for var in item1 ... itemN; do action; done
- while,支持
break
与continue
while condition; do action; done
- until
until condition; do action; done
输入输出重定向
n>
,n<
:将一个文件重定向到另一个文件。n
表示文件描述符
,0
是stdin,1
是stdout,2
是stderr>>
表示将输出追加到文件末尾n>& m
表示将输出文件n
合并到输出文件m
。两者都是文件描述符
- 当使用
command > file
时实际发生了:command
输出到stdout
,stdout
重定向到file
|
:管道运算符:将标准输出重新作为标准输入<<tag
:表示将标记之间的内容作为输入
# 将stderr合并到stdout,将stdout输出到文件中。顺序不能改变
ls + . > file 2>&1;
# 将stdout输出到file1,将stderr输出到file2
ls + . >file1 2>file2;
# 将整个作为grep命令的输入,可以理解为替代管道符号 |
grep s <<!
not s
yes
is s
!
文件包含
. file
或source file
:将文件包含到当前文件中。
#命令
*/bin命令
tr
:替换字符串:cat /proc/$PID/environ | tr "\0" "\n"
tee
:将标准输入一方面输入到文件,另一方面到标准输出echo "string" | tee file1.txt file2.txt | cat
sort
:对行进行排序sort file.txt; cat file.txt | sort;
cat
:读取显示文件。# 拼接标准输入 echo "some text" | cat - file; echo "some text" | cat /dev/stdin file;
echo
:printf
:用法同C语言
pgrep
:得到符合模式字符串的PID
expr
- 四则运算(
+
,-
,\*
,/
,%
,=
)只支持整数。注:乘号需要转义 - 比较运算(
==
,!=
)还支持字符串
- 四则运算(
read
:获取键盘输入,可以直接将结果存在变量中:read result
find
:会递归寻找给定目录下的所有文件find . \( -name "*.sh" -o -name "*.py" \) -print
xargs
:可用于将标准输入的内容格式化
;也可用于将标准输入作为命令的参数
;echo "/dev" | xargs ls; # v echo "/dev" | ls; # x
md5sum
:文件校验和split
:文件分割
bash内命令
alias
unalias
:别名。别名是暂时的,可以将操作追加到.bashrc
使别名在每个终端生效。echo 'alias install="sudo apt install"' >> ~.bashrc