2019-05-28day52Shell实战入门4-5章

第四章 Shell变量知识进阶与实践

常用的特殊位置参数变量说明

位置变量 作用说明

$0 获取当前执行的Shell脚本的文件名,如果执行脚本包含了路径,那么就包括脚本路径。

$n 获取当前执行的Shell脚本的第n个参数,n=1..9,当n为0时表示脚本的文件名;如果n大于9,则用大括号括起来,例如${10},接的参数以空格隔开。

$# 获取当前执行Shell脚本后面接的参数的总个数。

$* 获取当前Shell脚本所有传参的参数,不加引号和$@相同,如果给$加上双引号,例如:”$”,则表示将所有的参数视为单个字符串,相当于”$1 $2 $3”

$@获取当前Shell脚本所有传参的参数,不加引号和$相同,如果给$@加上双引号,例如"$@",则表示将所有的参数视为不同的独立字符串,相当于”$1””$2””$3””…”。这是将多参数传递给其他程序的最佳方式,因此它会保留所有的内嵌在每个参数里的任何空白。当”$@”和”$”都加双引号时,两者是由区别的,都不加双引号时,两者无区别.

Shell进程中的特殊状态变量说明:

位置变量 作用说明

$?获取执行上一个指令的执行转态返回值(0为成功,非零为失败)。

$$ 获取当前执行的Shell脚本的进程号(PID)。

$! 获取上一个在后台工作的进程的进程号(PID)。

$_ 获取再次之前执行的命令或脚本的最后一个参数。

Shell变量子串说明:

ID 表达式 说明

1 ${parameter} 返回变量$parameter的内容。

2 ${#parameter} 返回变量$parameter内容的长度(按字符),不能适用于特殊变量。

3 ${parameter:offset} 在变量${parameter}中,从位置offset之后开始提取子串到结尾。

4 ${parameter:offset:length} 在变量${parameter}中,从位置offset之后开始提取长度为length的子串。

5 ${parameter#word} 从变量${parameter}开头开始删除最短匹配的word子串。

6 ${parameter##word} 从变量${parameter}开头开始删除最长匹配的word子串。

7 ${parameter%word} 从变量${parameter}结尾开始删除最短匹配的word子串。

8 ${parameter%%word} 从变量${parameter}结尾开始删除最长匹配的word子串。

9 ${parameter/pattern/string} 使用string代替第一个匹配的pattern。

10 ${parameter//pattern/string} 使用string代替所有匹配的pattern。

Shell的特殊扩展变量说明:

表达式 说明

${parameter:-word} 如果parameter的变量值为空或未赋值,则会返回word字符串并替代变量的值
用途:如果变量未定义,则返回备用的值,防止变量为空值或未定义而导致异常。

${parameter:=word} 如果parameter的变量值为空或为赋值,则设置这个变量值为word,并返回其值。位置变量和特殊变量不适用。
用途:基本同上一个${parameter:-word},但该变量又额外给parameter变量赋值了。

${parameter:?word} 如果parameter变量值为空或未赋值,那么word字符串将被作为标准错误输出,否则输出变量的值。
用途:用于捕捉由于变量未定义而导致的错误,并退出程序。

${parameter:+word} 如果parameter变量值为空或未赋值,则什么都不做,否则word字符串将替代变量的值。

实践:

$0
0=脚本名字
echo $0
# Test syntax.
if [ "$#" -eq 0 ]; then
     echo $"Usage: killproc [-p pidfile] [ -d delay] {program} [-signal]"
     return 1
 fi
$#案例
[root@web01 /server/scripts]# cat network 
if [ $# -eq 0 ]
then
    echo "Usage: $0 {start|stop|restart}"
fi
echo $1
[root@web01 /server/scripts]# set -- "I am" handsome oldboy.
[root@web01 /server/scripts]# 
[root@web01 /server/scripts]# 
[root@web01 /server/scripts]# echo $1
I am
[root@web01 /server/scripts]# echo $2
handsome
[root@web01 /server/scripts]# echo $3
oldboy.
[root@web01 /server/scripts]# echo $#
3
[root@web01 /server/scripts]# echo $*
I am handsome oldboy.
[root@web01 /server/scripts]# echo $@
I am handsome oldboy.
[root@web01 /server/scripts]# for i in "$*";do echo $i;done
I am handsome oldboy.
[root@web01 /server/scripts]# for i in "$@";do echo $i;done
I am
handsome
oldboy.

$$

[root@web01 /server/scripts]# cat oldboy.sh 
echo $0
echo $1 $2 $3 $4 $5 $6 $7 $8 $9 ${10} ${11} ${12} $13 $14 $15
echo $#
echo $*
echo $@
echo $$|tee /tmp/a.log
sleep 30
[root@web01 /server/scripts]# 
[root@web01 /server/scripts]# 
[root@web01 /server/scripts]# 
[root@web01 /server/scripts]# cat kill.sh 
kill `cat /tmp/a.log`

${parameter} 返回变量$parameter的内容

${#parameter} 返回变量$parameter内容的长度(按字符),也适合特殊变量

${parameter:offset} 在变量${parameter}中,从位置offset之后开始提取子串到结尾

${parameter:offset:length} 在变量${parameter}中,从位置offset之后开始提取长度为length的子串

删除

${parameter#word} 从变量${parameter}【开头】开始删除最【短】匹配的word子串
${parameter##word} 从变量${parameter}【开头】开始删除最【长】匹配的word子串

${parameter%word} 从变量${parameter}结尾开始删除最短匹配的word子串
${parameter%%word} 从变量${parameter}结尾开始删除最长匹配的word子串

类似sed替换

${parameter/pattern/string} 使用string代替第一个匹配的pattern
${parameter//pattern/string} 使用string代替所有匹配的pattern

[root@web01 /server/scripts]# OLDBOY="I am oldboy" 
[root@web01 /server/scripts]# echo $OLDBOY
I am oldboy

[root@web01 /server/scripts]# echo ${#OLDBOY} #打印变量内容的长度。
11
[root@web01 /server/scripts]# echo ${OLDBOY:2:2}
am
[root@web01 /server/scripts]# echo ${OLDBOY:2}
am oldboy
[root@web01 /server/scripts]# echo ${OLDBOY:0:2}
I
[root@web01 /server/scripts]# echo ${OLDBOY:0:3}
I a
[root@web01 /server/scripts]# echo ${OLDBOY}
I am oldboy
[root@web01 /server/scripts]# echo ${OLDBOY}|grep -o oldboy
oldboy
[root@web01 /server/scripts]# echo ${OLDBOY:2:2}
am
[root@web01 /server/scripts]# echo ${OLDBOY:5:6}
oldboy
[root@web01 /server/scripts]# echo ${OLDBOY:5}
oldboy

获取变量内容长度的方法:

[root@web01 /server/scripts]# echo $OLDBOY|wc -L
22
[root@web01 /server/scripts]# echo ${#OLDBOY}
22
[root@web01 /server/scripts]# expr length "$OLDBOY"
22
[root@web01 /server/scripts]# echo $OLDBOY|awk '{print length}'
22
[root@web01 /server/scripts]# echo $OLDBOY|awk '{print length($0)}'
22
[root@web01 /server/scripts]# sh count.sh
I
am
linux
to
our
[root@web01 /server/scripts]# 

[root@web01 /server/scripts]# cat count.sh 
chars="I am oldboy linux welcome to our training."
for word in $chars
do
  if [ ${#word} -lt 6 ]
  then
      echo $word
  fi
done

举例:做销售的男生或女生,经常出差。

乐乐在家
result是乐乐的女朋友
乐乐出差了,第三者插足了。unset
[root@web01 /server/scripts]# test=lele
[root@web01 /server/scripts]# echo $test
lele
[root@web01 /server/scripts]# result=${test:-unset}
[root@web01 /server/scripts]# echo $result
lele
[root@web01 /server/scripts]# unset test
[root@web01 /server/scripts]# echo $test

[root@web01 /server/scripts]# result=${test:-unset}
[root@web01 /server/scripts]# echo $result
unset

第五章 变量的述职计算实践

Shell中常见的算术运算命令

运算操作符与运算命令 意义

(()) 用于整数运算的常用运算符,效率很高

let 用于整数运算,类似于”(())”

expr 可用于整数运算,但还有很多其他的额外功能

bc Linux下的一个计算器程序(适合整数及小数运算)

$[] 用于整数运算

awk awk既可以用于整数运算,也可以用于小数运算

declare 定义变量值和属性,-i参数可以用于定义整形变量,做运算

数值运算:

1)整数运算:
#方法1:
[root@web01 /server/scripts]# a=1
[root@web01 /server/scripts]# let a=a+1
[root@web01 /server/scripts]# echo $a
2

方法2:推荐小括号
[root@web01 /server/scripts]# a=10
[root@web01 /server/scripts]# ((a=a+1))
[root@web01 /server/scripts]# echo $a
11

方法3:尽量不用做运算
[root@web01 /server/scripts]# a=10
[root@web01 /server/scripts]# expr $a + 111
121
[root@web01 /server/scripts]# b=`expr $a + 111`
[root@web01 /server/scripts]# echo $b
121

方法4:
[root@web01 /server/scripts]# a=11
[root@web01 /server/scripts]# echo $[$a+11]
22
[root@web01 /server/scripts]# echo $[a+11]
22
[root@web01 /server/scripts]# c="$[a+11]"
[root@web01 /server/scripts]# echo $c
22

方法5:
[root@web01 /server/scripts]# a=8
[root@web01 /server/scripts]# declare -i a=a+10
[root@web01 /server/scripts]# echo $a
18
整数或者小数运算:
#bc
[root@web01 /server/scripts]# echo 1+2|bc
3
[root@web01 /server/scripts]# echo 1.1*2|bc
2.2
[root@web01 /server/scripts]# echo 3/2|bc
1
[root@web01 /server/scripts]# echo 3%2|bc
1
[root@web01 /server/scripts]# echo 3.33*9.99|bc
33.26
[root@web01 /server/scripts]# echo "scale=4;3.33*9.99"|bc
33.2667

[root@web01 /server/scripts]# echo 3^2|bc
9
#awk
[root@web01 ~]# echo 1.1 2|awk '{print $1*$2}'
2.2
[root@web01 ~]# echo 1.1 2|awk '{print $1%$2}'
1.1
[root@web01 ~]# echo 4 2|awk '{print $1%$2}'
0
#(()) 逻辑判断
[root@web01 /server/scripts]# a=10
[root@web01 /server/scripts]# ((a++))
[root@web01 /server/scripts]# echo $a
11
[root@web01 /server/scripts]# ((a++))
[root@web01 /server/scripts]# echo $a
12
[root@web01 /server/scripts]# ((a--))
[root@web01 /server/scripts]# echo $a
11
[root@web01 /server/scripts]# ((a--))
[root@web01 /server/scripts]# echo $a
10
[root@web01 /server/scripts]# ((--a))
[root@web01 /server/scripts]# echo $a
9
[root@web01 /server/scripts]# ((--a))
[root@web01 /server/scripts]# echo $a
8
[root@web01 /server/scripts]# ((--a))
[root@web01 /server/scripts]# echo $a
7
[root@web01 /server/scripts]# echo $a
7
[root@web01 /server/scripts]# 
[root@web01 /server/scripts]# 
[root@web01 /server/scripts]# echo $((--a))
6
[root@web01 /server/scripts]# echo $a
6
[root@web01 /server/scripts]# echo $((--a))
5
[root@web01 /server/scripts]# echo $a
5
[root@web01 /server/scripts]# echo $((--a))
4
[root@web01 /server/scripts]# echo $a
4
[root@web01 /server/scripts]# echo $((a--))
4
[root@web01 /server/scripts]# echo $a
3
[root@web01 /server/scripts]# echo $((a--))
3
[root@web01 /server/scripts]# echo $a
2
[root@web01 /server/scripts]# ((8>7))
[root@web01 /server/scripts]# echo $?
0
[root@web01 /server/scripts]# ((8<7))
[root@web01 /server/scripts]# echo $?
1
[root@web01 /server/scripts]# ((8<7&&6>5))
[root@web01 /server/scripts]# echo $?
1
[root@web01 /server/scripts]# ((8<9&&6>5))
[root@web01 /server/scripts]# echo $?
0
[root@web01 /server/scripts]# ((8<7||6>5))
[root@web01 /server/scripts]# echo $?
0

expr功能:

1)计算
[root@web01 /server/scripts]# expr 10 + 10
20

2)获取字符串长度

[root@web01 /server/scripts]# a="oldgirl"
[root@web01 /server/scripts]# echo $a
oldgirl
[root@web01 /server/scripts]# expr length "$a"
7

3)判断字符串是否为整数数字或字符

[root@web01 /server/scripts]# a=1
[root@web01 /server/scripts]# expr $a + 1 &>/dev/null
[root@web01 /server/scripts]# echo $?
0
[root@web01 /server/scripts]# a=oldboy
[root@web01 /server/scripts]# expr $a + 1 &>/dev/null
[root@web01 /server/scripts]# echo $?
2

4)用来判断文件扩展名是否符合指定扩展名

[root@web01 /server/scripts]# cat judge.sh 
  if expr "$1" : ".*\.avi$" >/dev/null ; then
    echo "好兴奋啊"
  else
    echo "好失望啊"
  fi

[root@web01 /server/scripts]# 
[root@web01 /server/scripts]# 
[root@web01 /server/scripts]# 
[root@web01 /server/scripts]# 
[root@web01 /server/scripts]# sh judge.sh oldboy.avi
好兴奋啊
[root@web01 /server/scripts]# sh judge.sh oldboy.log
好失望啊

你可能感兴趣的:(2019-05-28day52Shell实战入门4-5章)