shell中变量的取值与赋值

简介:

取值是很简单的,例如var=bbb,那么${var}ccc的结果就是bbbccc,在包含字符串的时候要用到三种引号,分别是单引号、双引号和反引号,现来一一讨论

一、整体引用

 
  1. mv "a ~file name.txt" another.txt 

在这种情况下,单双引号是没有什么区别,它们的意义相同。

二、变量替换

 
  1. echo "The value of '${var}' is ${var}"

在这种情况下,当一个变量被用在双引号括起来的句子里面的时候,它会被替换成它的内容;而当使用单引号的时候,变量替换则不会发生。所以可以说单引号是更强的引用。像上面那个例子的输出结果为:

 
  1. The value of '${var}' is bbb

三、命令替换

 
  1. var='uname -r' 

这样,变量$var的值就是命令uname -r的输出。

比变量替换更高级的是匹配,例如:${f%jpg}是用jpg对变量f从后面开始进行匹配,并把匹配上的部分(也就是扩展名)去掉,同时使用两个百分号的时候,表示使用了最大匹配方式,比如"abcdabcd",在用a*d匹配的时候,如果是最大匹配,就会匹配所有8个字符,而用最小匹配的时候则会匹配4个。与百分号相对应,也可以使用"#"来对变量进行从前向后的匹配,同样也可以用两个来表示最大匹配。

来看个例子

 
  1. #!/bin/bash  
  2. for var in *.sh  
  3. do  
  4. echo "${var%sh}"  
  5. done  

结果如下

 
  1. test1.  
  2. test2.  
  3. test3.  
  4. test.  

看到了后缀都没有了,可以用以修改后缀名

 
  1. #!/bin/bash  
  2. for var in *.sh  
  3. do  
  4. mv "${var}" "${var%sh}SH"  
  5. done  

这样小写的sh就变成大写的了。

写个简单的循环替换

 
  1. grep -v "^#" /etc/passwd |\  
  2. while read i  
  3. do  
  4. echo ${i%%:*}  
  5. done 

第一行:-v是取反的意思,"^#"是取开头非#的行,最后的"\",如果将以上代码直接写成一个文件那么最后那个反斜杠可以不要,但是在shell窗口中一行一行的写那么反斜杠是必须加上的,它会告诉编译器还没有结束。

第四行:%%:*意思是从最后到":"进行最大匹配,这样就只剩下第一个":"号以前的内容了,看看结果

替换前

 
  1. sucre@sucre-ubuntu:~$ cat /etc/passwd  
  2. root:x:0:0:root:/root:/bin/bash  
  3. daemon:x:1:1:daemon:/usr/sbin:/bin/sh  
  4. bin:x:2:2:bin:/bin:/bin/sh  
  5. sys:x:3:3:sys:/dev:/bin/sh  
  6. sync:x:4:65534:sync:/bin:/bin/sync  
  7. games:x:5:60:games:/usr/games:/bin/sh  
  8. man:x:6:12:man:/var/cache/man:/bin/sh  
  9. lp:x:7:7:lp:/var/spool/lpd:/bin/sh  
  10. mail:x:8:8:mail:/var/mail:/bin/sh  
  11. news:x:9:9:news:/var/spool/news:/bin/sh  
  12. uucp:x:10:10:uucp:/var/spool/uucp:/bin/sh  
  13. proxy:x:13:13:proxy:/bin:/bin/sh  
  14. www-data:x:33:33:www-data:/var/www:/bin/sh  
  15. backup:x:34:34:backup:/var/backups:/bin/sh  
  16. list:x:38:38:Mailing List Manager:/var/list:/bin/sh  
  17. irc:x:39:39:ircd:/var/run/ircd:/bin/sh  
  18. gnats:x:41:41:Gnats Bug-Reporting System (admin):/var/lib/gnats:/bin/sh  
  19. nobody:x:65534:65534:nobody:/nonexistent:/bin/sh  
  20. libuuid:x:100:101::/var/lib/libuuid:/bin/sh  
  21. syslog:x:101:103::/home/syslog:/bin/false  
  22. messagebus:x:102:107::/var/run/dbus:/bin/false  
  23. avahi-autoipd:x:103:110:Avahi autoip daemon,,,:/var/lib/avahi-autoipd:/bin/false  
  24. avahi:x:104:111:Avahi mDNS daemon,,,:/var/run/avahi-daemon:/bin/false  
  25. couchdb:x:105:113:CouchDB Administrator,,,:/var/lib/couchdb:/bin/bash  
  26. speech-dispatcher:x:106:29:Speech Dispatcher,,,:/var/run/speech-dispatcher:/bin/sh  
  27. usbmux:x:107:46:usbmux daemon,,,:/home/usbmux:/bin/false  
  28. haldaemon:x:108:114:Hardware abstraction layer,,,:/var/run/hald:/bin/false  
  29. kernoops:x:109:65534:Kernel Oops Tracking Daemon,,,:/:/bin/false  
  30. pulse:x:110:115:PulseAudio daemon,,,:/var/run/pulse:/bin/false  
  31. rtkit:x:111:117:RealtimeKit,,,:/proc:/bin/false  
  32. saned:x:112:118::/home/saned:/bin/false  
  33. hplip:x:113:7:HPLIP system user,,,:/var/run/hplip:/bin/false  
  34. gdm:x:114:120:Gnome Display Manager:/var/lib/gdm:/bin/false  
  35. sucre:x:1000:1000:sucre,,,:/home/sucre:/bin/bash  
  36. sshd:x:115:65534::/var/run/sshd:/usr/sbin/nologin  

替换后

 
  1. one  
  2. root  
  3. daemon  
  4. bin  
  5. sys  
  6. sync  
  7. games  
  8. man  
  9. lp  
  10. mail  
  11. news  
  12. uucp  
  13. proxy  
  14. www-data  
  15. backup  
  16. list  
  17. irc  
  18. gnats  
  19. nobody  
  20. libuuid  
  21. syslog  
  22. messagebus  
  23. avahi-autoipd  
  24. avahi  
  25. couchdb  
  26. speech-dispatcher  
  27. usbmux  
  28. haldaemon  
  29. kernoops  
  30. pulse  
  31. rtkit  
  32. saned  
  33. hplip  
  34. gdm  
  35. sucre  
  36. sshd  

看到了吧,效率还行吧。


本文转自sucre03 51CTO博客,原文链接:http://blog.51cto.com/sucre/386442,如需转载请自行联系原作者

相关文章
|
1月前
|
存储 Java Shell
Shell 变量
10月更文挑战第2天
26 0
|
2月前
|
Shell
shell脚本变量 $name ${name}啥区别
shell脚本变量 $name ${name}啥区别
|
2月前
|
Java Shell Linux
Shell 变量设置
Shell设置变量
46 5
|
2月前
|
Java Shell Linux
Shell 变量设置25-1
Shell编程语言是一种非类型的解释型语言,无需像C++/Java那样事先声明变量。通过赋值即可定义变量,在Linux支持的所有Shell中均适用。变量分为局部变量与环境变量,前者仅限于定义脚本内使用,后者可在其派生的子进程中使用。常见系统变量如$0表示当前程序名称,$n表示第n个参数(n=1,2,...,9),$*代表所有参数,$#代表参数个数,$?表示命令执行后的状态(0为成功),$UID为当前用户ID,$PWD表示当前目录。定义变量如`A=123`,
31 0
|
3月前
|
Shell
[shell]在curl测试的data参数中引用变量
[shell]在curl测试的data参数中引用变量
219 1
|
4月前
|
分布式计算 大数据 Shell
MaxCompute产品使用合集之odps shell如何将ech变量的结果集合写入文件,并且指定服务器的位置
MaxCompute作为一款全面的大数据处理平台,广泛应用于各类大数据分析、数据挖掘、BI及机器学习场景。掌握其核心功能、熟练操作流程、遵循最佳实践,可以帮助用户高效、安全地管理和利用海量数据。以下是一个关于MaxCompute产品使用的合集,涵盖了其核心功能、应用场景、操作流程以及最佳实践等内容。
45 10
|
6月前
|
Shell Linux Perl
Linux|如何允许 awk 使用 Shell 变量
Linux|如何允许 awk 使用 Shell 变量
92 2
|
4月前
|
Shell Linux
Linux环境变量之shell中export定义全局变量和echo 变量的区别
Linux环境变量之shell中export定义全局变量和echo 变量的区别
|
5月前
|
存储 Shell 开发者
Shell 变量详解:如何定义、使用和管理
**Shell脚本中,变量是核心元素,用于暂存数据。变量默认为字符串,赋值时等号两侧无空格。命名遵循:数字、字母、下划线,以非数字开头。常用特殊变量如 `$0` (脚本名),`$#` (参数个数)。定义变量可使用单引号(不解析变量)、双引号(解析变量)或不加引号(注意空格)。使用花括号明确变量边界,`readonly` 则可设定只读变量,`unset` 删除变量。实践这些概念以加深理解。**
234 0
|
5月前
|
Shell Linux
linux shell 脚本中变量截取
linux shell 脚本中变量截取
110 0