shell变量和引用

11 篇文章 0 订阅

变量和引用

1.全局变量和局部变量的区别

[root@wn2 ~]# vim 6.sh
[root@wn2 ~]# cat 6.sh
#!/bin/bash
func()
{
  echo "global variable v1 is $v1"
  local v1=2
  echo "local variable v1 is $v1"
}
v1=1
func
echo "global variable v1 is $v1"
[root@wn2 ~]# chmod a+rx 6.sh
[root@wn2 ~]# ./6.sh
global variable v1 is 1
local variable v1 is 2
global variable v1 is 1

2.变量的定义

(1)变量名=变量值

“=”前后不能有空格

[root@wn2 ~]# a= 3
bash: 3: 未找到命令...
[root@wn2 ~]# b =4
bash: b: 未找到命令...

字符串类型建议用引号括起来,尤其是特殊字符或有空格

[root@wn2 ~]# stu_name="wangnan"
[root@wn2 ~]# echo $stu_name 
wangnan

取消变量

[root@wn2 ~]# unset stu_name 
[root@wn2 ~]# echo $stu_name 

(2)位置参数和预定义变量

[root@wn2 ~]# vim param.sh
[root@wn2 ~]# cat param.sh
#!/bin/bash
echo "命令行参数的个数:$#"
echo "第一个位置参数是$1"
echo "第二个位置参数是$2"
echo "当前脚本的名称:$0"
echo "以“参数1 参数2 参数3...“的形式返回所有参数的值:$*"
echo "以“参数1”“参数2”“参数3”...的形式返回所有参数的值:$@"
echo "返回本程序的进程ID(PID):$$"
[root@wn2 ~]# bash param.sh shu1 shu2 shu3
命令行参数的个数:3
第一个位置参数是shu1
第二个位置参数是shu2
当前脚本的名称:param.sh
以“参数1 参数2 参数3...“的形式返回所有参数的值:shu1 shu2 shu3
以“参数1”“参数2”“参数3”...的形式返回所有参数的值:shu1 shu2 shu3
返回本程序的进程ID(PID):3245
[root@wn2 ~]# bash param.sh 11 22 33
命令行参数的个数:3
第一个位置参数是11
第二个位置参数是22
当前脚本的名称:param.sh
以“参数1 参数2 参数3...“的形式返回所有参数的值:11 22 33
以“参数1”“参数2”“参数3”...的形式返回所有参数的值:11 22 33
返回本程序的进程ID(PID):3254

$?示例

[root@wn2 ~]# vim ping.sh
[root@wn2 ~]# cat ping.sh
#!/bin/bash
ping -c2 $1 &> /dev/null
if [ $? = 0 ];then
  echo "host $1 is ok"
else
  echo "host $1 is fail"
fi
[root@wn2 ~]# chmod a+rx ping.sh 
[root@wn2 ~]# ./ping.sh 
host  is fail
[root@wn2 ~]# ./ping.sh 192.168.150.1
host 192.168.150.1 is fail
[root@wn2 ~]# ./ping.sh 192.168.150.140
host 192.168.150.140 is ok
[root@wn2 ~]# ./ping.sh 192.168.150.128
host 192.168.150.128 is fail
#  $*和$@的区别
[root@wn2 ~]# set -- "i have" a lovely cat
[root@wn2 ~]# echo $#
4
[root@wn2 ~]# echo $*
i have a lovely cat
[root@wn2 ~]# echo $@
i have a lovely cat
[root@wn2 ~]# for i in $*;do echo $i;done
i
have
a
lovely
cat
[root@wn2 ~]# for i in $@;do echo $i;done
i
have
a
lovely
cat
[root@wn2 ~]# for i in "$*";do echo $i;done
i have a lovely cat
[root@wn2 ~]# for i in "$@";do echo $i;done
i have
a
lovely
cat

计算用户输入任意两个整数的和、差、乘积、商、余数
方法一:

[root@wn2 ~]# vim 1.sh
[root@wn2 ~]# cat 1.sh
#!/bin/bash
a=$1
b=$2
echo a+b=$(($a+$b))
echo a-b=$(($a-$b))
echo a*b=$(($a*$b))
echo a/b=$(($a/$b))
echo a%b=$(($a%$b))
[root@wn2 ~]# ./1.sh 10 3
a+b=13
a-b=7
a*b=30
a/b=3
a%b=1

shift(参数左移一位)

[root@wn2 ~]# shift
[root@wn2 ~]# echo $1
a
[root@wn2 ~]# shift
[root@wn2 ~]# echo $1
lovely
[root@wn2 ~]# shift
[root@wn2 ~]# echo $1
cat
[root@wn2 ~]# shift
[root@wn2 ~]# echo $1

3.shell中的引用

[root@wn2 ~]# echo "current_user is $USER"
current_user is root
[root@wn2 ~]# echo "current_user is: $USER"
current_user is: root
[root@wn2 ~]# echo "current_user is:$USER"
current_user is:root
[root@wn2 ~]# echo 'current_user is:$USER'
current_user is:$USER
[root@wn2 ~]# echo "current_user is:`whoami`"
current_user is:root
[root@wn2 ~]# echo 'current_user is:`whoami`'
current_user is:`whoami`

4.变量的运算

使用let命令可以执行一个或者多个算术表达式,其中的变量名毋需使用$符号

[root@wn2 ~]# r=$((2+5*8))
[root@wn2 ~]# echo $r
42
[root@wn2 ~]# let r=2+5*8
[root@wn2 ~]# echo $r
42

使用expr时,运算符及用于计算的数字左右都至少有一个空格,否则会报错;使用乘号时,必须使用反斜线屏蔽其特定含义;使用expr做计算,将一个未知的变量和一个已知的整数相加,看返回码是否为0,若为0则认为做加法的变量为整数,否则就不是整数。

[root@wn2 ~]# r=`expr 4+3`
[root@wn2 ~]# echo $r
4+3
[root@wn2 ~]# r=`expr 4 + 3`
[root@wn2 ~]# echo $r
7
[root@wn2 ~]# r=`expr 2+5*8`
[root@wn2 ~]# echo $r
2+5*8
[root@wn2 ~]# r=`expr 2 + 5*8`
expr: 非整数参数
[root@wn2 ~]# r=`expr 2 + 5 * 8`
expr: 语法错误
[root@wn2 ~]# r=`expr 2 + 5 /* 8`
expr: 语法错误
[root@wn2 ~]# r=`expr 2 + 5 \* 8`
[root@wn2 ~]# echo $r
42

利用expr计算字符的长度

[root@wn2 ~]# char="i have a"
[root@wn2 ~]# echo $char 
i have a
[root@wn2 ~]# expr length "$char"
8

$[]用于整数运算

[root@wn2 ~]# r=$[3+2]
[root@wn2 ~]# echo $r
5
[root@wn2 ~]# r=$[3+2*5]
[root@wn2 ~]# echo $r
13

awk可用作整数或小数运算

[root@wn2 ~]# awk 'BEGIN {print 2+3*2}'
8
[root@wn2 ~]# awk 'BEGIN {print 2*3*2}'
12

[root@wn2 ~]# echo "3.14 2.31"| awk '{print ($1-$2)}'
0.83
[root@wn2 ~]# echo "3.14 2.31"| awk '{print $1-$2}'
0.83
[root@wn2 ~]# echo "3.14 2.31"|awk '{print $1-$2}'
0.83
[root@wn2 ~]# echo "3.14 2.31 2.32"|awk '{print $1-$2*$3}'
-2.2192
[root@wn2 ~]# echo "3.14 2.31 2.32"|awk '{print ($1-$2*$3)}'
-2.2192

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

[root@wn2 ~]# declare -i r=3+2
[root@wn2 ~]# echo $r
5
[root@wn2 ~]# declare -i r=3+2*5
[root@wn2 ~]# echo $r
13
[root@wn2 ~]# declare r=3+2*5
[root@wn2 ~]# echo $r
13

计算用户输入的任意两个整数的和、差、乘积、商、余数。

(())用于整数运算,在(())中使用变量时可以去掉变量前的$号

方法一:

[root@wn2 ~]# vim 1.sh
[root@wn2 ~]# cat 1.sh
#!/bin/bash
a=$1
b=$2
echo a+b=$(($a+$b))
echo a-b=$((a-b))
echo a*b=$((a*b))
echo a/b=$((a/b))
echo a%b=$((a%b))
[root@wn2 ~]# ./1.sh 10 3
a+b=13
a-b=7
a*b=30
a/b=3
a%b=1

方法二:

[root@wn2 ~]# vim 1.1sh
[root@wn2 ~]# cat 1.1sh
#!/bin/bash
read -p "please input two number:" a b
echo $a+$b=$(($a+$b))
echo $a-$b=$((a-b))
echo $a*$b=$((a*b))
echo $a/$b=$((a/b))
echo $a%$b=$((a%b))
[root@wn2 ~]# chmod a+rx 1.1sh
[root@wn2 ~]# ./1.1sh
please input two number:3 4
3+4=7
3-4=-1
3*4=12
3/4=0
3%4=3

返回变量长度

[root@wn2 ~]# str1="hello world"
[root@wn2 ~]# echo str1
str1
[root@wn2 ~]# echo $str1
hello world
[root@wn2 ~]# echo ${str1}
hello world
#返回变量内容
[root@wn2 ~]# echo ${#str1}
11
#返回变量长度

变量截取

[root@wn2 ~]# echo ${str1:1}
ello world
#指定起始位置,一直到结束
[root@wn2 ~]# echo ${str1:3}
lo world
[root@wn2 ~]# echo ${str1:3:5}
lo wo
#指定起始位置和长度
[root@wn2 ~]# echo ${str1:5}
world
[root@wn2 ~]# echo ${str1::5}
hello
#不指定起始位置,只指定长度,起始位置默认从头开始
#从右边第几个字符开始及字符的个数
[root@wn2 ~]# echo ${str1:0-6:3}
wo
[root@wn2 ~]# echo ${str1:0-1:3}
d
[root@wn2 ~]# echo ${str1:0-3:3}
rld
[root@wn2 ~]# echo ${str1:0-3:1}
r
[root@wn2 ~]# echo ${str1:0-3:2}
rl
#输入右边的几个字符
[root@wn2 ~]# echo ${str1:0-3}
rld
[root@wn2 ~]# echo ${str1:0-5}
world
#输入右边的几个字符
[root@wn2 ~]# echo ${str1: -5}
world
#提取完整的字符串
[root@wn2 ~]# echo ${str1:-5}
hello world
[root@wn2 ~]# echo ${str1: -3}
rld
[root@wn2 ~]# echo ${str1:-3}
hello world

删除字符串

[root@wn2 ~]# file=${filename#*.}
[root@wn2 ~]# echo $file
tar.gz
[root@wn2 ~]# filename=testfile.tar.gz
[root@wn2 ~]# file=${filename##*.}
[root@wn2 ~]# echo $file
gz
[root@wn2 ~]# filename=testfile.tar.gz
[root@wn2 ~]# file=${filename%*.}
[root@wn2 ~]# echo $file
testfile.tar.gz
[root@wn2 ~]# file=${filename%.*}
[root@wn2 ~]# echo $file
testfile.tar
[root@wn2 ~]# filename=testfile.tar.gz
[root@wn2 ~]# file=${filename%%.*}
[root@wn2 ~]# echo $file
testfile
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值