您的位置:首页 > 运维架构 > Shell

shell常用

2016-05-18 00:00 387 查看

shell 特殊变量

含义
$0当前脚本的文件名
$n传递给脚本或函数的参数。n 是一个数字,表示第几个参数。例如,第一个参数是$1,第二个参数是$2。
$#传递给脚本或函数的参数个数。
$*传递给脚本或函数的所有参数。
$@传递给脚本或函数的所有参数。被双引号(" ")包含时,与 $* 稍有不同,下面将会讲到。
$?上个命令的退出状态,或函数的返回值。
$$当前Shell进程ID。对于 Shell 脚本,就是这些脚本所在的进程ID。
传统if 从句子——以条件表达式作为 if条件
if [ 条件表达式 ]
then
command
command
command
else
command
command
fi

条件表达式

文件表达式

if [ -f file ] 如果文件存在
if [ -d ... ] 如果目录存在
if [ -s file ] 如果文件存在且非空
if [ -r file ] 如果文件存在且可读
if [ -w file ] 如果文件存在且可写
if [ -x file ] 如果文件存在且可执行

整数变量表达式

if [ int1 -eq int2 ] 如果int1等于int2
if [ int1 -ne int2 ] 如果不等于
if [ int1 -ge int2 ] 如果>=
if [ int1 -gt int2 ] 如果>
if [ int1 -le int2 ] 如果<=
if [ int1 -lt int2 ] 如果<

字符串变量表达式

If [ $a = $b ] 如果string1等于string2
字符串允许使用赋值号做等号
if [ $string1 != $string2 ] 如果string1不等于string2
if [ -n $string ] 如果string 非空(非0),返回0(true)
if [ -z $string ] 如果string 为空
if [ $sting ] 如果string 非空,返回0 (和-n类似)

参考:http://www.dutycode.com/post-46.html

------------------------------------------------------------------------------------

所有UNIX命令,要取结果或输出,都要用$( )或反引号` `

------------------------------------------------------------------------------------

find $mypath -regex "${file_type}" | grep -v ".*test_" | xargs egrep -H "(${log_type})" | awk -F':'|~
'{print $1}' | sort |uniq | awk -F'/' '{print $NF}' |sort|uniq> $file_list

shell脚本regex正则表达式 和 字符串替换

参考:http://blog.163.com/keyan0002@126/blog/static/1704258202013926102515776/

其余命令均参考:http://www.cppblog.com/niewenlong/archive/2013/06/07/200843.html

------------------------------------------------------------------------------------

参考:http://www.cppblog.com/niewenlong/archive/2013/06/07/200843.html

------------------------------------------------------------------------------------

find ./ -regex "...."

find本身就是支持正则表达式的
find path -regex "xxx"
find path -iregex "xxx"[iregex忽略大小写]

但是给出的正则表达式必须要匹配完整的文件路径
比如:find / -regex "find" 这样子是找不到/usr/bin/find的,要find / -regex ".*find"或者更精确一点find / -regex ".*/find"

find 的-regex 与 -name的区别

1. 与-name, -iname最大的区别就在于 -regex是把find输出的整个结果(有别于绝对路径名)作为要匹配的对象, 而不仅仅是结果的最后一部分

[code=plain]举例
/tmp目录下有aaa, aa, 1, 2 这些文件
find -name "a*"可以找到aaa和aa
而find /tmp -regex "a*"就不行, 它一个都找不到, 因为找到的每个结果是这样的
/tmp/aaa
/tmp/aa
-name 是对结果中的"aaa"和"aa"这个部分进行匹配, 而-regex却是对完整的
"/tmp/aaa"和"/tmp/aa"进行匹配.
所以你要写作find /tmp -regex ".*a.*"

2. 注意上面的是.*而不是*

-name所能解释的是基于shell中file glob的匹配字符, 包括:

(1)*表示任意长度字符串
(2)?表示任意的单个字符
(3)[set] 表示一个可选字符集合
(4)[^set]或[!set]表示以ASCII为全集对[set] 求补集的一个集合 (5)brace expansion, 即把/tmp/{a,b,c}扩展为三个字串 /tmp/a /tmp/b 和/tmp/c 注意 shell的file globing机制往往不被认为是正则表达式. -regex接受的是"正统"的正则表达式 这个说起来东西多了, 基本上它跟emacs文档里讲的regex是一样的, 因为find手册里regex的解释部分实际就是链接到emacs 中讲解regex的那个部分. 在上面例子中最大区别就是.* 来表示任意长度字符串.

Linuxshell文件查找命令find详述,xargs : http://www.2cto.com/os/201409/336203.html
shell中Find命令的使用: http://blog.csdn.net/caomiao2006/article/details/12572965
find命令的使用要点:http://www.cnblogs.com/johnnyliu/archive/2013/04/09/3010384.html
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: