shell 常用命令

Shell中的 test 命令用于检查某个条件是否成立,它可以进行数值、字符和文件三个方面的测试。



#!/bin/sh



num1=100
num2=100
if test $[num1] -eq $[num2]
then
echo ‘两个数相等!’
else
echo ‘两个数不相等!’
fi



num1=”runoob”
num2=”runoob”
if test num1=num2
then
echo ‘两个字符串相等!’
else
echo ‘两个字符串不相等!’
fi



cd /bin
if test -e ./bash
then
echo ‘文件已存在!’
else
echo ‘文件不存在!’
fi



另外,Shell还提供了与( -a )、或( -o )、非( ! )三个逻辑操作符用于将测试条件连接起来,其优先级为:”!”最高,”-a”次之,”-o”最低。例如:



cd /bin
if test -e ./notFile -o -e ./bash
then
echo ‘有一个文件存在!’
else
echo ‘两个文件都不存在’
fi




Linux find 命令用来在指定目录下查找文件。任何位于参数之前的字符串都将被视为欲查找的目录名。如果使用该命令时,不设置任何参数,则 find 命令将在当前目录下查找子目录与文件。并且将查找到的子目录和文件全部进行显示。



find path -option [ -print ] [ -exec -ok command ] {} \;
查找前目录中文件属主具有读、写权限,并且文件所属组的用户和其他用户具有读权限的文件:



find . -type f -perm 644 -exec ls -l {} \;


为了查找系统中所有文件长度为0的普通文件,并列出它们的完整路径:



find / -type f -size 0 -exec ls -l {} \;



$* 和 $@ 都表示传递给函数或脚本的所有参数,我们已在《Shell特殊变量》一节中进行了演示,本节重点说一下它们之间的区别。



当 $* 和 $@ 不被双引号” “包围时,它们之间没有任何区别,都是将接收到的每个参数看做一份数据,彼此之间以空格来分隔。



但是当它们被双引号” “包含时,就会有区别了:
“$*“会将所有的参数从整体上看做一份数据,而不是把每个参数都看做一份数据。
“$@”仍然将每个参数都看作一份数据,彼此之间是独立的。



比如传递了 5 个参数,那么对于”$*“来说,这 5 个参数会合并到一起形成一份数据,它们之间是无法分割的;而对于”$@”来说,这 5 个参数是相互独立的,它们是 5 份数据。



由于Linux下变量都属于弱变量,没有变量类型的概念(貌似脚本语言都是这样)。



例如定义一个变量:x=1
1.使用$[]



  个人最常用的就是$[]方法进行计算,简单方便,适合不太复杂的计算。



  



x=1
echo $[$x+=1]
输出:2



 



2.使用expr



expr命令为Linux中的命令,一般用于整数值计算,但也可用于字符串操作。
使用格式:
expr var1 operator var2
 
例如:
x=1
expr $x + 4 
输出:5
 
注意:表达式之间的空格,注意只能进行整数运算,如果操作数不为整数,命令将会报错。
此命令所有计算的结果会以整数形式返回,例如上述的表达式变为:expr $x / 4 ,其结果为1,结果已经自动进行了取整操作。
 



 
3.使用(())
 
使用方法:((表达式1,表达式2,表达式3))
 
相比上面的两种方法,(())这种方法略显强大,它的强大之处在于:
1) 支持a++,a–操作(是不是找到C语言的感觉)
2) 支持多个表达式运算,各个表达式之间用“,”分开
3) 双括号可以进行逻辑运算,四则运算
4) 双括号结构 扩展了for,while,if条件测试运算
5) 在双括号结构中,所有变量可以不加入:“$”符号前缀
 
x=1
((y = x + 1,z = y + 1))
echo $z
输出:3
 
如果双括号带:$,将获得表达式值,赋值给左边变量
a=10
b=10
total=$((a*b))
echo $total
输出:100



4.使用 let 命令
var=1
let “var+=1” 或 let var+=1 这种写法运算符间不能有空格
echo $var



output:
2



使用方法:
let 表达式
注意:let必须是完整的算术表达式,即有等号两边



linux xargs命令的使用及其与exec、管道的区别
1、作用:



(1)将前一个命令的标准输出传递给下一个命令,作为它的参数,xargs的默认命令是echo,空格是默认定界符



(2)将多行输入转换为单行










2、使用模式:front command xargs -option later command


front command: 前一个命令



-option: xargs的选项



later command: 后一个命令



3、xargs常用选项



-n: 指定一次处理的参数个数



-d: 自定义参数界定符



-p: 询问是否运行 later command 参数



-t : 表示先打印命令,然后再执行



-i : 逐项处理



…更多参数查看man xargs



4、使用实例



测试文本:xargs.txt



a b c d e f g
h i j k l m n
o p q
r s t
u v w x y z



(1)多行输入单行输出










cat xargs.txt xargs


( 2)指定一次处理的参数个数:指定为5,多行输出










cat xargs.txt xargs -n 5


(3)自定义参数界定符:指定界定符为’m’










cat xargs.txt xargs -d m


(4)询问是否运行 later command 参数










cat xargs.txt xargs -n 5 -p


(5)将所有文件重命名,逐项处理每个参数










ls *.txt xargs -t -i mv {} {}.bak


更多参数选项查看man xargs










5、xargs与管道 的区别








用来将前一个命令的标准输出传递到下一个命令的标准输入,xargs 将前一个命令的标准输出传递给下一个命令,作为它的参数。


#使用管道将ls的结果显示出来,ls标准输出的结果作为cat的标准输出
ls | cat
#使用xargs将ls的结果作为cat的参数,ls的结果为文件名,所以cat 文件名即查看文件内容
ls | xargs cat



6、xargs与exec的区别



(1)exec参数是一个一个传递的,传递一个参数执行一次命令;xargs一次将参数传给命令,可以使用-n控制参数个数



#xargs将参数一次传给echo,即执行:echo begin ./xargs.txt ./args.txt
find . -name ‘.txt’ -type f | xargs echo begin
#exec一次传递一个参数,即执行:echo begin ./xargs.txt;echo begin ./args.txt
find . -name ‘
.txt’ -type f -exec echo begin {} \;



(2)exec文件名有空格等特殊字符也能处理;xargs不能处理特殊文件名,如果想处理特殊文件名需要特殊处理



#find后的文件名含有空格
find . -name ‘.txt’ -type f | xargs cat
find . -name ‘
.txt’ -type f -exec cat {} \;



原因:默认情况下, find 每输出一个文件名, 后面都会接着输出一个换行符 (‘\n’),因此我们看到的 find 的输出都是一行一行的,xargs 默认是以空白字符 (空格, TAB, 换行符) 来分割记录的, 因此文件名 ./t t.txt 被解释成了两个记录 ./t 和 t.txt, cat找不到这两个文件,所以报错,为了解决此类问题,  让 find 在打印出一个文件名之后接着输出一个 NULL 字符 (‘’) 而不是换行符, 然后再告诉 xargs 也用 NULL 字符来作为记录的分隔符,即 find -print0 和 xargs -0 ,这样就能处理特殊文件名了。
#xargs处理特殊文件名
find . -name ‘*.txt’ -type f -print0 | xargs -0 cat



Category linux