linux中$符号的基础⽤法总结
linux使⽤版本: CentOS 7
[root@azfdbdfsdf230lqdg1ba91 ~]# cat /etc/redhat-release
CentOS Linux release 7.4.1708 (Core)
[root@azfdbdfsdf230lqdg1ba91 ~]# uname -a
Linux azfdbdfsdf230lqdg1ba91 3.10.0-693.2.2.el7.x86_64 #1 SMP Tue Sep 12 22:26:13 UTC 2017 x86_64 x86_64 x86_64 GNU/Linux
[root@azfdbdfsdf230lqdg1ba91 ~]#
$符号草集
⽬标
linux版本命令$符号在linux系统的有着很多很重要的作⽤,特别是在编写bash脚本的时候,随处可见$的⾝影。由于他的千变万化,多种多样,使对他的掌握和使⽤,尤其是记忆带来了挑战,所以,现在,我们来⼀起将它的⽤
法做⼀次汇总,形成草集。掌握他们不会让你⼯资⼤涨,因为⾯试不会问到,但是会提⾼你的⼯作效率,扩展你的视野
⽬前,我所知道的$⽤法有$、"$"、$0 $1 $n、$#、$@ $*、$?、$()、${}、${#}、$[]、$-、$!、$$。额外!$,!!,依次详说
$ 获取变量值
$可获取变量的值
[root@izbp10lqlgy2g31s41bt94z ~]# a=1
[root@izbp10lqlgy2g31s41bt94z ~]# echo $a
1
"$" 获取变量值时最好使⽤"括起来
为什么有这个建议呢,看实例
[root@izbp10lqlgy2g31s41bt94z ~]# echo get value of a = $a
get value of a = 1
[root@izbp10lqlgy2g31s41bt94z ~]# echo "get value of a = $a"
get value of a = 1
可以看到,有⽆"双引号括起来似乎效果是⼀样的。别早下结论,往下看
[root@izbp10lqlgy2g31s41bt94z ~]# a="i am skyler"
[root@izbp10lqlgy2g31s41bt94z ~]# [ $a == "i am skyler" ]
-bash: [: 参数太多
这⾥解析下[],[]是条件判断符号,相当于test命令。他的意思是判断a变量的值是否等于"i am skyler"。
那么为什么会报错呢,因为[ $a == "i am skyler"]这种写法变量解析后成为[ i am skyler == "i am skyler" ],很明显,这个判断式⽆法判断等号两边的字符串,我们想要的是[ "i am skyler" == "i am skyler" ]的⽐较。所以平时我们在是name"
[root@izbp10lqlgy2g31s41bt94z ~]# [ "$a" == "i am skyler" ]
[root@izbp10lqlgy2g31s41bt94z ~]# echo $?
使⽤双引号后就可以了,这⾥提前⽤了下$?,他的意思是判断前⼀个命令执⾏结果是否正确。输出的结果中,0表⽰执⾏成功,⾮零值表⽰出错
${}⽤于区分变量的边界,明确告诉程序要取哪个变量的值
如下实例,不加{}程序⽆法判断ab $abc哪个是变量,⽆法解析
[root@izbp10lqlgy2g31s41bt94z ~]# echo "get value of a = $abc"
get value of a =
[root@izbp10lqlgy2g31s41bt94z ~]# echo "get value of a = ${a}bc"
get value of a = 1bc
[root@izbp10lqlgy2g31s41bt94z ~]#
${#}获取变量值的长度
[root@izbp10lqlgy2g31s41bt94z ~]# echo "get length of a = ${#a}"
get length of a = 1
[root@izbp10lqlgy2g31s41bt94z ~]# a=11111
[root@izbp10lqlgy2g31s41bt94z ~]# echo "get length of a = ${#a}"
get length of a = 5
[root@izbp10lqlgy2g31s41bt94z ~]# a=skyler
[root@izbp10lqlgy2g31s41bt94z ~]# echo "get length of a = ${#a}"
get length of a = 6
[root@izbp10lqlgy2g31s41bt94z ~]#
$0 $1 $n 获取⽂件名称和参数值,⼀般在bash脚本中较多
$0 表⽰shell脚本⽂件名;从1开始表⽰第⼏个参数,1表⽰第⼀个参数。这⾥我们创建⼀个test.sh可执⾏⽂件创建⼀个test.sh⽂件并填充代码
[root@izbp10lqlgy2g31s41bt94z ~]# echo 'echo $0 $1 $2' > test.sh
[root@izbp10lqlgy2g31s41bt94z ~]# cat test.sh
echo $0 $1 $2
执⾏test.sh 并传⼊变量
[root@izbp10lqlgy2g31s41bt94z ~]# sh test.sh i am skyler
test.sh i am
可以看到,三个参数中前两个打印出来了,因为我们没有声明$3,所有打印出了⽂件名称和前两个参数$# 获取参数数量
[root@izbp10lqlgy2g31s41bt94z ~]# echo 'echo $# $0 $1' > test.sh
[root@izbp10lqlgy2g31s41bt94z ~]# cat test.sh
echo $# $0 $1
[root@izbp10lqlgy2g31s41bt94z ~]# sh test.sh I am a shuashua
4 test.sh I
$@ $* 数组的形式引⽤参数列表
它们的区别在于使⽤双引号括起来⽤时,假设传⼊的参数为1 2 3,那么"*的值为”1 2 3”⼀个变量
test.sh
echo '$@的数组参数格式'
for x in "$@"
do
echo + $x
done
echo '$*的数组参数格式'
for x in "$*"
do
echo + $x
done
root@izbp10lqlgy2g31s41bt94z:~# sh test.sh 1 2 3
$@的数组参数格式
+ 1
+ 2
+ 3
$*的数组参数格式
+ 1 2 3
$? 判断上⼀个命令执⾏是否成功
执⾏成功值时0,失败是⾮0
[root@izbp10lqlgy2g31s41bt94z ~]# ll
总⽤量 172
-rw-r--r-- 1 root root 49392 2⽉ 25 2019 hs_err_pid24203.log
-rw-r--r-- 1 root root 49425 2⽉ 13 2019 hs_err_pid25726.log
[root@izbp10lqlgy2g31s41bt94z ~]# echo $?
[root@izbp10lqlgy2g31s41bt94z ~]# ca ff
-bash: ca: 未到命令
[root@izbp10lqlgy2g31s41bt94z ~]# echo $?
127
$() 等同于使⽤双引号的作⽤
略
$[] 表达式计算
此时的[]不是⽤于判断式的场景,[]作为判断式⼀般⽤于bash脚步中if while等条件语句
[root@izbp10lqlgy2g31s41bt94z ~]# echo $[5 + 5]
10
$- 显⽰shell所使⽤的当前选项
[root@izbp10lqlgy2g31s41bt94z ~]# echo $-
himBH
解释:himBH每⼀个字符是⼀个shell的选项,详情man bash然后搜索 -h -B 等。详情参考:kodango/explain-shell-default-options
$! 获取后台运⾏最后⼀个进程的pid,更多应⽤在bash脚本
[root@izbp10lqlgy2g31s41bt94z ~]# cat test.sh &
[1] 362
[root@izbp10lqlgy2g31s41bt94z ~]# echo $# $0 $1
^C
[1]+ 完成 cat test.sh
[root@izbp10lqlgy2g31s41bt94z ~]# echo $!
362
!$ 将上⼀条命令的参数传递给下⼀条命令的参数,平时⽤于更⽅便,更多应⽤在bash脚本
[root@izbp10lqlgy2g31s41bt94z ~]# cd /Users/skyler/project/test
[root@izbp10lqlgy2g31s41bt94z ~]# ll !$
[root@izbp10lqlgy2g31s41bt94z ~]# ll /Users/skyler/project/test
362
!! 将上⼀条命令输出,平时⽤于更⽅便,更多应⽤在bash脚本
[root@izbp10lqlgy2g31s41bt94z ~]# !!
[root@izbp10lqlgy2g31s41bt94z ~]# ll /Users/skyler/project/test
$$ 获取当前进程pid
[root@izbp10lqlgy2g31s41bt94z ~]# echo $$
31268
[root@izbp10lqlgy2g31s41bt94z ~]# ps -ef|grep 31268
root 31268 31266 0 08:10 pts/0 00:00:00 -bash
当前的进程是bash,pid是31268
平⽇多加练习,⽤时随⼼索取
段进⾏分页拉取也是可以达到效果的,具体还是要由业务场景来定。
总结
以上就是这篇⽂章的全部内容了,希望本⽂的内容对⼤家的学习或者⼯作具有⼀定的参考学习价值,谢谢⼤家对的⽀持。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论