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

2015—01—23 Shell学习笔记基础(2)

2015-01-23 15:48 190 查看
环境变量用于进程前,必须用export命令导出。

定义变量:

1,export oldboy = “I am oldboy”

2,变量名=valie;export 变量名

3,declare -x 变量名=value

/etc/profile.d

/etc/profile

env 或set printenv

unset (注销失效)

普通字符串变量定义

变量名 = value 数字、字符串、路径名

变量名 = 'value' 比较适合 纯字符串

变量名 = "value" 字符串中附带又变量的内容

习惯:数字不加引号,其他默认加双引号。

shell的中的变量要求:一般是字母,数字,下划线组成。字母开头。

eg.1

a=192.168.1.2

b='192.168.1.2'

c="192.168.1.2"

echo "a=$a"

echo "b=$b"

echo "c=${c}"

输出结果:

a=192.168.1.2

b=192.168.1.2

c=192.168.1.2

eg2.在eg1的基础上加

a=192.168.1.2-$a

b='192.168.1.2-$a'

c="192.168.1.2-$a"

echo "a=$a"

echo "b=$b"

echo "c=${c}"

输出结果:

a=192.168.1.2-192.168.1.2

b=192.168.1.2-$a (单引号直接显示,看到啥是啥,不解析)

c=192.168.1.2-192.168.1.2-192.168.1.2

全局变量和局部变量

a.脚本中的全局变量定义,在使用时,使用{ }将变量括起

b.脚本中的局部变量定义,存在于脚本函数中的变量,要以local方式进行声明,

把命令作为变量

a.cmd = `ls` tab键上的 反引号

b.cmd=$(date +%F) echo $cmd 打印时间

pro

1.若变量和其他字符组成新的变量就必须给变量加上{ }。

eg: tar zcf etc_${cmd}_oldboy.tar.gz /etc/....

2.养成所有的字符串变量用双引号括起来使用的习惯, $A 写成 "$A"或 "${A}"

应用场景:

1.对站点按天打包生成不同的文件名

2.对站点按机器 名、ip打包生成不同的文件名

1.Shell的特殊变量

a.$0 获取当前执行的shell脚本的文件名,包括路径。

b.$n 获取当前执行的shell脚本的第n个参数,当n大于9使用大括号${10}

//c.$* 获取当前执行的shell脚本的所有参数

d.$# 获取当前执行的shell命令行中总参数的总个数

"1 2 3 4" 一个整体一个参数

$0 都有 文件名 路径

dirname $0 文件名

basename $0 路径

2.进程状态变量

$$ 获取当前shell的进程号(PID)

$? 获取执行上一指令的返回值(0成功,非零失败) 判断上个命令是否成功。

返回值参考:

2 权限拒绝

1~125 表示运行失败,脚本命令、系统命令错误或参数传递错误

126 找到命令了,但是无法执行

127 未找到运行的命令

>128 命令被系统强制结束

//$_ 在此之前执行的命令或脚本的最后一个参数

eg1.

cd /etc

tar zcf service.tar.gz ./services

[ $? -eq 0 ] $$ echo ok

$*和$@的区别:

$* 就所有的命令行所有参数视为单个字符,等同于"$1$2$3"

$@ 将命令行的每个参数视为单独的字符串,等同于"$1" "$2" "$3"。这是将参数传递给其他程序的最佳方式,因为他会保留所有内嵌在每个参数里的任何空白。

bash内部变量

常用的内部命令有:echo eval exec export readonly read shift wait exit 和点(.)

shift 改变位置参数,每执行一次shift语句,都使所有的位置参数一次向左移动一个位置,并使位置参数$#减1,直到减到0为止

变量子串的常用操作

${#string} 返回字符串的长度 echo $OLDBOY|wc -m

${string:2} 从第二个开始取 或 删除前2个 2、、、、、n

${string:2:2} 从第二个开始取,取两个 cut -c 3-4 截取第3-4 个

${string%abc} 从结尾开始删,删除abc

${string#abc} 从开始开始删

/etc/init.d/crond 需要自己看

1).批量文件改名:

for f in `ls *.jpg`

do

mv $f `echo ${f%finished}.jpg`

done

2).变量结尾替换(使用${string/%substring/replace})

for a in `ls *.jpg`

do

mv $f `echo ${a/%jpg/JPG}`

done

rename .JPG(源) .jpg *.JPG(文件)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: