shell编程之步步为营(2)

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/rdgfdd/article/details/82766409

我们今天接着学习shell编程!

首先接着介绍shell脚本中的非常重要的一种变量:位置变量


  • 位置变量 : 在脚本中调用通过命令行参数传递给脚本的参数。

$1 , $2 , … : 对应调用第1、第2…等参数
$0 : 命令本身
$* : 传递给脚本的所有参数
$@ : 传递给脚本的所有参数(与$*是有区别的)
$# : 传递给脚本的参数个数

示例:
我们写一个脚本来测试一下:

#!/bin/bash
#
echo $0
echo $2
echo "\$* : $*"
echo "\$@ : $@"
echo "\$# : $#"

执行命令,结果如下:

[jeffrey@localhost ~]$ chmod +x test.sh
[jeffrey@localhost ~]$ ./test.sh Tom Jerry Cherry
./test.sh
Jerry
$* : Tom Jerry Cherry
$@ : Tom Jerry Cherry
$# : 3

  • shift : 参数左移

用法
在shell脚本中,用于将参数踢出:
shift : 踢出一个参数,即第二个参数变成第一个,第三个参数变成第二个;
shift # :踢出#个参数;

示例:
我们输入4个参数,分别为Tom,Jerry,Cherry,Baby,首先打印出第一个参数,即Tom;然后踢出第一个参数,此时第二个参数Jerry变成第一个参数,再次打印参数1,显示的便是Jerry…

#!/bin/bash
#
echo $1
shift
echo $1
shift 2
echo $1
echo "\$* : $*"
echo "\$@ : $@"
echo "\$# : $#"

[jeffrey@localhost ~]$ ./test.sh Tom Jerry Cherry Baby
Tom
Jerry
Baby
$* : Baby
$@ : Baby
$# : 1

  • 算术运算

执行算术运算操作有如下四种方式:
(1)# let var = EXPRESSION 运算结果不直接打印出来
(2)# var = $[ EXPRESSION ] 运算结果会直接打印出来
(3)# var = $(( EXPRESSION )) 运算结果直接打印出来
(4)# var = $(expr EXPRESSION) 算术表达式以空格隔开,结果不直接打印出来,且*需要转义

示例:

[jeffrey@localhost ~]$ num1=4
[jeffrey@localhost ~]$ num2=8

[jeffrey@localhost ~]$ let sum=$num1+$num2
[jeffrey@localhost ~]$ echo $sum
12

[jeffrey@localhost ~]$ var1=$[$num1+$num2]
[jeffrey@localhost ~]$ echo $var1
12

[jeffrey@localhost ~]$ var2=$(($num1+num2))
[jeffrey@localhost ~]$ echo $var2
12

[jeffrey@localhost ~]$ var3=$(expr $num1 + $num2)
[jeffrey@localhost ~]$ echo $var3
12


  • bash内建的随机数生成器:$RANDOM

示例:
生产60以内的随机数

[jeffrey@localhost ~]$ VAR=$[$RANDOM%60]
[jeffrey@localhost ~]$ echo $VAR
18
[jeffrey@localhost ~]$ VAR=$[$RANDOM%60]
[jeffrey@localhost ~]$ echo $VAR
48
[jeffrey@localhost ~]$ VAR=$(($RANDOM%60))
[jeffrey@localhost ~]$ echo $VAR
6
[jeffrey@localhost ~]$ let VAR=$RANDOM%60
[jeffrey@localhost ~]$ echo $VAR
49
[jeffrey@localhost ~]$ VAR=$(expr $RANDOM % 60)
[jeffrey@localhost ~]$ echo $VAR
37

  • 增强型赋值

+=,-=,*=,/=,%=,++,–

示例:

[jeffrey@localhost ~]$ let var=13
[jeffrey@localhost ~]$ echo $var
13
[jeffrey@localhost ~]$ let var-=3
[jeffrey@localhost ~]$ echo $var
10
[jeffrey@localhost ~]$ let var*=2
[jeffrey@localhost ~]$ echo $var
20
[jeffrey@localhost ~]$ let var/=4
[jeffrey@localhost ~]$ echo $var
5
[jeffrey@localhost ~]$ let var%=3
[jeffrey@localhost ~]$ echo $var
2
[jeffrey@localhost ~]$ let var++
[jeffrey@localhost ~]$ echo $var
3
[jeffrey@localhost ~]$ let var--
[jeffrey@localhost ~]$ echo $var
2

  • 条件测试:判断条件是否满足;由测试机制来实现;

用法
专用的测试表达式需要由测试命令辅助完成测试过程,测试命令如下:
# test EXPRESSION
# [ EXPRESSION ]
# [[ EXPRESSION ]]

注:EXPRESSION前后必须有空格

bash的测试类型: 数值测试 、字符串测试、文件测试。

数值测试

  • -gt 大于
  • -ge 大于等于
  • -eq 等于
  • -ne 不等于
  • -lt 小于
  • le 小于等于

示例:

[jeffrey@localhost ~]$ test 1>3
[jeffrey@localhost ~]$ echo $?
1

[jeffrey@localhost ~]$ [ 100 -eq 100 ]
[jeffrey@localhost ~]$ echo $?
0

字符串测试:用于字符串比较时的操作数应该加引号

  • ==或者= 相等
  • > 大于
  • < 小于
  • != 不等于
  • =~ 左侧是否能被右侧的PATTERN匹配,一般用于[[ ]]中;
  • -z “STRING” 测试字符串是否为空;不空为真、空为假;
  • -n “STRING” 测试字符串是否不为空;不空为真、空为假;

示例:

[jeffrey@localhost ~]$ name=jeffrey
[jeffrey@localhost ~]$ echo $name
jeffrey
[jeffrey@localhost ~]$ [-z "$name"]
bash: [-z: command not found...
[jeffrey@localhost ~]$ [ -z "$name"]
bash: [: missing `]'
[jeffrey@localhost ~]$ [ -z "$name" ]
[jeffrey@localhost ~]$ echo $?
1
[jeffrey@localhost ~]$ myname=jeffrey
[jeffrey@localhost ~]$ [ -n "$myname" ]
[jeffrey@localhost ~]$ echo $?
0
[jeffrey@localhost ~]$ [ "$name"="$myname" ]
[jeffrey@localhost ~]$ echo $?
0
[jeffrey@localhost ~]$ [ "$name"!="$myname" ]
[jeffrey@localhost ~]$ echo $?
0
[jeffrey@localhost ~]$ [ "$name"! = "$myname" ]
[jeffrey@localhost ~]$ echo $?
1
[jeffrey@localhost ~]$ [[ "$name" =~ ^m ]]
[jeffrey@localhost ~]$ echo $?
0
[jeffrey@localhost ~]$ [[ "$name" =~ ^t ]]
[jeffrey@localhost ~]$ echo $?
1
[jeffrey@localhost ~]$ [[ "$name" =~ ^m.* ]]
[jeffrey@localhost ~]$ echo $?
0

bash自定义退出状态码


bash可以自定义退出状态码:exit n

若脚本中一旦遇到exit命令,脚本会立即终止,终止退出状态取决于exit命令后面的数字;如果未给脚本指定退出状态码,整个脚本的退出状态码取决于脚本中执行的最后一条命令的状态码。

今天的练习

1,计算系统上/etc/passwd上第10个用户和第20个用户的ID之和;
脚本sumid.sh内容如下:

#!/bin/bash
#
id1=$(head -10 /etc/passwd | tail -1 | cut -d: -f3)
id2=$(head -20 /etc/passwd | tail -1 | cut -d: -f3)
sum_ID=$[$id1+$id2]
echo "The sum of No.10 id  and No.20 id is $sum_ID"

执行结果如下:

[jeffrey@localhost ~]$ chmod +x sumid.sh
[jeffrey@localhost ~]$ ./sumid.sh
The sum of No.10 id  and No.20 id is 70

2,计算/etc/rc.d/rc.sysinit以及/etc/rc.d传递两个文件路径作为参数给脚本,计算文件的空白行数之和;
脚本blankline.sh内容如下:

#!/bin/bash
#
line1=$(grep "^[[:space:]]*$" $1 | wc -l)
line2=$(grep "^[[:space:]]*$" $2 | wc -l)
sum=$[ $line1 + $line2 ]
echo "blank lines all is $sum"

执行结果:

[root@localhost jeffrey]# ./blankline.sh /etc/profile /etc/bashrc
blank lines all is 18

3,统计/etc,/var,/usr共有多少个子目录和文件;
脚本count.sh内容:

#!/bin/bash
#
num1=$(ls -l /etc | wc -l)
num2=$(ls -l /var | wc -l)
num3=$(ls -l /usr | wc -l)
num=$[$num1+$num2+$num3]
echo "file number is $num"

执行结果如下:

[root@localhost jeffrey]# chmod +x count.sh
[root@localhost jeffrey]# ./count.sh
file number is 333

4,写一个脚本,接受一个文件路径作为参数,若参数行小于1,则提示用户“至少给出一个参数”,并立即退出;否则,显示第一个参数所指向的文件中的空白行数;

脚本test.sh内容:

#!/bin/bash
#
[ "$#" -lt 1 ] && echo "至少应输入一个参数" && exit 125
line=$(grep "^[[:space:]]*$" $1 | wc -l)
echo "$line"

执行结果:

[root@localhost jeffrey]# chmod +x test.sh
[root@localhost jeffrey]# ./test.sh
至少应输入一个参数
[root@localhost jeffrey]# ./test.sh /etc/profile
11

猜你喜欢

转载自blog.csdn.net/rdgfdd/article/details/82766409
今日推荐