Shell
shell是一个命令行解释器,用于接收应用用户或程序的命令。
解析器有:/bin/sh和/bin/bash,sh时bash的一个软件连接,默认为bash,在开头写#!/bin/bash,指定解析器,像include一样。
Bash shell是Linux默认的shell,bash会将输入过的命令记录到~/.bash_history中,可以直接通过history查看,还可以通过上下键找到输入过的命令, 可以通过type查看是否为内置命令。
变量
规则
- 使用一个定义过的变量,只要在变量名前面加$即可。
- 双引号里可以有变量。
- 双引号里可以出现转义字符。
- 单引号里的任何字符都会原样输出,单引号不会识别变量。
系统变量
- $PATH:环境变量,shell会到对于的路径下寻找命令或程序,通过修改/etc/profile.d可以添加自定义的环境到PATH。
- $HOME:当前用户的HOME目录。
- $SHELL :shell解析器路径。
- $LANG。
自定义变量
- 变量名=变量值,不能有空格。
- unset 变量名,删除变量。
- readonly 静态变量,不能改变删除。
特殊符号
- $ 美元符代表目前shell的PID,可以通过echo $$ 来显示当前shell的PID。
- ? 返回上个命令的返回值,执行成功就是0,不成功是非0。
- \ 通过反斜杠转义,反斜杠后按enter键就可以继续输入命令。
- 更多可以参考:添加链接描述
特殊变量
- $n:$0脚本名称 $1-$9为参数。
- $#:参数个数。
- $*:获取全部参数,一次性全部获取,相当于[ “$1$2$3” ]。
- $@:获取全部参数,一个一个获取,相当于 [ “$1” “$2” “$3” ]。
- $?:最后一次命令的返回状态,0正确执行,非0 错误(具体数值可以自己设定)。
export
自定义变量可以理解为局部变量,系统变量可以理解为全局变量,在获得一个bash后,再开启另一个bash时,这个bash就是子进程,而第一个bash是父进程,子进程会获取父进程的系统变量,而不会获取自定义变量。
export 变量名 #可以将自定义变量设置为环境变量。
declare、typeset
都是声明变量类型。
declare [-aixr] variable
-a: array
-i: integer
-x: export
-r: readonly
数组
${数组名[下标]} ,如valuen=${array_name[n]}
echo ${array_name[@]} @可以获取所有元素
# 取得数组元素的个数
length=${#array_name[@]}
# 或者
length=${#array_name[*]}
# 取得数组单个元素的长度
lengthn=${#array_name[n]}
管道和重定向
stdout:standard output,stderr:standard error output,两者都是将信息输出到屏幕上,stdout用于输出正确的信息,stderr输出错误的。
> 输出重定向:将输出信息被重定向到指定的地方。比如date命令会显示出时间,而如果使用date > time.txt 就会将显示的时间重定向到文件中,而不会显示出来了,再比如mkdir默认下是没有提示信息的,使用-v显示信息,mkdir -v 文件名
当不想看见错误信息时,可以 2> /dev/null,/dev/null就像是一个黑洞,这样就不显示信息出来。
stdin 代码为0 使用< or <<
stdout 1 > or >>
stderr 2 2> or 2>>
> 覆盖写,>> 以append的方式写入。
这样就可以将不同的数据区分开来。
列:find /home -name .bashrc > list_right 2> list_error #错误的信息会写入error,正确的写入right。
当需要将两种信息写在一起时,使用 &> 或者 2>&1
stdin:标准输入,由文件或者用户输入。
< 输入重定向:通过 < 可以将文件的内容作为输入内容。<< 表示结束的输入字符,比如
; && ||
- command;command: 通过;可以依次执行多个命令。
- command1&&command2:&&与,cmd1正确就执行cmd2,若cmd1错误,就不执行cmd2(与短路)。
- cmd1||cmd2:或||,cmd1正确就不会执行cmd2,cmd1错误就执行cmd2(或短路)。
管道pipe
管道只能处理前面一个命令传来的正确信息,也就是stdout。
执行方式
一共三种:
./name.sh
sh name.sh
source name.sh
通过 . 和 sh都是直接执行,这样会开启一个bash子进程。而通过source会任然在原本的bash内执行。
常用命令
cut、grep
cut -d 分隔字符 -f 取第几段
cut -c 以char为单位,取出固定字符区间
grep [-acinv] '查找字符' filename
-a:将二进制文件以文本文件的方式查找
-c:统计找到字符的次数
-i:忽略大小写
-n:显示行号
-v:反向选择
--color==auto:显示颜色
sort、uniq、wc
sort [选项] [filename/stdin]
-f:忽略大小写
-b:忽略前面的空格
-r:反向排序
-n:使用纯数字排序,默认使用文字
-u:相同数据,只出现一行
-t:分隔符,默认是tab
-k:指定根据那个区域排序
uniq [-ic] #将重复行只显示一个
-i:忽略大小写
-c:计数
wc [-lwm]
-l:仅列出行
-w:仅列出多少字
-m:多少字符
tee
双向重定位,使用tee可以将数据流分流到文件与屏幕,这样可以在分析文件时,还可以用于处理的记录。
xargs
xargs可以读入stdin的数据,以空格符、换行符将数据分隔成为参数,因此在处理一些有空格的文件名时,会发生误判。
xargs [-0epn] command
-0:当stdin中含有特殊字符时,会将其还原为普通字符
-e:EOF,后面接字符,当读取到这个字符时就会停止
-p:在每次执行命令时都会询问
-n:接次数,每次执行command时,要使用几个参数
sh
使用sh可以在不用直接运行脚本的情况下,测试脚本是否能够正常工作
sh [-nvx] name.sh
-n:不执行,仅查询语法问题
-v:在执行前,将内容输出到屏幕上
-x:将使用到的脚本显示
read
从键盘读取用户输入。
read [-pt] variable
-p: promot提示
-t: 等待的秒数,若超时read命令就会自动省略
-s: slient 没有显示,如在输密码时
条件判断、流程控制、函数
[ condition ]:条件判断符,两端必须要用空格隔开。括号内的变量最好用双引号。括号内每个组件用空格隔开。
name= "test"
[ ${name} ] [ "${name}" ] 两者不一样,第一种是 test 第二种是 "test"
流程控制:
if[ condition ]
then
程序
fi
------------------------------------
if[]
then
程序
else
程序
fi
------------------------------------
if[]
then
程序
elif[]
then
程序
else
程序
fi
------------------------------------
case $变量名 in
变量值1)
程序
;; //结束
变量值2)
程序
;; //结束
*) //相当于default
程序
;;
esac //整个cased的结束
------------------------------------
for var in con1 con2 con3 //第一次循var为con1,第二次con2,第三次con3
do
程序
done
-------------------------------------
for ((初始值;循环条件;变量变化)) //类似java for
do
程序
done
-------------------------------------
while [ condition ]
do
程序
done
函数:
function name() { 程序}