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

shell学习杂记(二)

2011-02-10 16:14 190 查看
type +命令名 可以查看该命令是内置命令还是外部命令

type -a +命令可以查询命令执行路径

在一串命令中要引用其他命令提供的信息可以使用`命令`或者$(命令)

例如

cd /lib/modules/`uname -r`/kernel

ls -l $(locate crontab)

如果变量需要增加内容可以使用"$变量名称"或${变量}累加内容,如

给PATH变量增加内容PATH="$PATH":/home/bin或者PATH=${PATH}:/home/bin/或PATH=$PATH:/home/bin

如果变量需要在其他子进程引用可以使用export 变量名 进行输出为环境变量

取消变量设置unset

使用env或者export来显示环境变量,使用set显示环境变量和自定义变量的所有变量

linux下比较特殊的变量

$0 正在被执行命令的名字。对于shell脚本而言,这是被激活命令的路径

$n 该变量与脚本被激活时所带的参数相对应。n是正整数,与参数位置相对应($1,$2…)

$# 提供脚本的参数号

$* 所有这些参数都被双引号引住。若一个脚本接收两个参数,$*等于$1$2

$@ 所有这些参数都分别被双引号引住。若一个脚本接收到两个参数,$@等价于$1$2

$? 前一个命令执行后的返回值

$$ 当前shell的进程号。对于shell脚本,这是其正在执行时的进程ID

$! 前一个后台命令的进程号

变量的键盘读取

要读取来自键盘输入的变量可以使用read命令

read [-pt] 变量名

-t 后接等待的秒数

-p 后接提示符

read -p "Please keyin your name:" -t 30 named

会等待30秒输入你得名字然后作为named变量的值,在脚本中经常用到

declare可以用来声明变量的类型,一般变量默认类型是字符串的

-a 将变量声明为数组类型

-i 将变量声明为整数类型

-x 将变量设置为环境变量,同export +x将环境变量设置为自定义变量

-r 将变量设置为只读,不可修改,重新登录可以修改

#sum=10+20

#echo $sum

#10+20

此时bash是不会帮我们计算的,因为默认的变量类型为字符串

#declare -i sum=10+20

#echo $sum

#30 不过bash环境中的数值运算只能达到整数类型,所以1/3结果是0

数组类型变量 var(index)=content

index就是一些数字代表1,2,...,数组变量一般用在循环或者判断交互的脚本中

#var[1]="small min"

#var[2]="big min"

#var[3]="nice min"

#echo ${var[1]},${[2]},${[3]}

#small min,big min,nice min

变量的删除

#path=$PATH

#/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin

#echo ${path#/*local/bin:}

#/usr/sbin:/usr/bin:/sbin:/bin 从前开始删除了前面的两个内容

# echo ${path#/*:}

#/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin 从前开始找冒号,找到第一个冒号就删除冒号之前的内容

#echo ${path##/*:}

#/bin 从前开始找到所有的冒号,删除冒号之前的内容就剩下最后一个目录

这里的目录都是以冒号分割的,要删除目录就是删除/到:之间的内容,所谓#就是从前开始找最短匹配,##就是从前开始找最长匹配,类似的还有%和%%分别是从后开始查找找最短和最长匹配

#echo ${path%:*bin}

#/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin 最后一个目录被删除了

#echo ${path%%:*bin}

#/usr/local/sbin 后面所有的目录都被删除了,只保留了第一个

关键是找到特征符然后确定从后或者是从前删除

变量的替换

#echo ${path/sbin/SBIN}

#/usr/local/SBIN:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin 从头开始找sbin找到一个就执行替换,其后的不管了,只替换第一个。

#echo ${path//sbin/SBIN}

#/usr/local/SBIN:/usr/local/bin:/usr/SBIN:/usr/bin:/SBIN:/bin 执行全部替换

变量的测试与内容替换

1.测试变量是否存在不存在则赋值

#echo $username

为空

#username=$(username-root)

#echo $username

#root

2.若变量未设置或为空字符串则为变量赋值

#username=""

#username=${username-root}

#echo $username

为空,因为username被设置为空字符串了,所以值赋不上

#username=${username:-root}

#echo $username

#root 对于未设置或是空字符串的变量可以使用:-来赋值

在/etc/issue里面可以设置登录的系统信息,使用telnet方式登录的系统信息设置在/etc/issue.net 在/etc/motd里面可以设置登录系统时的提示信息

数据重定向

1. 将信息丢弃 2>/dev/null

2.将标准输出和标准错误输出重定向到一个文件中

A > list 2>&1 把命令执行A执行结果中的输出和错误输出都放入list文件

3. EOF只是一个分界符,其实你完全可以用abcde替换,也一样的功能,只是大家都习惯用EOF来表示。当s h e l l看到< <的时候,它就会知道下一个词是一个分界

符。在该分界符以后的内容都被当作输入,直到s h e l l又看到该分界符(位于单独的一行)。这个分界符可以是你所定义的任何字符串。

>>EOF.....EOF两个之间的值被当作输入,第二个EOF要单独一行

4. 使用tee可以将数据重定向到文件中并且在屏幕上也显示出来

tee -a 追加到文件中不覆盖

-号可以被用在管道中当作标准输入或者标准输出

很多命令不支持管道命令,可以使用xargs+命令

tr -d x删除文件中的x这个字符串

-s 替换掉重复的字符串

join和paste命令可以将两个文件连在一起
本文出自 “成长全记录” 博客,请务必保留此出处http://lymrg.blog.51cto.com/1551327/490553
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: