Shell 看完就会用
2018-02-03 本文已影响239人
司鑫
SHELL
一 什么是 Shell
shell 直译为壳,shell 是一个命令解释器,处于内核和用户之间,负责把用户的指令传递给内核并将执行结果回显给用户,同时 shell 也是一门编程语言。
shell 之所以被称为 shell ,是因为它隐藏了操作系统的底层细节。Unix 下的一些图形用户界面如 GNONE 、KDE... 也被称为是 “虚拟 shell”
二 常见的几种 shell
- Bourne Shell (sh):它是 Unix 的默认 shell,也是其它 shell 的开发基础,但是在交互方面不如其它 shell,sh 的创始人是 Steven Bourne,为了纪念他也是以他的名字来命令
- C Shell(csh):csh 的语法和 C 语言很类似,在交互方面有了很大的改善如:命令不全,命令别名等,但是 csh 和 sh 不兼容
- Korn Shell(ksh):是 csh 的一个加强版,集合了 csh 和 sh 的优点,并且兼容 sh
- Bourne Again Shell (bash):是自由软件基金会(GNU)开发的一个Shell,它是Linux系统中一个默认的Shell。Bash不但与Bourne Shell兼容,还继承了C Shell、Korn Shell等优点。
- Zsh:在兼容 bash 的同时提供了更多的改进
三 常用功能
- 历史命令
- 查看历史记录
history // 查询历史记录,显示最近使用的2000条命令(默认两千)
- 修改显示记录数
vi /etc/profile //修改环境变量配置文件
HISTSIZE=1000 //修改默认历史命令条数
source /etc/profile 使环境变量生效
- 把内存中的命令历史保存到文件中(历史默认保存在
~/.bash_history
文件中)
打开 terminal 后,我们在没有关闭 terminal 前,在当前 terminal 的操作命令会保存在内存中,直到当前 terminal 关闭后,内存中的命令历史才会被写入到~/.bash_history
文件中。
如果我们需要强制将内存中的命令历史保存在~/.bash_history
文件中,使用
history -w //把内存中命令历史,保存入文件
- 清空历史
history -c
- 重复历史命令
!n //重复第n条命令
!str //重复最后一个以str开头的命令
上箭头 //调用上面的命令
- 别名
- 查看系统中已有的别名
alias
- 设置别名
alias ls='ls --color=never' 手工设定别名,临时生效
vi ~/.bashrc 在 ~/.bashrc 写入别名,永久生效
-
输出重定向
即把输出在屏幕上的信息重定向到文件中(比如 log 信息)
> 覆盖
ls > aa 将 ls 命令显示的信息覆盖到 aa 文件中
>> 追加
ls >> aa 将 ls 命令显示的信息追加到 aa 文件中
ls gdlslga 2>>aa 将错误信息输出到 aa 文件中(ls gdlsga 命令会出错)
ls >> aa 2>>bb 将正确信息输出到 aa 文件中,错误信息输出到 bb 中
ls >> aa 2>&1 将正确和错误信息都追加在 aa 中
- 多命令顺序执行
-
命令1 ; 命令2 ; 命令3
//命令123顺序执行。之间没有任何关系 -
命令1 && 命令2
//命令1正确执行后,命令2才会执行 -
命令1 || 命令2
//命令1执行不正确,命令2才会执行
- 管道符
命令1 | 命令2
//命令1的执行结果,作为命令2的执行条件
netstat -tlun | grep 80 查询监听的端口号,并查看80端口是否启动。
- 键盘读取
read -p “提示信息” [-t 等待时间] 变量名
# example.sh #
#!/bin/bash
read -p "please input num1:" -t 30 test1
read -p "input num2:" -t 30 test2
sum=$(( $test1 + $test2))
echo “num1 + num2 = $sum”
-
数值运算
变量默认是字符串类型,进行数值运算可有下面三种方法
num1=123
num2=456
1 declare -i sum=$num1+$num2
2 sum=$(( $num1 + $num2 ))
3 sum=$(expr $num1 + $num2) 注意+左右必须空格
支持的运算操作 + - \* / %取余
四 变量
变量设定规则
- 变量以等号连接值,等号不能有空格
- 变量名由数字和字母和下划线组成,不能以数字开头
- 变量值中有空格,用引号括起来
- 双引号内,有特殊字符。如$
- 单引号中特殊字符无含义
- 在变量值中,可以使用\转义符
- 变量值可以直接调用系统命令。 `命令` $(命令)
- 变量值可以累加 aa=123 aa="$aa"456 echo $aa --->123456
- 环境变量一定设为大写
- 本地变量
- 声明
变量名=变量值 注意:=号左右不能有空格
aa=123
- 调用
echo $aa
- 查看变量
set 查看所有变量,包括环境变量和本地变量
- 删除
unset 变量名
- 环境变量
- 声明
export 变量名=变量值
- 查看
set 查看所有变量
env、export 只查看环境变量
- 声明变量类型
declare 声明变量类型的,如果不特别声明,所有变量为字符串型
-i 声明为int
-x 声明为环境变量
- 删除
unset 变量名
- 环境变量配置文件
/etc/profile
/etc/bashrc 所有用户生效
~/.bashrc
~/.bash_profile 只对指定用户生效
-
位置参数变量
在执行 shell 脚本时手动传入参数
eg:
sh example.sh a b
# example.sh #
#!/bin/bash
echo "the command is $0" // $0 代表命令自己
echo "param1 is $1" // $1 代表第一个参数即 a
echo "param2 is $2" // $2 代表第一个参数即 b
五 常用命令
- 行提取命令 grep
选项:
-v 反向
-n 显示行号
grep “\.$” test.txt -n // 匹配以 . 结尾的行并显示行号
- 列提取命令 cut
cut -d “分隔符” -f 提取列 文件名
more /etc/passwd | grep "/bin/bash" | cut -d ":" -f 1,3
提取passwd文件中可以登录的用户的用户名和UID
六 条件判断
格式
test 测试条件 测试内容
或
[ 测试条件 测试内容 ] // [] 中必须有空格
- 测试文件类型
test -e 文件名 测试文件是否存在,存在为真
test -f 文件名 判断是否是普通文件
test -d 文件名 判断是否为目录
test -b 文件名 判断是否为块设备文件
test -c 文件名 字符设备文件
- 测试文件权限
test -r 文件名 判断是否有可读权限
test -w 文件名 可写
test -x 文件名 执行
test -s 文件名 判断是否为非空白,有内容为真
- 两个文档比较
[ file1 -nt file2 ] file1是否比file2新
[ file1 -ot file2 ] file1是否比file2旧
[ file1 -ef file2 ] file1与file2是否是链接文件
- 两个数值之间判断
[ n1 -eq n2 ] n1和n2是否相等
[ n1 -ne n2 ] n1和n2是否不等
[ n1 -gt n2 ] n1大于n2
[ n1 -lt n2 ] n1小于n2
[ n1 -ge n2 ] n1大于等于n2
[ n1 -le n2 ] n1小于等于n2
- 判断字符串
[ -z 字符串 ] 判断字符串是否为空
[ 字符串1 == 字符串2 ] 判断字串1 是否与字串2相等
[ 字符串1 != 字符串2 ] 判断字串是否不等
- 多重判断
-a 逻辑与
[ -z $file -a -e $file ]
-o 逻辑或
! 逻辑非
七 流程控制
- if 语句
- 单分支
if 条件测试命令
then 命令序列
fi
- 双分支
if 条件测试命令
then 命令序列1
else 命令序列2
fi
- 多分支
if 条件测试命令1 ; then
命令序列1
elif 条件测试命令2 ; then
命令序列2
elif ...
else
命令序列n
fi
- for 语句
- 使用in关键字循环
for 变量名 in 取值列表
do
命令序列
done
eg:
for time in morning noon afternoon evening
do
echo $time
done
files=$(ls) //遍历 ls 的结果
for time in $files
do
echo $time
done
- 数值加加循环
s=0
for ((i=1;i<=100;i=i+1))
do
s=$(($s+$i))
done
- while循环语句
while 命令或表达式
do
命令列表
done