shell简介
分为两种c shell 和b shell
b shell:sh、ksh、Bash、psh、zsh; (Bash和sh兼容,linux基本shell是Bash)
c shell:csh、tcsh; (语言风格类似C语言,所以得名c shell)
查看系统shell :cat /etc/shells
echo
echo -e "ab\bc" #输出ac
echo -e "\e[1;31m abcd \e[0m" #输出红色的abcd,30m黑色,31m红色,32m绿色,33m黄色等
\a 发出警告声;
\b 删除前一个字符;
\c 最后不加上换行符号;
\f 换页;
\n 换行且光标移至行首;
\r 回车;
\t 插入tab,水平制表符;
\v 垂直制表符;
\\ 插入\字符;
\0nnn 插入nnn(八进制)所代表的ASCII字符;
\xhh 插入hh(十六进制)所代表的ASCII字符;
脚本执行
chmod 755 my.sh
./my.shbash my.sh
如果是dos过来的脚本,换行符和linux中不一样不能直接执行,使用dos2unix命令
yum update -y dos2unix
history
history -c #清楚历史命令
history -w #将历史强行写入.bash_history 而不是等登出后
!n #执行history 第n个
!! #执行上一条命令
!字符串开头 #执行最近的字符串想同的命令
vi /etc/profile #修改保存历史的默认条数
alias
alias vi="vim"
unalias vi
vi /root/.bashrc #使别名永久生效
命令执行的顺序
- 第一顺序为绝对路径或相对路径执行的命令
- 别名
- Bash内部命令
- 按照环境变量$PATH中定义的目录找到第一条命令
快捷键
ctrl+a #将光标移动到命令开头
ctrl+c #终止命令
ctrl+z #暂停命令,并且放入后台
ctrl+u #剪切光标前的命令部分
ctrl+k #剪切光标后的命令部分
ctrl+y #粘帖命令
ctrl+l #清屏
标准输入输出
/dev/stdin #标准输入的设备文件名,文件描述符0
/dev/stdout #标准输出的设备文件名,文件描述符1
/dev/stderr #标准错误的设备文件名,文件描述符2
ls > my.txt #覆盖方式将ls命令结果标准输入到my.txt,出错则不会写入文件,直接输出在屏幕中
ls aa 2>> my.txt #因为没有aa文件,追加方式将错误追加到my.txt,有aa文件则对my.txt无任何影响。
命令>文件 2>&1 #覆盖方式将正确输出和错误输出都保存在同一个文件中
命令 &>>文件 #追加方式将正确输出和错误输出都保存在同一个文件中
命令>>文件1 2>>文件2 #正确输出追加到文件1,错误输出追加到文件2
wc
wc -c my.txt #显示文本的字符数
wc -l my.txt #显示文本的行数
wc -w my.txt #显示文本的单词数
wc -c <my.txt #显示文本的字符数
wc -l < my.txt #显示文本的行数
wc < my.txt #显示文本的单词数,字符数,行数
wc <<hello
ad
dsd
decho
hello
多命令执行
; #命令直接没有任何关系
&& #前面命令无错,再执行后面的,否则不执行后面的命令
|| #前面命令错误,再执行后面的,否则不执行后面的命令
ls /root/hehe || echo 'no'
ls /etc/services && ll
命令 && echo yes || echo no
管道符
命令1 | 命令2 #命令1的正确输出作为命令2的操作对象
grep
grep 'ss' /etc/services
grep -i 'ss' /etc/services #忽略大小写
grep -n 'ss' /etc/services #显示行号
grep -v 'ss' /etc/services #查找不存在ss的行
通配符
?
*
[]
[a-g]
[^0-5]
Bash中其他特殊符号
'' #在单引号中所有特殊符号都没有特殊含义
"" #在双引号中所有特殊符号都没有特殊含义,除了$、`、\
`` #反引号,反引号括起来的是系统命令,在Bash中会先执行它,同$()。不推荐,容易看错
$() #引用系统命令
#
$
\
四种变量
用户自定义变量 #Bash中,变量默认类型都是字符型,若要进行数值运算,必须指定为数值型。
#变量定义用等号连接,等号两侧不能有空格
#变量值中可以用反斜杠转义
#只在当前shell中生效
#name=12
#echo $name
#查看所有变量: set
环境变量 #尽量大写,以便区分
#当前shell和所有子shell中生效,这是指的临时环境变量
#如果将环境变量写入配置文件,则在所有的shell中生效。
#临时:
#声明变量: export 变量名=变量值
#查询变量: env
#删除变量: unset 变量名
#进入子shell: bash
#退出当前shell: exit
#查看shell树形结构: pstree
#PS1系统提示符:可以算是系统变量,但是env并不能查看到。
#设置PS1: PS1='[\u@\t \w]\$ '
#设置临时环境变量 PATH="$PATH":/root
位置参数变量 #预定义变量中的一种,因为多,所有单独列出。固定的,是用来向脚本中传递参数或数据的。
#$n $0表示命令本身或者文件名,$1,第一个参数,$2.第二个参数。。。
#$* 把所有参数看成一个整体
#$@ 类似$*,但是把每个参数区分对待
#$# 参数个数
预定义变量 #$? 最后一次命令的返回状态,0表示正确,非0表示上一个命令执行不正确。
#$$ 当前进程的进程号PID
#$! 后台运行的最后一个进程的进程号PID
read
read -s -t 30 -n 3 -p "input a number" yournumber #-s隐藏输入的数据,-t秒数,-p提示,-n数字。
三种运算方式
aa=11
bb=22
declare -i cc=$aa+$bb # -i 声明为整数类型,-p 显示被声明的类型,-x 声明为环境变量
echo $cc
aa=11
bb=22
dd=$(expr $aa + $bb) #注意空格
echo $dd
aa=11
bb=22
ff=$(( $aa+$bb )) #推荐
echo $ff