linux shell笔记

1.基本命令

touch 创建空文件(当然,你也可以使用echo >filename)

ln 创建链接符号(快捷方式|引用):

  1. 符号链接:ln –s
  2. 硬链接:ln

区别:

  1. 符号链接产生了一个快捷方式,是对源文件的一个链接。
  2. 硬链接是底层字节的链接,简单来说,相当于是一个文件,两个文件名,占用同一块扇区,好处是省空间,即便删除一个,只要还有硬连接,这个文件就依然存在。

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中获取输出的内容?两种方法:

  1. 反引号符号;
  2. $();

 例如,使用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
#注意上式的空格,运算符间都是有的
表11-1 expr 命令操作符
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可以做:

 数值比较
 字符串比较
 文件比较

字符串比较

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
原文地址:https://www.cnblogs.com/absudra/p/9572706.html