一.SHELL脚本中的变量
1.1.什么是变量
- 在编写程序时,通常会遇到被操作对象不固定的情况
- 我们需要用一串固定的字符来表示不固定的值这就是变量存在的根本意义
- 变量的实现原理就是内存存储单元的一个符号名称
1.2.变量的命名规则
变量的名称中只能包含数字、大小写字母以及下划线
变量的名称只能用大小写字母及下划线开头
同一名称变量在多次被赋值时为覆盖动作
在企业代码规范化中变量的命名规则如下
简短全大写变量名 LOCAL
首字母大写子类变量名 Local_Shell
驼峰类型变量名:localS_She
1.3.变量的调用方法
调取haha这个变量值
[root@hehe ~]# haha=1
[root@hehe ~]# echo $haha
1
如果我们想表示1b
$haha这个变量调用方式是使用hahab这串字符变量的值
${haha}b 如果需要在一串字符中特别说明那些字符表示变量那些字符不是,那么需
要用变量声明${}
[root@hehe ~]# haha=1
[root@hehe ~]#
[root@hehe ~]# echo ${haha}b
1b
[root@hehe ~]#
1.4.字符的转义及引用
- 在shell中有很多本身有特殊功能的字符,比如空格井号等等
- 如果在给变量赋值或执行命令使用时我们只想使用这些符号本身那么就需要用到转义或引用
- 在shell中反斜杠表示转义,每个反斜杠只能转义一个字符
- 在shell中单引号表示强引用,我们可以把它看作批量转义,在单引号内的所有字符被视为字符本身
- 在shell中双引号表示弱引用,其和单引号的区别在于不能引用(` \ ! $)
[root@hehe ~]# echo #
[root@hehe ~]# echo /#
/#
[root@hehe ~]# echo $1
[root@hehe ~]# echo /$1
/
[root@hehe ~]# echo '$1'
$1
[root@hehe ~]# echo # #
[root@hehe ~]# echo "# #"
# #
[root@hehe ~]#
1.5.变量的类型
函数级变量
[root@hehe shells]# vim test.sh
#!/bin/bash
LOCAL () {
a=1
echo $a
}
LOCAL
[root@hehe shells]# sh test.sh
1
环境级变量
环境级别变量只在当前运行的shell中生效,shell关闭变量被释放
[root@bogon ~]# export a=4
[root@bogon ~]# vim text.sh
#!/bin/bash
echo $a
[root@bogon ~]# sh text.sh
4
用户级变量只有登录系统的指定用户,此变量才生效
[root@bogon ~]# vim ~/.bash_profile
配置文件中加export a=8
[root@bogon ~]# source ~/.bash_profile
[root@bogon ~]# sh text.sh
8
[root@bogon ~]# vim /etc/profile.d/a.sh
#!/bin/bash
export a=10
[root@bogon ~]# source /etc/profile.d/a.sh
[root@bogon ~]# sh text.sh
10
[root@bogon ~]#
在系统中通常设置系统变量是编辑文件更加安全
文件修改完毕后需要用source命令使其生效
1.6.常见的系统及变量
变量
|
说明
|
PATH
|
命令的搜索路径,以冒号作为分隔符
|
HOME
|
用户的家目录的路径,是cd命令的默认参数
|
COLUMNS
|
命令行编辑模式下可使用命令的长度
|
HISTFILE
|
命令历史的文件路径
|
HISTFILESIZE
|
命令历史中包含的最大行数
|
HISTSIZE
|
history命令输出的记录数
|
LOGNAME|USER
|
当前用户的名字
|
SHELL
|
当前使用的shell
|
PWD
|
当前的工作目录
|
PS1
|
命令行提示符变量
|
PATH指定命令执行路径是非常有用
如果我想在当前用户中可以用相对路径方式调用/shell下的所有可执行文件
[root@haha ~]# vim ~/.bash_profile
PATH=$PATH:/shell
[root@haha ~]# source ~/.bash_profile
[root@haha ~]#
1.7.特殊变量定义方式
1.7.1.用命令的执行结果定义变量
在执行命令时如果想让指定命令优先执行可以使用 $(cmd) 或 ``
[root@haha shell]# echo your hostname is hostname
your hostname is hostname
[root@haha shell]# echo your hostname is $(hostname)
your hostname is haha
[root@haha shell]# echo your hostname is `hostname`
your hostname is haha
[root@haha shell]#
1.7.2.传参变量
很多情况下,shell脚本需要接受用户的输入,根据用户的输入来执行不同的操作。
从命令行传递给shell脚本的参数又称为叫做位置参数,shell脚本会根据参数的位置使用不同的位置参数变量读取他们的值
变量 | 说明 |
$0 |
当前脚本的名称
|
$* |
以“参数1 参数2 参数3”的形式返回所有参数的值
|
$n |
当前传递给脚本的第n个参数,比如$1表示脚本的第一个参数,$2表示脚本的第二个参
数……
|
$# |
命令行的参数的个数
|
$@ |
以“参数1” “参数2” “参数3” 的形式返回所有参数的值
|
[root@haha shell]# vim haha.sh
#!/bin/bash
echo '$0' is $0
echo '$1' is $1
echo '$2' is $2
echo '$3' is $3
echo '$#' is $#
echo '$*' is $*
echo '$@' is $@
[root@haha shell]# sh haha.sh wywy wush ohs
$0 is haha.sh
$1 is wywy
$2 is wush
$3 is ohs
$# is 3
$* is wywy wush ohs
$@ is wywy wush ohs
1.7.3 交互式传参
利用read命令可以和脚本执行者进行交互传参
交互赋值变量
[root@haha shell]# read a b c
12 2 3
[root@haha shell]# echo $a $b $c
12 2 3
[root@haha shell]#
交互赋值数组
[root@haha shell]# read -a haha
hello hi nihao
[root@haha shell]# echo ${haha[*]}
hello hi nihao
[root@haha shell]# echo ${haha[0]}
hello
[root@haha shell]# echo ${haha[1]}
hi
[root@haha shell]# echo ${haha[2]}
nihao
[root@haha shell]#
交互赋值并显示提示符
[root@haha shell]# read -p "please input word:" WORD
please input word:1234
[root@haha shell]# echo $WORD
1234
交互赋值不显示提示符
[root@haha shell]# read -p "please input word:" -s WORD
please input word:
[root@haha shell]# echo $WORD
12345678
设置赋值时间
[root@haha shell]# read -t 5 -p "please input word:" WORD
please input word:[root@haha shell]#
设置赋值长度
[root@haha shell]# read -n 5 -p "please input word:" WORD
please input word:hahah[root@haha shell]#
设置指定结尾字符
[root@haha shell]# read -d "."
agdgasduyaduasvduhauydsa.[root@haha shell]#
1.7.4 数组变量
设置数组并查看所有
[root@haha shell]# a=(1 2 3 4 5)
[root@haha shell]# echo ${a[*]}
1 2 3 4 5
取其中一位数
[root@haha shell]# echo ${a[0]}
1
[root@haha shell]# echo ${a[1]}
2
[root@haha shell]# echo ${a[2]}
3
取数组的最后一个元素
[root@haha shell]# echo ${a[-1]}
5
取数组的第1-3个元素
[root@haha shell]# echo ${a[*]:0:3}
1 2 3
查看数组的元素个数
[root@haha shell]# echo ${#a[*]}
5
管理数组元素
[root@haha shell]# a[0]=9
[root@haha shell]# echo ${a[*]}
9 2 3 4 5
[root@haha shell]# a[1]=8
[root@haha shell]# echo ${a[*]}
9 8 3 4 5
[root@haha shell]#
删除数组
[root@haha shell]# unset a
1.7.5.变量中字符串的取值管理
[root@haha ~]# haha="/ahha/hehe/shhs/hello"
[root@haha ~]# echo ${haha}
/ahha/hehe/shhs/hello
[root@haha ~]# echo ${#haha}
21
[root@haha ~]# echo ${haha:5}
/hehe/shhs/hello
[root@haha ~]# echo ${haha:1}
ahha/hehe/shhs/hello
[root@haha ~]# echo ${haha:1:5}
ahha/
[root@haha ~]# echo ${haha#*h}
ha/hehe/shhs/hello
[root@haha ~]# echo ${haha#*e}
he/shhs/hello
[root@haha ~]# echo ${haha##*e}
llo
[root@haha ~]# echo ${haha%h*}
/ahha/hehe/shhs/
[root@haha ~]# echo ${haha%%h*}
/a
[root@haha ~]# echo ${haha/h/w}
/awha/hehe/shhs/hello
[root@haha ~]# echo ${haha//h/w}
/awwa/wewe/swws/wello
[root@haha ~]#
1.7.5.脚本中的函数
变量是一个变化值的别名
函数就是一段程序的别名
1.解决代码重复问题
[root@haha shell]# vim text.sh
#!/bin/bash
ECHO ()
{
echo -e "\033[31mhello\033[0m"
echo -e "\033[32mhello\033[0m"
echo -e "\033[33mhello\033[0m"
}
ECHO
2.代码无限循环
[root@haha shell]# vim haha.sh
#!/bin/bash
ACTION () {
read -p "please input word:" WORD
[ "$WORD" = "exit" ] && {
echo bye
exit 0
}
ACTION
}
ACTION
[root@haha shell]# vim haha.sh
[root@haha shell]# sh haha.sh
please input word:hah
please input word:jssus
please input word:shudai
please input word:exit
bye
二.shell中的运算
2.1.shell中的运算命令
[root@haha shell]# ((a=1+2))
[root@haha shell]# echo $a
3
[root@haha shell]# echo $((a=2+3))
5
[root@haha shell]# let a=3+4
[root@haha shell]# echo $a
7
[root@haha shell]# expr 1 / 4
0
[root@haha shell]# expr 2 \* 4
8
[root@haha shell]# expr 3 / 3
1
[root@haha shell]# bc
bc 1.07.1
Copyright 1991-1994, 1997, 1998, 2000, 2004, 2006, 2008, 2012-2017 Free Software Foundation, Inc.
This is free software with ABSOLUTELY NO WARRANTY.
For details type `warranty'.
1/3
0
3/3
1
3*4
12
scale=2 #计算到小数点后两位
3/4
.75
6/10
.60
4/3
1.33
^C
(interrupt) Exiting bc.
[root@haha shell]# echo $[a=1+1]
2
[root@haha shell]# echo $[4*3]
12
[root@haha shell]# awk 'BEGIN {print 3*4}'
12
[root@haha shell]# awk 'BEGIN {print 4/3}'
1.33333
[root@haha shell]# declare -i a=1+10
[root@haha shell]# echo $a
11
2.2.shell中的数学运算符号
[root@haha shell]# echo $((a=1+4))
5
[root@haha shell]# echo $((a=1-4))
-3
[root@haha shell]# echo $((a=1*4))
4
[root@haha shell]# echo $((a=1/4))
0
[root@haha shell]# echo $((a=1%4))
1
[root@haha shell]# echo $((a=2**4))
16
i++和++i
for ((i=1;i<10;i++))
do
echo $i
done
[root@haha shell]# sh for.sh
1
2
3
4
5
6
7
8
9
for ((i=1;i<10;++i))
do
echo $i
done
[root@haha shell]# sh for.sh
1
2
3
4
5
6
7
8
9
验证+=
for i in {1..5}
do
((a+=i))
echo $a
done
[root@haha shell]# sh for.sh
1
3
6
10
15
[root@haha shell]#
2.3.位运算
2.3.1.什么是位运算
程序中的所有数在计算机内存中都是以二进制的形式储存的
位运算就是直接对整数在内存中的二进制位进行操作
2.3.2 位逻辑运算
[root@haha ~]# echo $((8<<2))
32
[root@haha ~]# echo $((8>>2))
2
[root@haha ~]# a=2
[root@haha ~]# echo $((a<<=1))
4
[root@haha ~]# echo $((a>>=1))
1
[root@haha ~]# echo $((1&2))
0
[root@haha ~]# echo $((1|2))
3
[root@haha ~]# echo $((1^2))
3
[root@haha ~]# a=3
[root@haha ~]# echo $((~a))
-4
[root@haha ~]#
[root@haha ~]# a=4
[root@haha ~]# echo $((a&=2))
0
[root@haha ~]# a=3
[root@haha ~]# echo $((a|=2))
3
[root@haha ~]# echo $((a^=2))
1