Shell变量

一、变量的类型

1、自定义变量

定义变量: 变量名=变量值 变量名必须以字母或下划线开头,区分大小写   ip1=192.168.2.115
引用变量: $变量名 或 ${变量名}
查看变量: echo $变量名  set(所有变量:包括自定义变量和环境变量)
取消变量: unset 变量名
作用范围: 仅在当前shell中有效

2、环境变量

定义环境变量: 方法一 export back_dir2=/home/backup
方法二 export back_dir1 将自定义变量转换成环境变量
引用环境变量: $变量名 或 ${变量名}
查看环境变量: echo $变量名 env   例如env |grep back_dir2
取消环境变量: unset 变量名
变量作用范围: 在当前shell和子shell有效

3、位置变量

$1 $2 $3 $4 $5 $6 $7 $8 $9 ${10} ${11}

4、预定义变量

$0 脚本名
$* 所有的参数
$@ 所有的参数
$# 参数的个数
$$ 当前进程的PID
$! 上一个后台进程的PID
$? 上一个命令的返回值 0表示成功

示例1:

[root@lichu ~]# vim test.sh
echo "第2个位置参数是$2"
echo "第1个位置参数是$1"
echo "第4个位置参数是$4"
​
echo "所有参数是: $*"
echo "所有参数是: $@"
echo "参数的个数是: $#"
echo "当前进程的PID是: $$"
​
echo '$1='$1
echo '$2='$2
echo '$3='$3
echo '$*='$*
echo '$@='$@
echo '$#='$#
echo '$$='$$
​
[root@lichu ~]# chmod +x test.sh
[root@lichu ~]# ./test.sh li lichu alice jack tom 100
第2个位置参数是lichu
第1个位置参数是li
第4个位置参数是jack
所有参数是: li lichu alice jack tom 100
所有参数是: li lichu alice jack tom 100
参数的个数是: 6
当前进程的PID是: 76416
$1=li
$2=lichu
$3=alice
$*=li lichu alice jack tom 100
$@=li lichu alice jack tom 100
$#=6
$$=76416

示例2:

[root@lichu ~]# vim 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@lichu ~]# chmod a+x ping.sh
[root@lichu ~]# ./ping.sh www.baidu.com
[root@lichu ~]# ./ping.sh 192.168.92.100

二、变量的赋值方式

1、显式赋值

变量名=变量值

ip1=192.168.1.251
school="BeiJing qfedu"
today1=`date +%F`
today2=$(date +%F)          

2、read 从键盘读入变量值

语法:
read 变量名
read -p “提示信息: ” 变量名
read -t 5 -p “提示信息: ” 变量名
read -n 2 变量名

示例3:

[root@lichu ~]# vim first.sh
back_dir1=/var/backup
read -p "请输入你的备份目录: " back_dir2
echo $back_dir1
echo $back_dir2
# chmod +x first.sh
# ./first.sh

示例4:

[root@lichu ~]# vim ping2.sh
#!/bin/bash                         
read -p "Input IP: " ip                
ping -c2 $ip &>/dev/null                
if [ $? = 0 ];then                                      
        echo "host $ip is ok"       
else                                                                                    
        echo "host $ip is fail"     
fi                                      
[root@lichu ~]# chmod a+x ping2.sh
[root@lichu ~]# ./ping.sh

定义或引用变量时注意事项

" "     弱引用
' ' 强引用
[root@lichu ~]# school=1000phone
[root@lichu ~]# echo "${school} is good"
1000phone is good
[root@lichu ~]# echo '${school} is good'
${school} is good

` ` 命令替换 等价于 $()   反引号中的shell命令会被先执行
[root@lichu ~]# touch `date +%F`_file1.txt  
[root@lichu ~]# touch $(date +%F)_file2.txt
 
[root@lichu ~]# disk_free3="df -Ph |grep '/$' |awk '{print $4}'" # 错误
[root@lichu ~]# disk_free4=$(df -Ph |grep '/$' |awk '{print $4}')
[root@lichu ~]# disk_free5=`df -Ph |grep '/$' |awk '{print $4}'`  

三、变量的运算

1、整数运算

[root@lichu ~]# num1=2
[root@lichu ~]# num2=5

方法一:expr
expr 1 + 2
expr $num1 + $num2   +  - \* / %

方法二:$(())
echo $(($num1+$num2))     +  - * /   %
echo $((num1+num2))
echo $((5-3*2))
echo $(((5-3)*2))
echo $((2**3))
sum=$((1+2)); echo $sum

方法三:$[]
echo $[5+2] +  - * / %
echo $[5**2]

方法四:let
let sum=2+3; echo $sum
let i++; echo $i

2、小数运算

方法一:bc
echo "2*4" |bc
echo "2^4" |bc
echo "scale=2;6/4" |bc

方法二:awk
awk 'BEGIN{print 1/2}'

方法三:python
echo "print 5.0/2" |python

四、变量”内容”的删除和替换(扩展了解)

1、变量”内容”的删除

[root@lichu ~]# url=www.sina.com.cn
[root@lichu ~]# echo ${#url} # 获取变量值的长度
15
[root@lichu ~]# echo ${url}   # 标准查看
www.sina.com.cn
[root@lichu ~]# echo ${url#*.} # 从前往后,最短匹配(*任意字符,匹配到第一个.)
sina.com.cn
[root@lichu ~]# echo ${url##*.} # 从前往后,最长匹配 贪婪匹配
cn

[root@lichu ~]# url=www.sina.com.cn
[root@lichu ~]# echo ${url}
www.sina.com.cn
[root@lichu ~]# echo ${url%.*} # 从后往前,最短匹配
www.sina.com
[root@lichu ~]# echo ${url%%.*} # 从后往前,最长匹配 贪婪匹配
www

[root@lichu ~]# url=www.sina.com.cn
[root@lichu ~]# echo ${url#a.}
www.sina.com.cn
[root@lichu ~]# echo ${url#*sina.}
com.cn

[root@lichu ~]# hostname lichu.1000phone.com # 设置临时主机名
退出shell,重新连接

[root@lichu ~]# echo $HOSTNAME
lichu.1000phone.com
[root@lichu ~]# echo ${HOSTNAME%%.*}
lichu

索引及切片
[root@lichu ~]# url=www.sina.com.cn
[root@lichu ~]# echo ${url:0:5} # 从第一个(0)字符开始,取5个字符
[root@lichu ~]# echo ${url:5:5}
[root@lichu ~]# echo ${url:5}

2、变量”内容”的替换

[root@lichu ~]# url=www.sina.com.cn
[root@lichu ~]# echo ${url/sina/baidu}
www.baidu.com.cn

[root@lichu ~]# url=www.sina.com.cn
[root@lichu ~]# echo ${url/n/N} # /替换第一个
www.siNa.com.cn
[root@lichu ~]# echo ${url//n/N} # //替换全部 贪婪匹配
www.siNa.com.cN

4、变量的替代

#准备场景
[root@lichu ~]# unset var1
[root@lichu ~]# unset var2
[root@lichu ~]# unset var3
[root@lichu ~]#                                     # var1没有定义
[root@lichu ~]# var2=                               # var2有定义,但为空值
[root@lichu ~]# var3=111                            # var3有定义,有值
​
#第一种替代 ${变量名-新的变量值}
[root@lichu ~]# echo ${var1-aaaa}
aaaa
[root@lichu ~]# echo ${var2-aaaa}
​
[root@lichu ~]# echo ${var3-aaaa}
111
#变量没有被赋值:会使用“新的变量值“ 替代
#变量有被赋值(包括空值): 不会被替代
​
#第二种替代 ${变量名:-新的变量值}
[root@lichu ~]# echo ${var1:-aaaa}
aaaa
[root@lichu ~]# echo ${var2:-aaaa}
aaaa
[root@lichu ~]# echo ${var3:-aaaa}
111
#变量没有被赋值(包括空值):都会使用“新的变量值“ 替代
#变量有被赋值: 不会被替代

结论:${变量名-新的变量值} 和 ${变量名:-新的变量值} 仅对空值变量有影响 var2

示例5:

​​[root@lichu scripts]# vim var1.sh
#!/bin/bash
read -p "输入端口[默认为80]: " port
echo "你输入的端口为: $port"
​
[root@lichu scripts]# chmod +x var1.sh 
[root@lichu scripts]# ./var1.sh 
输入端口[默认为80]:                                # 直接回车,没有输入
你输入的端口为: 
​
[root@lichu scripts]# vim var2.sh
#!/bin/bash
read -p "输入端口[默认为80]: " port
echo "你输入的端口为: ${port:-80}"
​
[root@lichu scripts]# ./var2.sh 
输入端口[默认为80]: 21
你输入的端口为: 21
[root@lichu scripts]# ./var2.sh 
输入端口[默认为80]: 
你输入的端口为: 80

五、i++ 和 ++i (扩展了解)

1、对表达式的值的影响

[root@lichu ~]# unset i
[root@lichu ~]# unset j

[root@lichu ~]# i=1
[root@lichu ~]# j=1

[root@lichu ~]# let x=i++         # 先赋值,再运算
[root@lichu ~]# let y=++j         # 先运算,再赋值

[root@lichu ~]# echo $i
2
[root@lichu ~]# echo $j
2
[root@lichu ~]# echo $x
1
[root@lichu ~]# echo $y
2

💡 感谢你读到这里!这篇《Shell变量》是我的用心分享,如果你觉得有收获,不妨:


点个「赞」或「分享」,让更多同路人相遇


🔍 关注我的博客,持续接收技术/成长类干货


💬 文末留言聊聊你的想法,或遇到的同类问题~


🔒 本文为原创,转载请保留原文链接(https://www.lichu228.top/archives/374)与作者信息,感谢尊重与支持!


🌐 想找更多优质内容?点击进入博客主页探索吧~


暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇