linux shell笔记
1.基本命令
touch 创建空文件(当然,你也可以使用echo >filename)
ln 创建链接符号(快捷方式|引用):
- 符号链接:ln –s
- 硬链接:ln
区别:
- 符号链接产生了一个快捷方式,是对源文件的一个链接。
- 硬链接是底层字节的链接,简单来说,相当于是一个文件,两个文件名,占用同一块扇区,好处是省空间,即便删除一个,只要还有硬连接,这个文件就依然存在。
ls –i 查看文件inode编号(唯一的,可以确认文件是否为同一个,类似于hash值)
mv 移动|重命名
file 查看文件(文件夹)类型等信息
cat 显示内容 -n:所有行号 ;-b:有字加行号;-t:不显示制表符;
more 按页显示;例如:cat xxx |more
tail 查看文件结尾;-n number(或-number):指定最后几行;-f:追踪,可以动态追踪日志文件。
head 与tail类似,不过没有-f参数
ps 进程
top 显示linux进程(linux版任务管理器)
kill 干掉进程
df 查看硬盘空间
sort 文件内容排序
grep 搜索文本
$bash_subshell 子shell检测变量
sleep timecount(s)
句子结尾加&:后台模式运行
jobs 工作
(command 1;command 2…) 任务列表,可以同时执行
coproc 协程(后台有个子shell,执行你的命令,同时生成一个job)
which 查看命令程序所在位置
history 命令历史记录
!! 上一个历史命令(省着按向上箭头了)
!number 第n条历史命令被执行
环境
printenv 查看环境变量(env只能查看所有的全局变量); 本命令支持查看某条变量(不需要加美元符号,echo需要)
set 查看|设置环境变量
export 到处变量为全局变量,就可以在各种shell中使用了(并不能使shell的父shell环境变量发生变化)
unset 删除环境变量
passwd (chpasswd) 密码查看|修改
umask 为文件分配默认权限
chmod 更改权限
chown 改变归属权
分区
fdisk 分区;p:显示基本设备信息;n:new个分区;w:write进设备
mkefs 格式化ext分区;
mke2fs 格式化ext2分区;
mkfs.ext3 格式化ext3分区;
mkfs.ext4 格式化ext4分区;
mkreiserfs 格式化reiserfs分区
jfs_mkfs 格式化jfs分区
mkfs.xfs 格式化xfs分区
mkfs.zfs 格式化zfs分区
mkfs.btrfs 格式化btrfs分区
fsck 检查修复分区 -a:自动检测修复;-a:列出fstab中所有分区,并检测;-c:显示支持的文件系统检测时的进度条(ext2、3);-s:多个文件系统依次检查;
lvm 可以添加多个硬盘到一个卷组(整合为一个大分区也没有问题),可以创建快照,镜像。
如何创建lvm物理卷?使用fdisk t来改变分区类型(为8e);或使用pvcreate创建,pvdisplay查看创建进度;
vgcreate 创建卷组(为物理卷);例如:vgcreate vol1 /dev/sda1;vgdisplay查看进度
lvcreate 创建逻辑卷;例如:lvcreate –l 100%free –n lvtest vol1;lvdisplay查看进度
淡淡这样还不够!!!还要有文件系统,如ext4的lvm:mkfs.ext4 /dev/vol1/lvtest。上述创建了一个ext4类型的逻辑卷lvtest。还要手动挂载:mount /dev/vol1/lvtest /mnt/my_partation
lvm的一堆管理命令:
vgchange 激活和禁用卷组
vgremove
删除卷组
vgextend
将物理卷加到卷组中
vgreduce
从卷组中删除物理卷
lvextend
增加逻辑卷的大小
lvreduce
减小逻辑卷的大小
2.shell编程
变量是宽松的定义,任何由字母、数字或下划线组成的文本字符串,长度不超过20个。用户变量区分大小写,所以变量 var1 和变量 var1 是不同的。
shell编程最强大的地方在于可以从console的输出中取回这些输出,并随便利用,一旦这样做,则可以利用shell做任何事情了,只要你能在console中输出它。
如何从shell中获取输出的内容?两种方法:
- 反引号符号;
- $();
例如,使用date命令可以输出当前时间,如果写shell脚本的话,可以通过如下两种写法获取console的date:
1 date=$(date); 2 date=`date`;
字符串如果合并的话,直接各种引号,而不需要+或者其他的操作,如:
str1="string1"; str2="string2"; str3=$str1$str2;
输出或引用一个变量,则可以:
echo $str3;
输出重定向:>
在已有的文件中追加内容:>>
输入重定向:<
内联输入重定向:<<
管道:|
实际上,windows console中也支持管道.
例如,之前用more对console的内容进行分页:ls -al |more
既然是管道,必然支持很多管道,虽然可能只会用到两个
shell中计算:expr
例如计算1+2:
expr 1 + 2
#注意上式的空格,运算符间都是有的
arg1 |arg2 | 如果arg1既不是null也不是0,返回arg1;否则arg2 |
arg1 & arg2 | 如果没有参数是null或零值,返回 arg1 ;否则返回 0 |
< | 如果 arg1 小于 arg2 ,返回 1 ;否则返回 0 |
<= | 如果 arg1 小于或等于 arg2 ,返回 1 ;否则返回 0 |
= | 如果 arg1 等于 arg2 ,返回 1 ;否则返回 0 |
!= | 如果 arg1 不等于 arg2 ,返回 1 ;否则返回 0 |
>= | 如果 arg1 大于或等于 arg2 ,返回 1 ;否则返回 0 |
> | 如果 arg1 大于 arg2 ,返回 1 ;否则返回 0 |
+ | |
- | |
* | |
/ | |
% | |
string : regexp | 如果 regexp 匹配到了 string 中的某个模式,返回该模式匹配 |
match string regexp | 如果 regexp 匹配到了 string 中的某个模式,返回该模式匹配 |
substr string pos length | 返回起始位置为 pos (从 1 开始计数)、长度为 length 个字符的子字符串 |
index string chars | 返回在 string 中找到 chars 字符串的位置;否则,返回 |
index string chars | 返回字符串 string 的数值长度 |
+ token | 将 token 解释成字符串,即使是个关键字 |
(expression) | 返回 expression 的值 |
需要注意,尽可能的把运算符号之前加上转义字符,否则很可能会导致expr收到错误!
例如 expr 1 * 2
所以,bash shell为了保持跟bourne shell的兼容而包含了 expr 命令,但它同样也提供了一种更简单方法来执行数学表达式。在bash中,在将一个数学运算结果赋给某个变量时,可以用美元符和方括号( $[ operation ] )将数学表达式围起来。
这样,就相当方便了,还是1+2,则可以写成:
$[1+2]
而根本不需要考虑空格的问题~~~
这里需要注意的是,bash shell本身不支持浮点数运算,所以可以利用其他的方法:
bash计算器:bc;
使用bash需要注意,精度(scale)默认为0,所以需要设置:scale=0
bc本身支持定义变量
在脚本中使用bc:
echo “scale=4;1/2” |bc # 或 echo “scale=4;print 1/2” |bc
更好的方法是使用内联输入重定向(<<):
#!/bin/bash var1=10.46 var2=43.67 var3=33.2 var4=71 var5=$(bc << eof scale = 4 a1 = ( $var1 * $var2) b1 = ($var3 * $var4) a1 + b1 eof ) echo the final answer for this mess is $var5
## eof既是输入的开始,又是输入的结束,所以计算没有问题的
脚本退出命令:
exit exitcode
查看退出代码:
echo $?
退出代码意图:
0 命令成功结束 1 一般性未知错误 2 不适合的shell命令 126 命令不可执行 127 没找到命令 128 无效的退出参数 128+x 与linux信号x相关的严重错误 130 通过ctrl+c终止的命令 255 正常范围之外的退出状态码
条件结构:if,then,elif,fi
if command #注意是command不是condition! then commands elif command then commands ... else commands ... if command then commands fi fi #或 if command;then commands fi
test
如何是condition呢?答案是:
test,即if行由command 后面改为:
test condition
数值比较
例如:
ret=1 if test ret -eq 1 then echo ret is 1 fi
至于里面的-eq,则是判断条件的一种形式:等于。
test 命令的数值比较功能 |
说明 |
等效 |
n1 -eq n2 |
== | = |
-ge |
>= | >= |
-gt | > | < |
-le | <= | <= |
-lt | < | < |
-ne | != | != |
test的另一种写法是:
[ condition ] #注意方括号都和condition有空格的!!!
例如,将test子例改写一下,即:
ret=1 if [ ret -eq 1 ] then echo ret is 1 fi
test可以做:
数值比较
字符串比较
文件比较
字符串比较
str1=str2 | == |
!= | |
< | len |
> | len |
-n | len>0 |
-z | len=0 |
特别需要注意容易犯错误的地方在于符号会与bash本身的一些符号冲突而导致执行出错!!!包括:
<,>.
所以要进行转义,即:
\>,\<.
文件比较
-d file | 存在目录 |
-e file | exist |
-f file | 存在文件 |
-r file | read |
-s file | 文件空 |
-w file | write |
-x file | execute |
-o file | own |
-g file | group |
file1 -nt file2 | new than |
file1 -ot file2 | old than |
如何简单的获取条件判断时条件的结果呢?
test 1 \= 1;echo $?
上句测试,为真,显示0
注意:test的两个参数,不应该在其中计算,而应该在之前的步骤完成,否则可能会得到错误的结果!!!(亲测)
例如:一定存在$home,所以test -e $home 必然为真(0)。
但是,假设$home中不存在123目录或文件夹,则test -e $home/123依然会返回0.
而按照我写的注意,写为x1=$home/123;test -e $1;echo $?则会返回1,即真实结果.
所以一定要注意这种情况!
更多的条件:
&&,||
更高级的数值条件:(())
val++ | |
val-- | |
++val | |
--val | |
! | 非 |
~ | 按位非 |
** | 幂 |
<< | |
>> | |
& | 按位与 |
| | 按位或 |
&& | 逻辑与 |
|| | 逻辑或 |
测试过程中,发现,还支持很多操作:==,!=,<,>,<=,>=,+,-,*,/.
此外,(())不需要转义以及空格!!!
更高级的字符串条件:[[]](20章)
高级功能:regex,
更高级的条件结构:case
case variable in pattern1 | pattern2 ) commands1 ;; pattern3 ) commands2 ;; *) default commands ;; esac
更多的结构化:for
for var in list do commands done
上面所说的list,其实可以是字符串(每个项以空格分开,如果想避免项中有空格,则可以为每个项加一对引号,如果同时存在引号,最好转义,用另一种引号次之)。
看来,这个for用着还是没有编程语言的方便,如果想执行100次某些命令,那么需要生成一个具有100项的列表。
for star in $(ls) do echo "111 $star" done
上一篇: <1>Linux日志查找方法