shell-8-9-10.shell编程基本概念

数组变量的使用

  • 数组的定义:
    • 数组是一种数据结构,有相关的数据项组成,每个数据项称为数组的元素,可以使用索引的方式取得各个元素的值
    • bash 的数组下标从0开始,没有个数限制,索引可以是算数表达式
    • bash默认只支持一维数组
    • 设置数组元素值
      • A[0]=1;A[2]=2;A[5]=3
      • A(1,2,3,4,5,6,7,8,9)
      • A=([2]=12,[1]=52,[8]=45)
    • 使用数组元素值
      • echo ${A[1]}
      • echo $(A[1+2])
    • 取出数组中的所有元素
      -echo ${A[@]}
      -echo ${A[*]}
      • @输出空元素,*只输出有效元素
  • 取得数组中的元素的个数
    • KaTeX parse error: Expected '}', got '#' at position 2: {#̲A[@]}或{[A]*}
    • ${#A[2]}可以取出数组元素字符串的长度
[root@master xiaosi]# A=(1 2 3 4 5 6) 
[root@master xiaosi]# echo ${A[0]}
1
[root@master xiaosi]# A[2]=a
[root@master xiaosi]# echo ${A[2]}
a
[root@master xiaosi]# echo ${A}
1
[root@master xiaosi]# echo ${A[@]}
1 2 a 4 5 6

取数组:


[root@master xiaosi]# for i in {0..15};do echo \${A[$i]}=${A[i]};done   
${A[0]}=1
${A[1]}=2
${A[2]}=a
${A[3]}=4
${A[4]}=5
${A[5]}=6
${A[6]}=
${A[7]}=
${A[8]}=
${A[9]}=
${A[10]}=
${A[11]}=
${A[12]}=
${A[13]}=
${A[14]}=
${A[15]}=

[root@master xiaosi]#  echo ${#A[@]}
6
[root@master xiaosi]#  echo ${#A[*]}
6
[root@master xiaosi]#  echo ${#A[2]}
1

here document详解

  • 使用here document做多行输出
  • 使用here document做多行注释
  • 使用here document将变量放在打段的输出文字中
[root@master xiaosi]# cat >file<<ENDF    #不可以用echo写,因为它不是以流的形式工作的,用cat可以,命令: >file<<ENDF 不能写入,原因就是就是没得流
> jingjaing
> jiang
> jfiang
> fjaing
> 
> iaggeag
> ENDF
[root@master xiaosi]# ls
file  foo1.sh  foo2.sh  foo3.sh  foo.out  foo.sh  sh1.sh  xiaosi  xiaosi1
[root@master xiaosi]# cat file
jingjaing
jiang
jfiang
fjaing

iaggeag

可以作为注释使用:
在写.sh脚本时:
echo >file <<endf
内容
endf

高级用法

  • 变量扩展
    -${变量名}
  • 命令替换
    -$(命令)
  • 算数扩展
    -$((算术式))

题目:找出1-100中7整除的数:

[root@master xiaosi]# for i in {1..100};do if [ 0 -eq $(($i%7)) ];then echo $i ; fi ;done 
7
14
21
28
35
42
49
56
63
70
77
84
91
98

判断变量名是否有值:

  • 变量设置有两种情况:有或者没有
  • ${变量名称:-默认值},变量为空时回传默认值
  • ${变量名称:默认值} ,变量为空时设置为默认值
  • ${变量名称:提示信息} ,变量为空时停止程序显示信息
    例子1:
[root@master xiaosi]# echo abc=
abc=
[root@master xiaosi]# abc=
[root@master xiaosi]# echo 

[root@master xiaosi]# echo ${abc:-123}
123

例子2(注意区分例子1);

[root@master xiaosi]# a=250
[root@master xiaosi]# echo a
a
[root@master xiaosi]# echo ${a:=200}
250
[root@master xiaosi]# b=
[root@master xiaosi]# echo ${b:=200}
200

例子3:如何测试一个值是否被设置?

[root@master xiaosi]# vi foo4.sh
#!/bin/sh
echo begin
aa=
foo=${aa:?this is no a value in the aa}
echo end
[root@master xiaosi]# bash foo4.sh 
begin
foo4.sh: line 4: aa: this is no a value in the aa
  • 变量扩展:取字符串切片、字符串长度
    • ${变量:位置起点},有指定的位置开始,截取字符串到结尾
    • ${变量:位置起点:长度},指定的位置开始,截取指定的长度的子字符串
    • $(#变量),传回变量值的字符串长度
[root@master xiaosi]# abc=abcdef
[root@master xiaosi]# echo ${abc:1}
bcdef
[root@master xiaosi]# echo ${abc:2}
cdef
[root@master xiaosi]# echo ${abc:2:3}
cde
[root@master xiaosi]# echo ${#abc}
6

题目:定义一个字符,然后每次取出一个字符

[root@master xiaosi]# echo a="i am xiaosi"
a=i am xiaosi
[root@master xiaosi]# a="i am xiaosi"     
[root@master xiaosi]# for i in {0..15};do echo ${a:i:1};done
i

a
m

x
i
a
o
s
i
[root@master xiaosi]# for i in $( seq 0 ${#a} ) ;do echo ${a:i:1};done     
i

a
m

x
i
a
o
s
i

[root@master xiaosi]# head -1 /etc/hosts
192.168.71.100 master
[root@master xiaosi]# abc=$(head -1 /etc/hosts) 
[root@master xiaosi]# for i in $( seq 0 ${#abc} ) ;do echo ${abc:i:1};done
1
9
2
.
1
6
8
.
7
1
.
1
0
0

m
a
s
t
e
r

使用tr替换输出

[root@master xiaosi]# abc=$(head -1 /etc/hosts |tr . '\n')       
[root@master xiaosi]# for i in $( seq 0 ${#abc} ) ;do echo ${abc:i:1};done
1
9
2

1
6
8

7
1

1
0
0

m
a
s
t
e
r

变量扩展:对比样式

  • ${变量#样式},由左边开始比对变量删除,”最短相符字符串“

  • {变量##样式},由左边开始对比变量删除,”最长相符字符串“

[root@master xiaosi]# a=/usr/share/doc/pam-1.1.1/txts//README.pam_nologin      
[root@master xiaosi]# echo ${a#/*/}
share/doc/pam-1.1.1/txts//README.pam_nologin
[root@master xiaosi]# echo ${a##/*/}
README.pam_nologin
[root@master xiaosi]# echo ${a##/*s}
//README.pam_nologin
[root@master xiaosi]# echo ${a##/*s//}
README.pam_nologin
  • ${变量%样式},由右边开始对比变量删除,”最短相符字符串“
  • ${变量%%样式},由右边开始对比变量删除,”最长相符字符串“
[root@master xiaosi]# echo ${a%/*} 
/usr/share/doc/pam-1.1.1/txts/
[root@master xiaosi]# echo ${a%R*}
/usr/share/doc/pam-1.1.1/txts//
  • ${变量/样式/替换字符串},如果变量中有匹配样式(去最长),则使用替代字符串取代第一个匹配
[root@master xiaosi]# echo ${a//s*n/xiaosi}
/uxiaosi

1.1.1/test///README.pam_nologin`

  • ${变量//样式/替换字符串},如果变量中有匹配样式(取最长),则使用替代字符串全部取代。
[root@master xiaosi]# echo ${a//s*n/xiaosi}
/uxiaosi

注意:/s 和//s区别就是第一个找到就换,//s是所有的都换掉

[root@master xiaosi]# echo ${a/s/xiaosi}   
/uxiaosir/share/doc/pam-1.1.1/txts//README.pam_nologin
[root@master xiaosi]# echo ${a//s/xiaosi}
/uxiaosir/xiaosihare/doc/pam-1.1.1/txtxiaosi//README.pam_nologin

变量扩展:

  • ${!开头字符串@}或${!开头字符串*} ,当前匹配的变量名列表,个变量之间用$IFS第一份分隔符(默认为空格)隔开
  • ${!数组变量[@]${!数组变量[*]},取出数组索引列表,各索引之间用$IFS第一个分隔符(默认为空格)隔开
[root@master xiaosi]# a=
[root@master xiaosi]# abc=
[root@master xiaosi]# abd=
[root@master xiaosi]# echo ${!a*}
a abc abd

算术运算

  • 算术命令 : $((算术式 ))
 [root@master xiaosi]# echo $((1+1)) 
2

内部命令: expr算术式(只能做整数型)

[root@master xiaosi]# expr 1 + 1
2
  • 内置命令: declare - i 变量 = 算术式
[root@master xiaosi]# echo $a
2
  • 内置命令: let算术式
[root@master xiaosi]# let a++
[root@master xiaosi]# echo $a
3
  • $[]方式 : $[算术式]
[root@master xiaosi]# echo $[1+4] 
5
  • bc(外部命令)(执行最慢)
[root@master xiaosi]# bc
bc 1.06.95
Copyright 1991-1994, 1997, 1998, 2000, 2004, 2006 Free Software Foundation, Inc.
This is free software with ABSOLUTELY NO WARRANTY.
For details type `warranty'. 
0.22 + 0.34
.56

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值