shell进阶:
列表生成方式:
列表生成方式:
(1) 直接给出列表
以空白为间隔
(2) 整数列表:
(a) {start..end}
(b) $(seq [start [step]] end)
(3) 返回列表的命令
$(COMMAND)
(4) 使用glob,
如:.sh
(5) 变量引用;
$@, $
while read line(用法)(用于遍历文件,进行处理)
代码段:#!/bin/bash
while read line;do
var1=echo $line | cut -d ":" -f5
var2=echo $line | cut -d ":" -f1
[[ -z $var1 ]] && chfn -o 13760224840$var2 $var2
done </etc/passwd
代码解释:line可以为任意变量,从/etc/passwd中一次读取一行文件,用来修改/etc/passwd中的office字段
select 用法)(经常结合case使用)
代码段
!/bin/bash
PS3=”please input your answer: “
select var in “A” “B” “C” “D”
do
echo “your input is $REPLY”($REPLY是系统内置变量)
if [[ -n $var ]];then
echo “your answer is $var”
break
else
echo “your selection is invalid”
fi
done
信号捕捉trap
trap ‘触发指令’ 信号自定义进程收到系统发出的指定信号后,将执行触发指令,而不会执行原操作
trap ” 信号 忽略信号的操作
trap ‘-‘ 信号 恢复原信号的操作
trap -p 列出自定义信号操作
函数:
函数的定义放在特定文件中,用.路径进行调用
函数返回值return和exit return退出函数,exit退出脚本
return 从函数中返回,用最
return 0 无错误返回。
return 1-255 有错误返回
函数可以接受参数:
传递参数给函数:调用函数时,在函数名后面以空白分隔
给定参数列表即可;例如“testfunc arg1 arg2 …”
可以使用$@, $*, $#等特殊变量
变量作用域:
环境变量:当前shell和子shell有效
本地变量:只在当前shell进程有效,为执行脚本会启动
专用子shell进程;因此,本地变量的作用范围是当前shell脚本程序文件,包括脚本中的函数
局部变量:函数的生命周期;函数结束时变量被自动销毁
注意:如果函数中有局部变量,如果其名称同本地变量,使用局部变量
在函数中定义局部变量的方法
local NAME=VALUE
数组:
数值索引(数值格式)和关联索引(自定义格式)
数组声明:
declare -a ARRAY_NAME
declare -A ARRAY_NAME: 关联数组
数组赋值:
1)一次只赋值一个元素;ARRAY_NAME[INDEX]=VALUE
2)一次赋值全部元素:ARRAY_NAME=(“VAL1” “VAL2” “VAL3” …)
3)只赋值特定元素:ARRAY_NAME=([0]=”VAL1″ [3]=”VAL2″ …)
4)交互式数组值对赋值read -a ARRAY
数组引用:
1)引用数组元素: ${ARRAY_NAME[INDEX]}注意:省略[INDEX]表示引用下标为0的元素
2)数组的长度(数组中元素的个数):${#ARRAY_NAME[]}${#ARRAY_NAME[@]}
3)引用数组所有元素${ARRAY_NAME[@]}
数组处理:
1)数组切片: ${ARRAY[@]:offset:number}
offset: 要跳过的元素个数 number: 要取出的元素个数
取偏移量之后的所有元素:${ARRAY[@]:offset}
2)向数组中追加元素:ARRAY[${#ARRAY[]}]
3)删除数组中的某元素:导致稀疏格式:unset ARRAY[INDEX] 删除整个数组: unset ARRAY
字符串:
${expression}一共有9种使用方法。
${parameter:-word}
${parameter:=word}
${parameter:?word}
${parameter:+word}
上面4种可以用来进行缺省值的替换。
${#parameter}
上面这种可以获得字符串的长度。
${parameter%word} 最小限度从后面截取word
${parameter%%word} 最大限度从后面截取word
${parameter#word} 最小限度从前面截取word
${parameter##word} 最大限度从前面截取word
上面4个就是用来截取字符串的方法了。
有了着四种用法就不必使用cut命令来截取字符串了
第一种又可以分为四种情况,下面一一介绍。
1、使用 # 号操作符。用途是从左边开始删除第一次出现子字符串即其左边字符,保留右边字符。用法为#substr,例如:
str=’http://www.你的域名.com/cut-string.html’
echo ${str#//}
得到的结果为www.你的域名.com/cut-string.html,即删除从左边开始到第一个”//”及其左边所有字符
2、使用 ## 号操作符。用途是从左边开始删除最后一次出现子字符串即其左边字符,保留右边字符。用法为##substr,例如:
str=’http://www.你的域名.com/cut-string.html’
echo ${str##/}
得到的结果为cut-string.html,即删除最后出现的”/”及其左边所有字符
3、使用 % 号操作符。用途是从右边开始删除第一次出现子字符串即其右边字符,保留左边字符。用法为%substr,例如:
str=’http://www.你的域名.com/cut-string.html’
echo ${str%/}
得到的结果为http://www.你的域名.com,即删除从右边开始到第一个”/”及其右边所有字符
4、使用 %% 号操作符。用途是从右边开始删除最后一次出现子字符串即其右边字符,保留左边字符。用法为%%substr,例如:
str=’http://www.你的域名.com/cut-string.html’
echo ${str%%/}
得到的结果为http://www.你的域名.com,即删除从右边开始到最后一个”/”及其右边所有字符
字符串处理2,分别介绍如下:
1、从左边第几个字符开始以及字符的个数,用法为:start:len,例如:
str=’http://www.你的域名.com/cut-string.html’
echo ${var:0:5}
其中的 0 表示左边第一个字符开始,5 表示字符的总个数。
结果是:http:
2、从左边第几个字符开始一直到结束,用法为:start,例如:
str=’http://www.你的域名.com/cut-string.html’
echo ${var:7}
其中的 7 表示左边第8个字符开始
结果是:www.你的域名.com/cut-string.html
3、从右边第几个字符开始以及字符的个数,用法:0-start:len,例如:
str=’http://www.你的域名.com/cut-string.html’
echo ${str:0-15:10}
其中的 0-6 表示右边算起第6个字符开始,10 表示字符的个数。
结果是:cut-string
3、从右边第几个字符开始一直到结束,用法:0-start,例如:
str=’http://www.你的域名.com/cut-string.html’
echo ${str:0-4}
其中的 0-6 表示右边算起第6个字符开始,10 表示字符的个数。
结果是:html
注:(左边的第一个字符是用 0 表示,右边的第一个字符用 0-1 表示)
字符串替换:
${var/pattern/substr}:查找var所表示的字符串中,第一次被pattern所匹配到的字符串,以substr替换之
${var//pattern/substr}: 查找var所表示的字符串中,所有能被pattern所匹配到的字符串,以substr替换之
${var/#pattern/substr}:查找var所表示的字符串中,行首被pattern所匹配到的字符串,以substr替换之
${var/%pattern/substr}:查找var所表示的字符串中,行尾被pattern所匹配到的字符串,以substr替换之
查找并删除
${var/pattern}:查找var所表示的字符串中,删除第一次被pattern所匹配到的字符串
${var//pattern}:所有${var/#pattern}:行首
${var/%pattern}:行尾
字符大小写转换
${var^^}:把var中的所有小写字母转换为大写
${var,,}:把var中的所有大写字母转换为小写
创建临时文件
mktemp命令:创建并显示临时文件,可避免冲突
mktemp [OPTION]… [TEMPLATE]
TEMPLATE: filename.XXX
X至少要出现三个
OPTION:
-d: 创建临时目录
-p DIR或–tmpdir=DIR:指明临时文件所存放目录位置
示例:
mktemp /tmp/test.XXX
tmpdir=mktemp –d /tmp/testdir.XXX
mktemp –tmpdir=/testdir test.XXXXXX
安装复制文件install(与cp的区别是可以改变文件的权限)
install命令:
install [OPTION]… [-T] SOURCE DEST 单文件
install [OPTION]… SOURCE… DIRECTORY
install [OPTION]… -t DIRECTORY SOURCE…
install [OPTION]… -d DIRECTORY…创建空目录
选项:
-m MODE,默认755
-o OWNER
-g GROUP
示例:
install -m 700 -o wang -g admins srcfile desfile
install –m –d /testdir/installdir
原创文章,作者:919022966,如若转载,请注明出处:http://www.178linux.com/79688