bash基础
安装man命令行
1
2
3
4
|
sudo apt-get install manpages-zh
# 安装 中文的 man手册
alias cman='man -M /usr/share/man/zh_CN'
# 设置中文
|
bash基础
linux 系统中一般默认使用 bash, 文件开头需要些
#! /bin/bash
, 指定 bash为脚本解释器
运行的几种方式:
- 可执行文件执行,需要脚本有执行权限
chmod + x test.sh && ./test.sh
- 解释器执行
bash testh.sh
bash 注释
- 单行注释
#
- 多行注释
- 行首
:<<EOF
- 行尾
EOF
使用变量
type命令判断变量类型
type返回的几种类型
- alias 别名
- keyword 关键字,shell保留字
- function 函数,内建函数
- builtin 内建命令,shell内建 命令
- file 文件,磁盘文件,外部命令
- unfound 没有找到
1
2
3
|
name=1
echo ${name}111
|
只读变量
1
2
3
4
5
|
name=123
readonly name
# 定义为只读变量
# 方法2
declare -r name
|
参数变量
变量表 【常用】
参数 |
说明 |
$# |
代表文件传入的参数个数, |
$* |
由所有参数构成的空格隔成的字符串 例如 $1 $2 $3 |
$@ |
由每个参数分别用双引号括起来的字符串 $1 $2 |
$$ |
脚本当前运行的进程ID |
$? |
上一条命令的退出状态,(exit code) 。 0 表示正常退出其他就是错误 |
$(command) |
返回 command 这条命令的 stdout |
`command` |
返回 command这条命令的 stdout |
|
|
expr 命令
1
2
3
4
5
6
7
8
9
|
str = "hello world!"
echo `expr length "$str"`
echo `expr index "$str" aWd`
echo `expr substr "$str" 2 3`
a=1
b=1
echo `expr \(a + b \) * \(c + d \)`
|
read 命令
read命令用于从标准输入中读取单行数据。当读到文件结束符时,exit code为1,否则为0。
参数说明:
-p
: 后面可以接提示信息
-t
后面跟秒数,定义输入字符的等待时间,超过等待hijack后自动会忽略此命令
1
2
3
4
|
read name
echo $name
read -p "input your name" -t 5 name
echo "your name is $name"
|
echo 命令
使用方法
显示转义字符
1
2
|
echo \"hello world \"
echo "\" hello world \""
|
显示变量
1
2
|
name=LYR
echo "MY name is $name"
|
解释特殊字符【开启转义】
1
2
|
echo -e "HELLO \n"
echo "hello"
|
输出结果
显示不换行
1
2
|
echo -e "HI \c" # -e 开启转义, \c 不换行
echo "FUCK"
|
显示命令执行的结果
输出元字符,不转义
不转义的话,用单引号
test命令
案例: 判断文件是否存在
test参数 |
代表意义 |
-e |
文件是否存在 |
-f |
是否为文件 |
-d |
是否为目录 |
-eq |
equals |
-ne |
!= |
-gt |
greater than > |
-le |
less than < |
-ge |
>= |
-le |
<= |
-x |
文件是否可执行 |
-r |
是否可读 |
-w |
是否可写 |
-s |
是否非空文件 |
字符串比较
test参数 |
代表意义 |
test -z String |
判断 String是否为空,空返回 true |
test -n string |
判断是否非空 |
test s1 == s2 |
判断s1和 s2是否相等 |
test s1!= s2 |
判断 字符串不相等 |
1
2
3
4
|
test -e deploy.sh && echo "exist" || echo "NOT exist"
# 判断文件是否存在
test -e filename
|
判断大小相等
1
2
|
test 2 -lt 3 # 2<3, true
echo $? # 输出上一个命令的返回值,输出 0, 0表示true, 非0表示false
|
多重条件
1
|
test -r filename -a -x filename
|
test参数 |
代表意义 |
-a |
两个条件同时成立 |
-o |
至少一个 |
! |
取反, test ! -x file, 当file 不可执行时候,返回 true |
[] 符号
[]
和 这个 test
用法都一模一样,但是更加常用于 if 语句
1
2
3
|
[ 2 -lt 3] # 为真
echo $?
[ -e test.sh ] && echo "exist" || echo "not found"
|
使用 [] 的细节
[]
最好每一项都用 空格隔开
- 括号内的变量最好用 双引号括起来
- 中括号内常数,最好用单引号或者双引号括起来
1
2
3
4
5
|
name="hello world"
[ $name == "HELLO WORLD" ] # 这个是错误的,因为 没有双引号
[ "$name" == "HELLO WORLD"] # 这个才是正确的
type [ # 这边 [ 其实是 shell的一个内置命令
|
判断语句
if 命令
1
2
3
|
if [ -e file ]
then echo "FUCK"
fi
|
if-else语句
case命令
1
2
3
4
5
6
7
8
9
10
11
12
|
case $变量名称 in
值1)
语句1
语句2
值2)
语句3
*)
语句4
;;
esac
# case 的结束就是 case单词反过来
# if 结束符号也是 单词反过来写 fi
|
for 循环
基本语法
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
|
for var in val1 var2 var3
do
语句1
语句2
done
# 使用命令的方式做
for file in `ls`
do
echo $file
done
# 输出 1-10
for i in $(seq 1 10)
do
echo $i
done
# bash 内嵌写法
for i in {1..10}
do
echo $i
done
# 条件表达式
for (( exp1; exp2; exp3) )
do
语句1
done
## 例如
for (( i=1;i<=10;i++))
do
echo $i
done
# shell 里面, 0表示真,1表示假----------
# read 读入
while read name
do
# 这边read 读到返回0 ,表示真,继续读
echo $name
done
# 输出偶数
for ((i=1;i<=10;i++))
do
if [ `expr $i % 2` -eq 0 ]
then
continue
fif
done
|
util…do…done 循环
当条件为真,就结束
1
2
3
4
5
|
# 知道用户输出 quit结束
until ["$word" == "quit"] || ["$word" == "QUIT"]
do
read -p "input your command: " word
done
|
其他常用操作
ctrl l
清屏(鼠标往上滚还能看到之前的内容)
ctrl shift + 增大字体
ctrl - 减小字体
cd -
回到上一次停留的目录
history 历史命令(每条有一个number)
!number
快速执行history里的某个指定命令
!! 指代上一个命令 例如: sudo !! 上一条命令加上sudo再次执行
ctrl r
历史命令搜索模式 输入关键字 ctrl r搜索下一个 回车执行当前搜索结果中的命令
tail -f -n 50 /fileName
滚动查看指定文件的最后50行(日志内容更新可以实时看到)
cmd1; cmd2 一次执行多个命令 前面报错了后面继续跑
cmd1 && cmd2 一次执行多个命令 前面的报错了后面的不执行
cmd1 || cmd2 前面失败后面才跑
ctrl z 当前程序最小化缩到后台
fg 把上一步中缩到后台的程序重新放到前台来
some output | column -t
输出内容按列显示 【让输出更容易阅读】
pushd 当前目录入栈
popd 目录栈弹出一个元素 并跳转到该目录
truncate -s 0 filename 清空指定文件(避免删除再重建)