欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  科技

linux shell笔记

程序员文章站 2022-06-11 18:10:26
1.基本命令 touch 创建空文件(当然,你也可以使用echo >filename) ln 创建链接符号(快捷方式|引用): 区别: ls –i 查看文件inode编号(唯一的,可以确认文件是否为同一个,类似于hash值) mv 移动|重命名 file 查看文件(文件夹)类型等信息 cat 显示内 ......

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