【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表示位置变量,表示第几个位置; *所有参数,$@所有参数等都是预定义变量
[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