【shell】shell变量

【shell学习】shell变量

1.自定义变量

变量值,只能以字母或下划线开口,变量引用 $变量名 或 ${变量名},取消变量 unset

[klaus@localhost learn]$ ip=4.2.2.2
[klaus@localhost learn]$ echo $ip
4.2.2.2
[klaus@localhost learn]$ echo ${ip}
4.2.2.2
[klaus@localhost learn]$ unset ip
[klaus@localhost learn]$ echo ${ip}

上述的变量为shell内部的变量,如果需要设置环境变量,就要用到export

[klaus@localhost learn]$ echo $PATH
/usr/local/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/home/klaus/.local/bin:/home/klaus/bin
[klaus@localhost learn]$ sudo mkdir -p /new/path
[klaus@localhost learn]$ PATH=$PATH:/new/path/
[klaus@localhost learn]$ export PATH
[klaus@localhost learn]$ echo $PATH             
/usr/local/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/home/klaus/.local/bin:/home/klaus/bin:/new/path/

当然你也可以用source命令更新变量环境,不过当前export设置的变量仅为临时变量,下一次登录就没有了,如果想要写成永久的环境变量,直接在~/.bash_profile后面添加就行,加的过程用“:”分隔。

# .bash_profile

# Get the aliases and functions
if [ -f ~/.bashrc ]; then
        . ~/.bashrc
fi

# User specific environment and startup programs
                                                                                                                                                                                                         
PATH=$PATH:$HOME/.local/bin:$HOME/bin

export PATH

2.变量引用

2.1 直接引用,如在脚本中定义变量并引用

[klaus@localhost learn]$ cat ping03.sh
#!/usr/bin/bash
ip1=4.2.2.2

ping -c1 $ip1 &>/dev/null
if [ $? -eq 0 ];then
        echo "$ip1 is ok!"
else
        echo "$ip1 is fail!"
fi
[klaus@localhost learn]$ ./ping03.sh
4.2.2.2 is ok!

其中,$?返回上一次运行的结果,成功则为0,不成功则返回非0值

2.2 脚本交叉使用

比如我需用到其他文件里面定义的参数,具体做法子脚本加载,用“.”或者“source”执行,执行shell为当前shell

[klaus@localhost learn]$ cat ping08.sh
  /usr/bin/bash
ping -c1 $ip1 &>/dev/null
if [ $? -eq 0 ];then
        echo "$ip1 is ok!"
else
        echo "$ip1 is fail!"
fi
[klaus@localhost learn]$ ./ping08.sh
is fail!
[klaus@localhost learn]$ cat public.sh
#!/usr/bin/bash
ip1=4.2.2.2
dir_path=/etc/
[klaus@localhost learn]$ vim ping08.sh
[klaus@localhost learn]$ cat ping08.sh
#!/usr/bin/bash
. ./public.sh    # 其中2个点之间有空格,用source ./public.sh也可以
ping -c1 $ip1 &>/dev/null
if [ $? -eq 0 ];then
        echo "$ip1 is ok!"
else
        echo "$ip1 is fail!"
fi
[klaus@localhost learn]$ ./ping08.sh
4.2.2.2 is ok!

3.位置变量和预定义变量

$1,$2,$3,$4,$5表示位置变量,表示第几个位置; 0 0脚本名, *所有参数,$@所有参数等都是预定义变量

[klaus@localhost learn]$ ./posTest.sh AA BB CC DD ZZ XX
脚本名为:posTest.sh
执行脚本路径为:.
第三个位置的参数是:BB
所有参数是:AA BB CC DD ZZ XX
所有参数是:AA BB CC DD ZZ XX
当前参数总个数是:6
当前进程的PID是:91236
[klaus@localhost learn]$ cat posTest.sh
#!/usr/bin/bash
echo "脚本名为:`basename $0`"
echo "执行脚本路径为:`dirname $0`"
echo "第三个位置的参数是:$2"
echo "所有参数是:$*"
echo "所有参数是:$@"
echo "当前参数总个数是:$#"
echo "当前进程的PID是:$$"

其中, *和 @的区别主要是$*会将整个命令行内容当中一个整体,而 $@会区分各个参数。
这个的basename的作用主要是截取最后的文件名,相对应的dirname的作用是取对应的文件名之前的路径

[klaus@localhost learn]$ basename /usr/bin/python
python
[klaus@localhost learn]$ dirname /usr/bin/python
/usr/bin

4.变量的赋值与键盘读入

显示赋值,直接赋值给变量

[klaus@localhost learn]$ name="klaus MJ"
[klaus@localhost learn]$ echo $name
klaus MJ
[klaus@localhost learn]$ discp="$name is a handsome"
[klaus@localhost learn]$ echo $discp
klaus MJ is a handsome

键盘读入,规则read 变量名

[klaus@localhost chapt2]$ read ip
4.2.2.2
[klaus@localhost chapt2]$ echo $ip
4.2.2.2
[klaus@localhost chapt2]$ read -p "please input a ip:" ip1
please input a ip:4.2.2.3
[klaus@localhost chapt2]$ echo $ip1
4.2.2.3

read还支持倒计时功能,例如read -t 5 “提示信息” 变量:表示倒计时5s。

多个变量输入,-p表示提示

[klaus@localhost chapt2]$ read ip2 ip3 ip4
4.2.2.4 4.2.2.5 4.2.2.6
[klaus@localhost chapt2]$ echo $ip3
4.2.2.5
[klaus@localhost chapt2]$ read -p "输入姓名,性别,年龄:" name sex age
输入姓名,性别,年龄:klaus man 20
[klaus@localhost chapt2]$ echo $name
klaus

5.强弱引用

在shell中,’'表示强引用,""表示若引用

[klaus@localhost chapt2]$ boy="$name is  good\!";echo $boy
klaus is good\!
[klaus@localhost chapt2]$ boy1='$name is  good!';echo $boy1
$name is good!
[klaus@localhost chapt2]$ boy2='\$name is  good!';echo $boy2
\$name is good!
[klaus@localhost chapt2]$

''是常引用,没有变量,""内部,变量还是变量,会被替换成相应的值。

6.命令替换

命令替换用反引号``或者$( ),被引起来或者括号内部的内容会被shell先执行

[klaus@localhost chapt2]$ df -h
Filesystem      Size  Used Avail Use% Mounted on
/dev/sda2        18G   17G     0 100% /
tmpfs           490M  232K  490M   1% /dev/shm
/dev/sda1       283M   67M  201M  25% /boot
[klaus@localhost chapt2]$ disk_size=`df -h | grep '/$' | awk '{print $2}'`
[klaus@localhost chapt2]$ echo $disk_size
18G
[klaus@localhost chapt2]$ disk_size1=$(df -h | grep '/$' | awk '{print $2}')
[klaus@localhost chapt2]$ echo $disk_size1
18G
[klaus@localhost chapt2]$ disk_size2="df -h | grep '/$' | awk '{print $2}'"    
[klaus@localhost chapt2]$ echo $disk_size2
df -h | grep '/$' | awk '{print }'

用双引号引起来的内容完全起不到先执行的效果。

7.变量运算

shell的基本运算为’+’,’-’,’*’,’/’,’%’,有具体以下几种形式
法一、expr $num1 + $num2

[klaus@localhost chapt2]$ expr 1 + 3
4
[klaus@localhost chapt2]$ expr 7 * 23
161

法二、 $(( ))直接运算

[klaus@localhost chapt2]$ echo $((1+23))
24
[klaus@localhost chapt2]$ echo $((7*19))
133

法三、$[ ],同上,也是在括号内部直接计算
法四、let 条件,如

[klaus@localhost chapt2]$ let sum=2+9;echo $sum
11

法五、调用计算器

[klaus@localhost chapt2]$ echo "2^4" | bc
16
[klaus@localhost chapt2]$ echo "1/4" | bc  
0

小数计算,通常采用截取的办法

[klaus@localhost chapt2]$ echo "scale=2; 1/4" | bc  # scale表示保留的小数点位数
.25
[klaus@localhost chapt2]$ awk 'BEGIN {print 1/4}'
0.25
[klaus@localhost chapt2]$ echo "print 1.0/4.0" | python  #调用python
0.25

8.索引切片

shell同样支持切片功能

[klaus@localhost chapt2]$ url=www.baidu.com
[klaus@localhost chapt2]$ echo $url
www.baidu.com
[klaus@localhost chapt2]$ echo ${url:0:5}
www.b
[klaus@localhost chapt2]$ echo ${url:5:5}  
aidu.
[klaus@localhost chapt2]$ echo ${url:5}   
aidu.com
[klaus@localhost chapt2]$

第一个0代表起始的位置,第二个0代表多少位,第二个参数如果没有的话,就默认为后面的所有。

9,变量替换

变量替换的原则是,变量如果有就不替换,包括空格,替换规则:${变量名-新的变量名}

[klaus@localhost chapt2]$ va1=
[klaus@localhost chapt2]$ va2=111
[klaus@localhost chapt2]$ echo $va1;echo $va2

111
[klaus@localhost chapt2]$ unset va2
[klaus@localhost chapt2]$ echo $va2      

[klaus@localhost chapt2]$ echo ${va2-222}    
222
[klaus@localhost chapt2]$ echo ${va1-333}

[klaus@localhost chapt2]$

同样,如果用${变量名:-新的变量名},这里空格也会被替代,其他同上面一样

[klaus@localhost chapt2]$ va3=
[klaus@localhost chapt2]$ echo ${va3:-333}
333
发布了80 篇原创文章 · 获赞 86 · 访问量 9万+

猜你喜欢

转载自blog.csdn.net/klaus_x/article/details/104035207