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为脚本解释器

运行的几种方式:

  1. 可执行文件执行,需要脚本有执行权限
    1. chmod + x test.sh && ./test.sh
  2. 解释器执行
    1. bash testh.sh

bash 注释

  1. 单行注释 #
  2. 多行注释
    1. 行首 :<<EOF
    2. 行尾 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
3
HELLO 

hello
显示不换行
1
2
echo -e "HI \c" # -e 开启转义, \c 不换行
echo "FUCK"
显示命令执行的结果
1
echo `date`
输出元字符,不转义

不转义的话,用单引号

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 清空指定文件(避免删除再重建)