奥飞火千万电 发表于 2018-8-17 10:16:09

shell中变量的取值与赋值

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


[*]mv "a ~file name.txt" another.txt
  

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


[*]echo "The value of '${var}' is ${var}".
  

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


[*]The value of '${var}' is bbb.
  

  三、命令替换
  


[*]var='uname -r'
  

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


[*]#!/bin/bash
[*]for var in *.sh
[*]do
[*]echo "${var%sh}"
[*]done
  

  结果如下
  


[*]test1.
[*]test2.
[*]test3.
[*]test.
  

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


[*]#!/bin/bash
[*]for var in *.sh
[*]do
[*]mv "${var}" "${var%sh}SH"
[*]done
  

  这样小写的sh就变成大写的了。
  写个简单的循环替换
  


[*]grep -v "^#" /etc/passwd |\
[*]while read i
[*]do
[*]echo ${i%%:*}
[*]done
  

  第一行:-v是取反的意思,"^#"是取开头非#的行,最后的"\",如果将以上代码直接写成一个文件那么最后那个反斜杠可以不要,但是在shell窗口中一行一行的写那么反斜杠是必须加上的,它会告诉编译器还没有结束。
  第四行:%%:*意思是从最后到":"进行最大匹配,这样就只剩下第一个":"号以前的内容了,看看结果
  替换前
  


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

  替换后
  


[*]one
[*]root
[*]daemon
[*]bin
[*]sys
[*]sync
[*]games
[*]man
[*]lp
[*]mail
[*]news
[*]uucp
[*]proxy
[*]www-data
[*]backup
[*]list
[*]irc
[*]gnats
[*]nobody
[*]libuuid
[*]syslog
[*]messagebus
[*]avahi-autoipd
[*]avahi
[*]couchdb
[*]speech-dispatcher
[*]usbmux
[*]haldaemon
[*]kernoops
[*]pulse
[*]rtkit
[*]saned
[*]hplip
[*]gdm
[*]sucre
[*]sshd
  

  看到了吧,效率还行吧。


页: [1]
查看完整版本: shell中变量的取值与赋值