快捷搜索:
来自 67677新澳门手机版 2019-06-15 16:04 的文章
当前位置: 67677新澳门手机版 > 67677新澳门手机版 > 正文

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条历史命令被执行

11.5.1输出重定向

将命令的内容重定向到文件

Command > outfile

比如:who > test6  不存在则创建,存在则覆盖

pwd >> test6  这样会追加

 

环境

printenv 查看环境变量(env只能查看所有的全局变量); 本命令支持查看某条变量(不需要加美元符号,echo需要)

set 查看|设置环境变量

export 到处变量为全局变量,就可以在各种shell中使用了(并不能使shell的父shell环境变量发生变化)

unset 删除环境变量

passwd (chpasswd) 密码查看|修改

umask 为文件分配默认权限

chmod 更改权限

chown 改变归属权

11.5.2 输入重定向

1.将文件的内容重定向到命令

小于号  <

wc命令可以对数据中的文本进行计数。

默认会输出文本的行数,文本的词数,文本的字节数

比如:

wc < test6

 图片 1

2.内联输入重定向:无需使用文件进行重定向,只需要在命令行中指定用户输入重定向的数据就可以了。

符号:  <<

还需要指定一个文本标记来划分输入数据的开始和结尾,任何字符串都可以作为文本标记,但在数据的开始和结尾文本标记必须一致。

 图片 2

比如这样,输入xcy表示结束。Wc命令对内联输入重定向提供的数据进行行、词、字节数的计数,直到输入了作为文本标记的那个字符串。

 

更高级的字符串条件:[[]](20章)

高级功能:regex,

11.7.2 使用方括号

比expr方便多了。还不同担心乘号或其它符号。

在shell脚本中进行算数运算会有一个主要的限制:只支持整数运算

比如:

#!/bin/bash

# expr test:

var1=10

var2=20

var3=$[$var2 / $var1]

var4=$[$var2 $var1]*

var5=$[$var2 $var2 $var1]*

echo The var3 result is $var3

echo The var4 result is $var4

echo The var5 result is $var5

 条件结构: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

11.8 退出脚本

Shell中运行的每个命令都使用退出吗告诉shell它已经运行完毕。

退出码是一个0 – 255的整数值。

 更多的结构化:for

for var in list
do
commands
done

上面所说的list,其实可以是字符串(每个项以空格分开,如果想避免项中有空格,则可以为每个项加一对引号,如果同时存在引号,最好转义,用另一种引号次之)。

看来,这个for用着还是没有编程语言的方便,如果想执行100次某些命令,那么需要生成一个具有100项的列表。

for star in $(ls)
 do 
    echo "111 $star"
done

 

11.5 重定向输入和输出

字符串比较

test字符串比较测试
str1=str2 ==
!=  
< len
> len
-n len>0
-z len=0

特别需要注意容易犯错误的地方在于符号会与bash本身的一些符号冲突而导致执行出错!!!包括:

<,>.

所以要进行转义,即:

>,<.

11.8.2 exit命令

默认情况下,shell脚本会以脚本中的最后一个命令的退出状态码退出。

也可以改变这种行为

这么写: exit 5

再在终端中查看一下:

 图片 3

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 正常范围之外的退出状态码

11.7.3 浮点解决方案

有几种解决方案,最常见的是用内建的bash计算机,叫做bc

1.bc的基本用法

bash计算机实际上是一种编程语言,它允许在命令行中输入浮点表达式,然后解释并计算表达式

直接输入bc,进入计算机:

 图片 4

 

Bash计算机设置好scale后就可以显示小数了。

还支持变量

 

2.在脚本中使用bc

可以用命令替换运行bc命令,并将输出赋值给一个变量

格式如下:

Variable=$(echo “options; expression” | bc)

比如:

#!/bin/bash

var=$(echo "scale=4; 13 / 10" | bc)

echo var is $var

var1=300

var2=45

var3=$(echo "scale=4; $var1 / $var2" | bc)

echo var3 is $var3

var4=$(echo "scale=4; $var3 $var2 2" | bc)*

echo var4 is $var4

 

上面的方法适用于较短的运算,涉及到很多数字时就会有点麻烦。

解决方案:bc命令能识别输入重定向,允许将一个文件重定向到bc命令来处理。最好的方案是使用内联输入重定向,它允许你直接在命令中重定向数据。

Varible=$(bc << EOF

Options

Statements

Expressions

EOF

)

 图片 5

比如:

#!/bin/bash

var1=10

var2=9

var3=8

var4=7

var5=$(bc << EOF

scale = 4

a1 = ($var1 $var2)*

a2 = ($var3 $var4)*

a2 a1 a1*

a2

EOF

)

echo var4 is $var5

EOF标识了内联重定向数据的起止,记住,仍然需要命令替换符号将bc命令的输出赋给变量

将选项和表达式放在脚本的不同行可以让处理过程变得清晰。

还可以在bash计算机中赋值给变量,在bc计算机中创建的变量只在bc计算机中有效,不能再shell脚本中使用

 

分区

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 减小逻辑卷的大小

11.7.1 expr 命令:允许在命令行上处理数学表达式

对于那些容易被shell错误解释的字符,在它们传入expr命令之前需要使用转义字符将其标出来。

比如:

#!/bin/bash

# expr test:

var1=10

var2=20

var3=$(expr $var2 / $var1)

#var4=$(expr $var2 $var1)   Error,*

var4=$(expr $var2 \ $var1)*

echo The var3 result is $var3

echo The var4 result is $var4

有一个expr命令操作符表可以看一下。

test

如何是condition呢?答案是:

test,即if行由command 后面改为:

test condition

11.8.1 查看退出状态码

如何查看:echo &?

惯例是一个成功结束的命令的退出码是0,如果一个命令结束时有错误,退出状态就是正整数。

 

更多的条件:

&&,||

11.1使用多个命令

$date;who   //  命令列表,加入分号就可以,这样会依次执行。参见5.2.1节

注意区分$(date;who),这个是进程列表,会生成一个子shell来执行

Shell脚本的关键在于输入多个命令并处理每个命令的结果,甚至需要将一个命令的结果传给另外一个命令。

Shell可以让你将多个命令串起来,一次性完成。

 

上面的date;who可以写入一个文件,这样就不用在命令行敲命令了,运行这个文本文件就好了。

 

本文由67677新澳门手机版发布于67677新澳门手机版,转载请注明出处:Linux命令行与shell脚本编制程序大全

关键词: