常⽤shell脚本指令[精辟]
常⽤shell脚本命令
1、显⽰包含⽂字aaa的下⼀⾏的内容:
sed -n '/aaa/{n;p;}' filename
2、删除当前⾏与下⼀⾏的内容:
sed -i '/aaa/{N;d;}' filename
3、删除当前⾏与下两⾏的内容:
sed -i '/aaa/{N;N;d;}' filename
依次类推,删除三⾏,则为{N;N;N;d;},分析知:N为next
4、得出以空格为分割的字符串中单词的个数,即统计个数:
awk ' { print NF } '
如显⽰字符串VALUE中的单词个数,其中VALUE为:aaa bbb ccc ddd ee f
则执⾏ echo $VALUE | awk ' { print NF } ' 后的结果为6
5、在linux中建⽴⼀个⽂件与另⼀⽂件的链接,即符号链接
ln -s /var/named/chroot/f
这要就建⽴了当前⽬录的⽂件f对/var/named/chroot/f 的符号链接。即操作f就意味着操作实际⽂件/var/named/chroot/f ,这时⽤ll命令查看的结果如:
lrwxrwxrwx 1 root root 32 Mar 22 12:f -> /var/named/chroot/f 注意:当⽤sed来通过f来删除⼀部分信息时,会将符号链接的关系丢掉,即会将f变成⼀个实际⽂件。所以需对实际⽂件进⾏删除操作。6、显⽰指定字符范围内的内容:
如:显⽰⽂件中字符#test begin与#test end之间所有的字符linux循环执行命令脚本
sed -n "/#test begin/,/#test end/p"
或 awk "/#test begin/,/#test end/"
在⽇常系统管理⼯作中,需要编写脚本来完成特定的功能,编写shell脚本是⼀个基本功了!
在编写的过程中,掌握⼀些常⽤的技巧和语法就可以完成⼤部分功能了,也就是2/8原则.
1. 单引号和双引号的区别
单引号与双引号的最⼤不同在于双引号仍然可以引⽤变量的内容,但单引号内仅是普通字符,不会作变量
的引⽤,直接输出字符窜。请看如下例⼦:
[root@linux ~]# name=HaHa
[root@linux ~]# echo $name
HaHa
[root@linux ~]# myname="$name is wow"
[root@linux ~]# echo $myname
HaHa is wow
[root@linux ~]# myname='$name is wow'
[root@linux ~]# echo $myname
$name is wow
从上⾯例⼦可以看出,使⽤了单引号的时候,那么$name只是普通字符,直接输出⽽已!
2. 逐⾏读取⽂件
使⽤for循环来读取⽂件
for line in ``
do
echo $line
done
注意:由于使⽤for来读⼊⽂件⾥的⾏时,会⾃动把空格和换⾏符作为⼀样分隔符,如果⾏⾥有空格的时候,输出的结果会很乱,所以只适⽤于⾏连续不能有空格或者换⾏符的⽂件
使⽤while循环读取⽂件
|while read line
do
echo $line
done
或者:
while read line
do
echo $line
done <
注意:由于使⽤while来读⼊⽂件⾥的⾏时,会整⾏读⼊,不会关注⾏的内容(空格..),所以⽐for读⽂件有更好的适⽤性,推荐使⽤while循环读取⽂件
3. bash shell 脚本中常⽤隐含变量
0表⽰该命令正确执⾏,任何⾮0值表⽰命令出错)
$$ 变量最常见的⽤途是⽤做暂存⽂件的名字以保证暂存⽂件不会重复。
$* 和 $@ 如果输出是⼀样的,但是在使⽤for循环,在使⽤双引号("")引⽤时 "$*" 会输出成⼀个元素⽽ "$@" 会按照每个参数是⼀个元素⽅式输出
请看测试例⼦
#cat test.sh
#!/bin/sh
echo '"$@" '
for i in "$@"
do
echo $i
done
echo '"$*" output ....'
for i in "$*"
do
echo $i
done
输出结果
#sh test.sh a b c d
"$@"
a
b
c
d
"$*" output ....
a b c d
从输出结果可以看出 "$*" 输出是⼀⾏⽽ "$@" 输出则是四⾏
4. 变量内容的删除与替换
我们在⼀些情况下,需要对变量中的字符窜进⾏查删除或者替换,就需要使⽤下表列出的⽅法
[root@linux ~]# export
test_str="/usr/kerberos/sbin:/usr/kerberos/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/ sbin:/usr/bin:/root/bin"
[root@linux ~]# echo ${test_str#/*kerberos/bin:}
/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin
5. 变量条件测试赋值
在某些时刻我们需要‘判断’某个变量是否存在,若变量存在则将此变量值赋值给新的变量,若变量不存在则将其他值赋值给新的变量.
[root@linux ~]# test_name=""
[root@linux ~]# test_name=${test_name-root}
[root@linux ~]# echo $test_name
<== 因为 test_name 被设定为空字符窜!所以当然还是保留为空字符窜!
[root@linux ~]# test_name=${test_name:-root}
[root@linux ~]# echo $test_name
root <== 加上‘:’后若变量内容为空或者是未设定,都能够以后⾯的内容替换!
基本上这种变量的测试也能够透过 shell script 内的 if... 来处理,不过通过上述提
及的简单的⽅法来测试变量,是程序看起来更精简⼀些!
6. shell 中分隔符 : 变量IFS 使⽤
shell脚本中,如果使⽤for循环⼀个字符窜的话,默认使⽤空格来分割字符窜.还有前⾯所提到的使⽤
for循环逐⾏读取⽂件内容时候,⽂件⾏中如果有空格的话输出的结果也会变乱.这个时候使⽤ IFS 变量来设置特定的字符窜分割符来,达到输出正确的⽬的.默认情况下 IFS 是使⽤,空格 \t \n 来作为默认的分割符的.
我们将前⾯使⽤for逐⾏读取⽂件的例⼦改进下就可以输出正确了,请看下⾯
#!/bin/bash
IFS_old=$IFS #将原IFS值保存,以便⽤完后恢复
IFS=$’\n’ #更改IFS值为$’\n’
for line in ``
do
echo $line
done
< ⽂件内容如下
[root@linux]$
sdfsdfsdfsdf
ssssss ssssss ssssss sssss
sdfsdfsdfsdfsdf
执⾏测试程序输出结果如下(正确输出)
[root@linux]$ sh test.sh
sdfsdfsdfsdf
ssssss ssssss ssssss sssss
sdfsdfsdfsdfsdf
如果未设置IFS变量,使⽤默认的IFS变量值 ,输出结果如下
[root@linux]$ sh test.sh
sdfsdfsdfsdf
ssssss
ssssss
ssssss
sssss
sdfsdfsdfsdfsdf
从以上测试程序输出结果,可以根据⾃⼰的需求来设定 IFS变量,在举⼀个例⼦如下: while IFS=: read userName passWord userID groupID geCos homeDir userShell do
echo "$userName -> $homeDir"
done < /etc/passwd
7. shell 数组的使⽤
数组赋值⽅式:
(1) array=(var1 var2 var3 ... varN)
(2) array=([0]=var1 [1]=var2 [2]=var3 ... [n]=varN)
(3) array[0]=var1
arrya[1]=var2
...
array[n]=varN
计算数组元素个数或者长度:
(1) ${#array[@]}
(2) ${#array[*]}
了解了数组基础语法,举例说明,请看:
#!/bin/bash
NAMESERVERS=("www.doczj/doc/5f22e15ebe23482fb4da4cfb.html ."
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论