Shell 字符串详解

字符串(String)就是一系列字符的组合。字符串是 Shell 编程中最常用的数据类型之一(除了数字和字符串,也没有其他类型了)。

字符串可以由单引号' '包围,也可以由双引号" "包围,也可以不用引号。它们之间是有区别的,稍后我们会详解。

字符串举例:

str1=c.biancheng.net
str2="shell script"
str3='C语言中文网'

下面我们说一下三种形式的区别:

1) 由单引号' '包围的字符串:

  • 任何字符都会原样输出,在其中使用变量是无效的。
  • 字符串中不能出现单引号,即使对单引号进行转义也不行。

2) 由双引号" "包围的字符串:

  • 如果其中包含了某个变量,那么该变量会被解析(得到该变量的值),而不是原样输出。
  • 字符串中可以出现双引号,只要它被转义了就行。

3) 不被引号包围的字符串

  • 不被引号包围的字符串中出现变量时也会被解析,这一点和双引号" "包围的字符串一样。
  • 字符串中不能出现空格,否则空格后边的字符串会作为其他变量或者命令解析。

我们通过代码来演示一下三种形式的区别:

#!/bin/bash

n=74
str1=c.biancheng.net$n str2="shell \"script\" $n"
str3='C语言中文网 $n'

echo $str1
echo $str2
echo $str3

运行结果:

c.biancheng.net74
shell "script" 74
C语言中文网 $n

str1 中包含了$n,它被解析为变量 n 的引用。$n后边有空格,紧随空格的是 str2;Shell 将 str2 解释为一个新的变量名,而不是作为字符串 str1 的一部分。

str2 中包含了引号,但是被转义了(由反斜杠\开头的表示转义字符)。str2 中也包含了$n,它也被解析为变量 n 的引用。

str3 中也包含了$n,但是仅仅是作为普通字符,并没有解析为变量 n 的引用。

获取字符串长度


在 Shell 中获取字符串长度很简单,具体方法如下: 

${#string_name}

string_name 表示字符串名字。

下面是具体的演示:

#!/bin/bash

str="http://c.biancheng.net/shell/"
echo ${#str}

习惯:数字不加引号,其他默认加双引号。

有关单引号、双引号与不加引号的简要说明如下:
单引号:
可以说是所见即所得:即将单引号内的内容原样输出,或者描述为单引号里面看到的是什么就输出什么。
双引号:
把双引号内的内容输出出来:如果内容中有命令、变量等,会先把变量、命令解析出结果,然后再输出最终内容来。
无引号:
把内容输出出来,会将含有空格的字符串视为一个整体输出,如果内容中有命令、变量等,会先把变量、命令解析出结果,然后在输出最终内容来,如果字符串中带有空格等特殊符号,则不能完整的输出,需要改加双引号,一般连续的字符串,数字,路径等可以不加任何引号,不过最好用双引号代替之。
单引号、双引号与不加引号实践演示:
范例 1:经过反引号的`date`命令测试
[root@localhost ~]# echo '`date`'
#-->单引号时看到啥就显示啥
`date`

 

[root@localhost ~]# echo "`date`"
#-->双引号时如果里面是变量,会先把变量解析成具体内容在显示
Thu Jan 10 20:45:02 CST 2019
[root@localhost ~]# echo `date`
#-->对于连续的字符串等内容一般不加引号也可,加双引号一般比较保险,推荐
Thu Jan 10 20:48:01 CST 2019
特殊例子:awk 调用 shell 变量引号例子
[root@localhost ~]# awk 'BEGIN {print '$ETT'}'
123
[root@localhost ~]# awk 'BEGIN {print "$ETT"}'
$ETT
提示:以上结果正好和前面的结论相反。这是 awk 调用 shell 变量的特殊用法。
自定义变量的建议:
1、纯数字(不带空格),定义方式可以不加引号(单或双),例如:
a   01zhang=33
b   NETWORKING=yes
2、没有特殊情况,字符串一般用双引号定义,特别是多个字符串中间有空格时,
例如:
a   01zhang=”33”
b   NETWORKING=”yes”
3、变量内容需要原样输出时,要用单引号('')
a 01zhang='33'

 

 

变量的命名规范


1、变量命名要统一,使用全部大写字母,如 APACHE_ERR_NUM。

语义要清晰,能够正确表达变量内容的含义,过长的英文单词可采取前几个字符代替。
多个单词连接使用“_”号连接引用时,最好以${APACHE_ERR_NUM}加大括号或“${APACHE_ERR_NUM}”外面加双引号方式引用变量
2、避免无含义字符或数字:例如下面的 COUNT,并不知道其确切含义;
范例 1:COUNT 的不确切定义
COUNT=`grep keywords file`
if [ ${COUNT} -ne 22 ]
then
echo
‘Do Something’
fi

 

 

全局变量和局部变量命名


a.脚本中的全局变量定义,如 ZHANG_HOME 或 ZHANGHOME,在变量使用时, 使用{}将变量括起来“${ZHANG_HOME}”

范例 2:操作系统函数库脚本内容全局变量截取例子
[root@localhost ~]# more /etc/init.d/functions
# -*-Shell-script-*-
#
# functions
This file contains functions to be used by most or
all
#
shell scripts in the /etc/init.d directory.
#
TEXTDOMAIN=initscripts
b.脚本中局部变量定义:存在于脚本函数(
function)中的变量称为局部变
量,要以 local 方式进行声明,使之只在函数作用域内有效,防止变量在函数中
命名与变量外部程序中重命名造成程序异常。下面是函数中的变量定义例子:
范例 3:函数内的变量定义
checkpid() {
local i
for i in $* ; do
[ -d "/proc/$i" ] && return 0
done
return 1
}
4、变量合并:当某些变量或配置项要组合起来才有意义时,如文件的路径和文件名称,建议将要组合的变量合并到一起赋值给一个新的变量,这样既方便之后的调用,也为以后进行修改提供了方法。
范例 4:自动化安装 httpd 的脚本变量合并定义
VERSION="2.2.22"
SOFTWARE_NAME="httpd"
SOFTWARE_FULLNAME="${SOFTWARE_NAME}-${VERSION}.tar.gz"
5、变量定义总结:多学习模仿操作系统自带的/etc/init.d/functions 函数库脚本的定义思路。
把一个命令作为变量
[root@localhost ~]# date

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值