# shell快速入门
简介
shell 是一个 C 语言编写的脚本语言,它是用户与 Linux 的桥梁,用户输入命令交给 Shell 处理,
Shell 将相应的操作传递给内核(Kernel),内核把处理的结果输出给用户
常见的shell
shell分类
-
bash(常见)
- bash shell 是 Linux 的默认 shell
-
zsh
-
sh
-
csh
-
ash
查看当前的shell
-
cat /etc/shells
- /bin/sh
- /bin/dash
- /bin/bash
- /bin/rbash
- /bin/zsh
- /usr/bin/zsh
查看默认的shell
- echo $SHELL
- /bin/bash
切换shell
- 切换bash chsh -s /bin/bash
- 切换zsh chsh -s /bin/zsh
小技巧
- 按tab键可以补全命令
注释
-
单行注释
-
多行注释
:<<EOF
注释内容...
注释内容...
注释内容...
EOF
linux命令
echo "some text": 将文字内容打印在屏幕上
ls: 文件列表
wc –l filewc -w filewc -c file: 计算文件行数计算文件中单词数计算文件中的字符数
cp sourcefile destfile: 文件拷贝
mv oldname newname : 重命名文件或移动文件
rm file: 删除文件
grep 'pattern' file: 在文件内搜索字符串比如:grep 'searchstring' file.txt
cut -b colnum file: 指定欲显示的文件内容范围,并将它们输出到标准输出设备比如:输出每行第5个到第9个字符cut -b 5-9 file.txt
cat file.txt: 输出文件内容到标准输出设备(屏幕)上
file somefile: 得到文件类型
read var: 提示用户输入,并将输入赋值给变量
sort file.txt: 对file.txt文件中的行进行排序
uniq: 删除文本文件中出现的行列, sort file.txt | uniq
expr: 进行数学运算, expr 2 "+" 3
find: 搜索文件, 根据文件名搜索find . -name filename -print
tee: 将数据输出到标准输出设备(屏幕) 和文件, somecommand | tee outfile
basename: 返回不包含路径的文件名比如, basename /bin/tux将返回 tux
dirname file: 返回文件所在路径比如, dirname /bin/tux将返回 /bin
head file: 打印文本文件开头几行
tail file : 打印文本文件末尾几行
sed: 基本的查找替换程序。可以从标准输入(如命令管道)读入文本,并将结果输出到标准输出(屏幕),采用正则表达式进行搜索, 将linuxfocus 替换为 LinuxFocus :cat text.file | sed 's/linuxfocus/LinuxFocus/' > newtext.file
awk: 从文本文件中提取字段。缺省字段分割符是空格,可以使用-F指定其他分割符, cat file.txt | awk -F, '{print 3 }'以","为字段分割符,同时打印第一个和第三个字段。"Adam Bor, 34, IndiaKerryMiller, 22, USA"的输出结果为:"Adam Bor, IndiaKerry Miller, USA"
第一个shell脚本
vim hello.sh
输入内容
-
! /bin/bash
echo "hello world"
- 声明执行脚本的解释器
- 在控制台输出 hello world
保存退出
- esc
:wq
给hello.sh授权
- chmod +x hello.sh
执行脚本
-
指定解释器 执行文件
bash hello.sh
-
或者使用默认的解释器执行
./hello.sh
调试
- echo:最简单的调试命令
- sh -x myscript:执行该脚本并显示所有变量的值
- sh -n myscript:检查语法,语法错误
特殊概念
管道 |
-
将一个命令的输出作为另外一个命令的输入
可以使用多个命令 -
例如
- 在file.txt中搜索包含有"hello"的行并计算其行数, grep "hello" file.txt | wc -l
重定向 > 与 >>
-
将命令的结果输出到文件,而不是标准输出(屏幕)
-
写入文件并覆盖旧文件
-
加到文件的尾部,保留旧文件内容。
反短斜线 -
- 以将一个命令的输出作为另外一个命令的一个命令行参数
- 查找过去24小时内修改过的文件并打一个包, tar -zcvf lastmod.tar.gz
find . -mtime -1 -type f -print
基础语法
变量
-
命名建议规则
- 变量名大写
- 局部变量小写
- 函数名小写
- 名字体现出实际作用
-
常见的系统变量
-
$SHELL
- 默认 Shell
-
$HOME
- 当前用户家目录
-
$PWD
- 当前目录
-
$USER
- 当前用户
-
$PATH
- 默认可执行程序路径
-
$UID
- 当前用户 ID
-
$HOSTNAME
- 主机名
-
-
普通变量
-
语法格式
- 变量名=值
- 注意等号两边不要有空格
-
var=value
-
-
临时环境变量定义
- export var=value
-
特殊变量
-
$0
- 脚本自身名字
-
$?
- 返回上一条命令是否执行成功,0 为执行成功,非 0 则为执行失败
-
$#
- 位置参数总数
-
$*
- 所有的位置参数被看做一个字符串
-
$@
- 每个位置参数被看做独立的字符串
-
$$
- 当前进程 PID
-
$!
- 上一条运行后台进程的 PID
-
-
使用变量
- $变量
- ${变量}
参数传递
-
特殊变量
-
$#
获取传递参数的个数
-
$*
以字符串的形式显示所有参数
-
$$
脚本运行的当前进程ID号
-
$!
后台运行的最后一个进程的ID号
-
$?
检测脚本 0表示没有错误,其他任何之都是表明有错误
-
-
示例代码
-
!/bin/bash
-
echo "shell 传递参数"
echo "执行的文件的名称:$0"
echo "第一个参数为: $1"
echo "第二个参数为: $2"
数据类型
-
数字类型
-
字符串
-
单引号,双引号
-
区别
- 单引号是告诉 Shell 忽略特殊字符,
- 而双引号则解释特殊符号原有的意义,比如$、!
-
-
数组
基本运算符
-
分类
- 算术运算符
- 关系运算符
- 布尔运算符
- 字符串运算符
- 文件测试运算符
-
说明
- 原生bash不支持简单的数学运算,但可以使用其他命令实现 expr(最常用)、awk
-
栗子
- val=
expr 2+2
echo "求值结果:$val"
- val=
-
其它
!/bin/bash
a=2
b=3echo
expr $a + $b
echoexpr $a - $b
echoexpr $a \* $b
# 做乘法需要添加斜杠转义
echoexpr $b / $a
echoexpr $b % $a
c=c"
if [ b ]
then
echo "a 等于 b"
else
echo "a 不等于 b"
fiif [ c ]
then
echo "b 等于 c"
fiif [ b ]
then
echo "a 不等于 b"
fiif [ b ]
then
echo "c 不等于 b"
fi
流程控制
if:如果条件为真则执行then后面的部分
-
if ....; then
....
elif ....; then
....
else
....
fi -
测试命令
- [ -f "somefile" ] :判断是否是一个文件
- [ -x "/bin/ls" ] :判断/bin/ls 是否存在并有可执行权限
- [ -n "var 变量是否有值
- [ "b" ] :判断b 是否相等
- 执行 man test 可查看所有测试表达式可以比较和判断的类型
快捷操作符
-
&&
-
左边的表达式为真则执行右边的语句
- [ "b" ] && echo "equal!"
-
-
||
-
左边的表达式为假则执行右边的语句
- [ "b" ] || echo "different!"
-
case:匹配一个给定的字符串,而不是数字
- case ... in
...) do something here ;;
esac
select:从一组不同的值中进行选择
- select var in ... ; do
break
done
.... now $var can be used ....
loop:循环
-
while-loop:运行直到表达式测试为真
- while ...; do
....
done - break:跳出循环
- continue:不执行余下部分直接跳到下一循环
- while ...; do
-
for-loop:查看一个字符串列表 (用空格分隔) 然后将其赋给一个变量
- for var in ....; do
....
done
- for var in ....; do
XMind - Trial Version