系统运维-16-3-Bash编程中数组与字符串的应用技巧

1.初步认识数组。

weekdays[0]="Sun"给数组赋值。weekdays[1]="Mon"给数组赋值。weekdays[6]="Sat"给数组赋值(支持稀疏数列)。echo ${weekdays[1]}返回指定数列的值。echo ${weekdays}不标记数列则返回第0列的值。

[root@lab1 ~]# weekdays[0]="Sun"
[root@lab1 ~]# weekdays[1]="Mon"
[root@lab1 ~]# weekdays[6]="Sat"
[root@lab1 ~]# echo ${weekdays[1]}
Mon
[root@lab1 ~]# echo ${weekdays}
Sun


 

2.实例:利用数组从一定范围随机数中找出最大数。

vim array1.sh编辑脚本。bash -n array1.sh检查脚本。bash array1.sh执行脚本。cat array1.sh查看脚本。

[root@lab1 ~]# vim array1.sh
[root@lab1 ~]# bash -n array1.sh
[root@lab1 ~]# bash array1.sh
32046
22546
15956
32066
12475
24702
29647
10695
30635
5595
Max: 32066
[root@lab1 ~]# cat array1.sh
#!/bin/bash
#
declare -a rand
declare -i max=0

for i in {0..9}; do
  rand[$i]=$RANDOM
  echo $[rand[$i]]
  [ $[rand[$i]] -gt $max ] && max=$[rand[$i]]
done

echo "Max: $max"
 

3.实例:利用数组从指定目录中找出指定后缀文件,下标为偶数的行数之和。

vim array2.sh编辑文件。bash -n array2.sh检查文件。bash array2.sh执行文件。bash -x array2.sh执行过程输出。 cat array2.sh查看文件。

[root@lab1 ~]# vim array2.sh
[root@lab1 ~]# bash -n array2.sh
[root@lab1 ~]# bash array2.sh
Lines: 38.
[root@lab1 ~]# bash -x array2.sh
+ declare -a files
+ files=(/var/log/*.log)
+ declare -i lines=0
++ seq 0 2
+ for i in '$(seq 0 $[${#files[*]}-1])'
+ '[' 0 -eq 0 ']'
++ wc -l /var/log/boot.log
++ cut '-d ' -f1
+ let lines+=0
+ for i in '$(seq 0 $[${#files[*]}-1])'
+ '[' 1 -eq 0 ']'
+ for i in '$(seq 0 $[${#files[*]}-1])'
+ '[' 0 -eq 0 ']'
++ wc -l /var/log/yum.log
++ cut '-d ' -f1
+ let lines+=38
+ echo 'Lines: 38.'
Lines: 38.

[root@lab1 ~]# cat array2.sh
#!/bin/bash
#
declare -a files
files=(/var/log/*.log)
declare -i lines=0

for i in $(seq 0 $[${#files[*]}-1]); do
  if [ $[$i%2] -eq 0 ]; then
    let lines+=$(wc -l ${files[$i]} | cut -d' ' -f1)
  fi
done

echo "Lines: $lines."
 

4.关于数组切片的应用

echo ${weekdays[@]}显示全部数组。echo ${weekdays[*]}显示全部数组。 echo ${weekdays[@]:1:2}显示从第1+1位开始显示2个字符。echo ${weekdays[@]:2:2}显示从第1+2位开始显示2个字符。

[root@lab1 ~]# echo ${weekdays[@]}
Sun Mon Sat
[root@lab1 ~]# echo ${weekdays[*]}
Sun Mon Sat

[root@lab1 ~]# echo ${weekdays[@]:1:2}
Mon Sat
[root@lab1 ~]# echo ${weekdays[@]:2:2}
Sat
 

5.关于字符串切片提取的应用

name="mygod"变量赋值。echo ${name:1:3}从第1+1个字符开始取3个字符。echo ${name:1}从第1+1个字符开始取到结尾。

file="var/log/messages"变量赋值。

[root@lab1 ~]# name="mygod"
[root@lab1 ~]# echo ${name:1:3}
ygo
[root@lab1 ~]# echo ${name:1}
ygod
[root@lab1 ~]# echo ${name: -3}
god

file="var/log/messages"变量赋值。echo ${name: -3}从最右侧开始取3字符。echo ${file#*/}从最左侧开始一直删到第一次出现  /  字符为止。 echo ${file##*/}从最左侧开始一直删到最后一次出现  /  字符为止。echo ${file%/*}从最右侧开始一直删到第一次出现  /  字符为止。echo ${file%%/*}从最右侧开始一直删到最后一次出现  /  字符为止。
[root@lab1 ~]# file="var/log/messages"
[root@lab1 ~]# echo ${file#*/}
log/messages
[root@lab1 ~]# echo ${file##*/}
messages
[root@lab1 ~]# echo ${file%/*}
var/log
[root@lab1 ~]# echo ${file%%/*}
var

 

6.字符串切片替换的应用

user=$(head -1 /etc/passwd)变量赋值。echo $user显示变量值。echo ${user/root/ROOT}将第一次出现的字符替换为指定字符。echo ${user//root/ROOT}将所有出现的字符替换为指定字符。

echo ${user^^}将所有小写转换为大写。myuser=`echo ${user^^}`进行赋值。echo ${myuser,,}将所有的大写转换为小写。
[root@lab1 ~]# user=$(head -1 /etc/passwd)
[root@lab1 ~]# echo $user
root:x:0:0:root:/root:/bin/bash
[root@lab1 ~]# echo ${user/root/ROOT}
ROOT:x:0:0:root:/root:/bin/bash
[root@lab1 ~]# echo ${user//root/ROOT}
ROOT:x:0:0:ROOT:/ROOT:/bin/bash

[root@lab1 ~]# echo ${user^^}
ADMIN:ROOT:X:0:0:ROOT:/ROOT:/BIN/BASH:ROOT
[root@lab1 ~]# myuser=`echo ${user^^}`
[root@lab1 ~]# echo ${myuser,,}
admin:root:x:0:0:root:/root:/bin/bash:root

 

7.字符串切片删除的应用

user="admin:$user:root"对变量重新赋值。echo $user显示变量值。echo ${user/#root/ROOT}进行行首替换。echo ${user/%root/ROOT}进行行尾替换。echo ${user/root}删除从左侧开始第一次出现的字符。echo ${user//root}删除所有出现的字符。echo ${user/#admin}删除行首出现的字符。 echo ${user/%root}删除行尾出现的字符。

[root@lab1 ~]# user="admin:$user:root"
[root@lab1 ~]# echo $user
admin:root:x:0:0:root:/root:/bin/bash:root
[root@lab1 ~]# echo ${user/#root/ROOT}
admin:root:x:0:0:root:/root:/bin/bash:root
[root@lab1 ~]# echo ${user/%root/ROOT}
admin:root:x:0:0:root:/root:/bin/bash:ROOT
[root@lab1 ~]# echo ${user/root}
admin::x:0:0:root:/root:/bin/bash:root
[root@lab1 ~]# echo ${user//root}
admin::x:0:0::/:/bin/bash:

[root@lab1 ~]# echo ${user/#admin}
:root:x:0:0:root:/root:/bin/bash:root
[root@lab1 ~]# echo ${user/%root}
admin:root:x:0:0:root:/root:/bin/bash:
 

8.关于变量默认赋值的应用

weekday='monday'变量赋值。echo ${weekday:-sunday}显示值(变量有值则不显示默认值)。unset weekday清空变量。echo ${weekday:-sunday}显示值(变量无值则显示默认值)。echo $weekday显示变量(为空,并没有替换变量值,只是显示)。 echo ${weekday:=sunday}显示值并对变量进行赋值。echo $weekday再次显示变量,此时已经赋值了。

[root@lab1 ~]# weekday='monday'
[root@lab1 ~]# echo ${weekday:-sunday}
monday
[root@lab1 ~]# unset weekday
[root@lab1 ~]# echo ${weekday:-sunday}
sunday
[root@lab1 ~]# echo $weekday

[root@lab1 ~]# echo ${weekday:=sunday}
sunday
[root@lab1 ~]# echo $weekday
sunday
 

9.为脚本使用配置文件

vim /tmp/hostname创建配置文件。 cat /tmp/hostname查看文件内容。vim hostname.sh创建脚本。cat hostname.sh查看脚本。bash hostname.sh执行脚本。 hostname验证结果。vim /tmp/hostname编辑配置文件。cat /tmp/hostname查看修改。bash hostname.sh再次执行脚本。hostname再次验证结果。

[root@lab1 ~]# vim /tmp/hostname
[root@lab1 ~]# cat /tmp/hostname
HOSTNAME='centos'
[root@lab1 ~]# vim hostname.sh

[root@lab1 ~]# cat hostname.sh
#!/bin/bash
#
[ -r /tmp/hostname ] && . /tmp/hostname
HOSTNAME=${HOSTNAME:-lab.example.com}

hostname $HOSTNAME
[root@lab1 ~]# bash hostname.sh
[root@lab1 ~]# hostname
centos
[root@lab1 ~]# vim /tmp/hostname 
[root@lab1 ~]# cat /tmp/hostname
HOSTNAME='Centos7'
[root@lab1 ~]# bash hostname.sh
[root@lab1 ~]# hostname
Centos7
 

10.临时文件的使用

mktemp /tmp/test.XXX创建临时文件。mktemp /tmp/test.XXX再次创建临时文件(随机性)。tmpfile=$(mktemp /tmp/test.XXX)变量赋值。 echo $tmpfile显示变量。mktemp -d /tmp/test.XXXXXX创建临时目录。 ls -l /tmp | grep test查看创建的文件和目录。mktemp --tmpdir=/tmp test.XXXXXX指定创建临时文件的目录。

[root@lab1 ~]# mktemp /tmp/test.XXX
/tmp/test.3I8
[root@lab1 ~]# mktemp /tmp/test.XXX
/tmp/test.pni
[root@lab1 ~]# tmpfile=$(mktemp /tmp/test.XXX)
[root@lab1 ~]# echo $tmpfile
/tmp/test.lfe

[root@lab1 ~]# mktemp -d /tmp/test.XXXXXX
/tmp/test.zqT99L
[root@lab1 ~]# ls -l /tmp | grep test
-rw-------. 1 root root  0 Jan  6 07:42 test.3I8
-rw-------. 1 root root  0 Jan  6 07:44 test.lfe
-rw-------. 1 root root  0 Jan  6 07:42 test.pni
-rw-r--r--. 1 root root  0 Jan  4 22:25 test.txt
drwx------. 2 root root  6 Jan  6 07:45 test.zqT99L
[root@lab1 ~]# mktemp --tmpdir=/tmp test.XXXXXX
/tmp/test.AQ3Etm
 

11.install命令的使用(可以指定权限,属主,属组)

install -m 700 -d testdir指定权限和创建目录。ll | grep testdir验证刚才创建的目录。

[root@lab1 ~]# install -m 700 -d testdir
[root@lab1 ~]# ll | grep testdir
drwx------. 2 root root        6 Jan  6 07:51 testdir
 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值