字符串可以用单引号,也可以用双引号

2019-10-06 12:26 来源:未知

  字符串是shell编程中最常用最有用的数据类型(除了数字和字符串,也没啥其它类型好用了),字符串可以用单引号,也可以用双引号,也可以不用引号。

字符串是shell编程中最常用最有用的数据类型(除了数字和字符串,也没啥其它类型好用了),字符串可以用单引号,也可以用双引号,也可以不用引号。单双引号的区别跟PHP类似,输出语句echo和PHP也挺像。

永利平台娱乐 1

Shell 函数Shell 字符串

但是单引号和双引号是有区别的:

单引号

str='this is a string'

单引号字符串的限制:

  • 单引号里的任何字符都会原样输出,单引号字符串中的变量是无效的;
  • 单引号字串中不能出现单引号(对单引号使用转义符后也不行)。

题图:gratisography

单引号

单引号字符串的限制:

          单引号里的任何字符都会原样输出,单引号字符串中的变量是无效的;

          单引号字串中不能出现单引号(对单引号使用转义符后也不行)。

  单引号:

双引号

your_name='qinjx'
str="Hello, I know your are "$your_name"! n"

双引号的优点:

  • 双引号里可以有变量
  • 双引号里可以出现转

反引号

 反引号用于将系统命令的输出到变量

变量、字符串、数组

双引号

        双引号里可以有变量
        双引号里可以出现转义字符

  • 单引号里的任何字符都会原样输出,单引号字符串中的变量是无效的;
  • 单引号字串中不能出现单独一个的单引号(对单引号使用转义符后也不行),但可成对出现,作为字符串拼接使用。

字符串的值

表达式 含义
${var} 变量var的值, 与$var相同
${var-DEFAULT} 如果var没有被声明, 那么就以$DEFAULT作为其值 *
${var:-DEFAULT} 如果var没有被声明, 或者其值为空, 那么就以$DEFAULT作为其值 *
${var=DEFAULT} 如果var没有被声明, 那么就以$DEFAULT作为其值 *
${var:=DEFAULT} 如果var没有被声明, 或者其值为空, 那么就以$DEFAULT作为其值 *
${var+OTHER} 如果var声明了, 那么其值就是$OTHER, 否则就为null字符串
${var:+OTHER} 如果var被设置了, 那么其值就是$OTHER, 否则就为null字符串
${var?ERR_MSG} 如果var没被声明, 那么就打印$ERR_MSG *
${var:?ERR_MSG} 如果var没被设置, 那么就打印$ERR_MSG *
${!varprefix*} 匹配之前所有以varprefix开头进行声明的变量
${!varprefix@} 匹配之前所有以varprefix开头进行声明的变量

1.变量

1.1 常规变量

变量名的命名须遵循如下规则:

  • 首个字符必须为字母(a-z,A-Z)。
  • 中间不能有空格,可以使用下划线(_)。
  • 不能使用标点符号。
  • 不能使用bash里的关键字(可用help命令查看保留关键字)。

定义变量时,变量名不加美元符号($),如:

variableName="value"

使用一个定义过的变量,只要在变量名前面加美元符号($)即可,{}可加可不加,如:

your_name="mozhiyan"
echo $your_name
echo ${your_name}

已定义的变量,可以被重新定义,如:

myUrl="http://see.xidian.edu.cn/cpp/linux/"
echo ${myUrl}
myUrl="http://see.xidian.edu.cn/cpp/shell/"
echo ${myUrl}

使用 readonly 命令可以将变量定义为只读变量,只读变量的值不能被改变。

下面的例子尝试更改只读变量,结果报错:

#!/bin/bash
myUrl="http://see.xidian.edu.cn/cpp/shell/"
readonly myUrl
myUrl="http://see.xidian.edu.cn/cpp/danpianji/"

运行脚本,结果如下:

/bin/sh: NAME: This variable is read only.

使用 unset 命令可以删除变量。语法:

unset variable_name

变量被删除后不能再次使用;unset 命令不能删除只读变量。

举个例子:

#!/bin/sh
myUrl="http://see.xidian.edu.cn/cpp/u/xitong/"
unset myUrl
echo $myUrl

上面的脚本没有任何输出。

1.2 特殊变量

变量 含义
$0 当前脚本的文件名
$n 传递给脚本或函数的参数。n是一个数字,表示第几个参数。例如,第一个参数是$1,第二个参数是$2。
$# 传递给脚本或函数的参数个数。
$* 传递给脚本或函数的所有参数。
$@ 传递给脚本或函数的所有参数。被双引号(" ")包含时,与 $*稍有不同,下面将会讲到。
$? 上个命令的退出状态,或函数的返回值。
$$ 当前Shell进程ID。对于 Shell 脚本,就是这些脚本所在的进程ID。

例:

#!/bin/bash
echo "File Name: $0"
echo "First Parameter : $1"
echo "First Parameter : $2"
echo "Quoted Values: $@"
echo "Quoted Values: $*"
echo "Total Number of Parameters : $#"

运行结果:

$./test.sh Zara Ali
File Name : ./test.sh
First Parameter : Zara
Second Parameter : Ali
Quoted Values: Zara Ali
Quoted Values: Zara Ali
Total Number of Parameters : 2

$* 和 $@ 的区别

$* 和 $@ 都表示传递给函数或脚本的所有参数,不被双引号(" ")包含时,都以"$1" "$2" … "$n" 的形式输出所有参数。

但是当它们被双引号(" ")包含时,"$*" 会将所有的参数作为一个整体,以"$1 $2 … $n"的形式输出所有参数;"$@" 会将各个参数分开,以"$1" "$2" … "$n" 的形式输出所有参数。

拼接字符串

             your_name="qinjx"

             greeting="hello, "$your_name" !"

             greeting_1="hello, ${your_name} !"

             echo $greeting $greeting_1

  双引号:

拼接字符串

your_name="abc"
greeting="hello, "$your_name" !"
greeting_1="hello, ${your_name} !"
echo $greeting $greeting_1

2.字符串

字符串是shell编程中最常用最有用的数据类型(除了数字和字符串,也没啥其它类型好用了),字符串可以用单引号,也可以用双引号,也可以不用引号。单双引号的区别跟PHP类似。

2.1 单引号

  • 单引号里的任何字符都会原样输出,单引号字符串中的变量是无效的;
  • 单引号字串中不能出现单引号(对单引号使用转义符后也不行)。

例:

str='this is a string'

2.2 双引号

  • 双引号里可以有变量
  • 双引号里可以出现转义字符

例1:

your_name='qinjx'
str="Hello, I know your are "$your_name"! n"

例2:

your_name="qinjx"
greeting="hello, "$your_name" !"
greeting_1="hello, ${your_name} !"

echo $greeting $greeting_1

2.3 获取字符串长度

长度的获取及通过上面的特殊变量$#演变来的

string="abcd"
echo ${#string} 

2.4 提取子字符串

例1,截取1-4,三个字符串,注意两种方式的起始位计算方式是不一样的,一种是从0开始,一种是从1开始。

string="alibaba is a great company"
echo ${string:1:4} 
或者
echo `expr substr "$string" 2 4`

例2,截取1后面的全部字符

 echo ${string:1}

2.5 查找子字符串

查找首字母所在的位置,例:

string="alibaba is a great company"
echo `expr index "$string" is`
echo `expr index "$string" llll`
echo `expr index "$string" bjhjkhjkhj`
echo `expr index "$string" gg`

结果:

3
2
4
14

可以看出,该函数只检测第一字母第一次出现的位置。

获取字符串长度

           string="abcd"

           echo ${#string}#输出 4

  • 双引号里可以有变量
  • 双引号里可以出现转义字符

获取字符串长度

string="abcd"
echo ${#string} #输出 4

3.数组

bash支持一维数组(不支持多维数组),并且没有限定数组的大小。类似与C语言,数组元素的下标由0开始编号。获取数组中的元素要利用下标,下标可以是整数或算术表达式,其值应大于或等于0。

3.1 定义数组

在Shell中,用括号来表示数组,数组元素用“空格”符号分割开。

定义数组的一般形式为:array_name=(value1 ... valuen)例如:

array_name=(value0 value1 value2 value3)
或者
array_name=(
value0
value1
value2
value3
)

还可以单独定义数组的各个分量:

array_name[0]=value0
array_name[1]=value1
array_name[2]=value2

可以不使用连续的下标,而且下标的范围没有限制。

3.2 读取数组

读取数组元素值的一般格式是:${array_name[index]}例如:

valuen=${array_name[2]}

举个例子:

#!/bin/sh
NAME[0]="Zara"
NAME[1]="Qadir"
NAME[2]="Mahnaz"
NAME[3]="Ayan"
NAME[4]="Daisy"
echo "First Index: ${NAME[0]}"
echo "Second Index: ${NAME[1]}"

运行脚本,输出:

$./test.sh
First Index: Zara
Second Index: Qadir

使用@ 或 * 可以获取数组中的所有元素,例如:

${array_name[*]}
${array_name[@]}

举个例子:

#!/bin/sh
NAME[0]="Zara"
NAME[1]="Qadir"
NAME[2]="Mahnaz"
NAME[3]="Ayan"
NAME[4]="Daisy"
echo "First Method: ${NAME[*]}"
echo "Second Method: ${NAME[@]}"

运行脚本,输出:

$./test.sh
First Method: Zara Qadir Mahnaz Ayan Daisy
Second Method: Zara Qadir Mahnaz Ayan Daisy

3.3 获取数组的长度

获取数组长度的方法与获取字符串长度的方法相同,例如:

  • 取得数组元素的个数length=${#array_name[@]}或者length=${#array_name[*]}
  • 取得数组单个元素的长度lengthn=${#array_name[n]}

变量、字符串、数组的分析就到这边,有感悟时会持续会更新。

注:以上内容来自C语言中文网及本人在使用过程的一些理解整理。如有侵权,请及时通知我,我将马上删除,如有错误之处也请指出,进行探讨学习。文章只是起一个引导作用,详细的数据解析内容还请查看Shell相关教程,感谢您的查阅。

提取子字符串

           以下实例从字符串第2个字符开始截取4个字符:

          string="runoob is a great site"

          echo ${string:1:4}

          # 输出 unoo

获取字符串长度:例:

查找子字符串

查找字符 "is" 的位置:

string="runoob is a great company"
echo `expr index "$string" is`  # 输出 8    "`" 是反引号,而不是单引号 "'"

查找子字符串

           string="runoob is a great company"

           echo`expr index "$string" is`

#!/bin/bash
name="dongxiucai"
echo ${#name}

字符串截取

假设有变量 var=

1. # 号截取,删除左边字符,保留右边字符。

echo ${var#*//}

其中 var 是变量名,# 号是运算符,*// 表示从左边开始删除第一个 // 号及左边的所有字符

即删除 http://

结果是 :blog.csdn.net/Liveor_Die

2. ## 号截取,删除左边字符,保留右边字符。

echo ${var##*/}  #  #、## 表示从左边开始删除。一个 # 表示从左边删除到第一个指定的字符;两个 # 表示从左边删除到从右边第一个/及左边的所有字符。

##*/ 表示从左边开始删除最后(最右边)一个 / 号及左边的所有字符

永利平台娱乐,即删除

结果是Liveor_Die

3. %号截取,删除右边字符,保留左边字符

echo ${var%/*}

%/* 表示从右边开始,删除第一个 / 号及右边的字符

结果是:

4. %% 号截取,删除右边字符,保留左边字符

echo ${var%%/*}

%%/* 表示从右边开始,删除最后(最左边)一个 / 号及右边的字符

结果是:http:

5. 从左边第几个字符开始,及字符的个数

echo ${var:0:5}

其中的 0 表示左边第一个字符开始,5 表示字符的总个数。

结果是:http:

6. 从左边第几个字符开始,一直到结束。

echo ${var:7}

其中的 7 表示左边第8个字符开始,一直到结束。

结果是 :blog.csdn.net/Liveor_Die

7. 从右边第几个字符开始,及字符的个数

echo ${var:0-7:3}

其中的 0-7 表示右边算起第七个字符开始,3 表示字符的个数。

结果是:ero

8. 从右边第几个字符开始,一直到结束。

echo ${var:0-7}

表示从右边第七个字符开始,一直到结束。

结果是:eor_Die

注:(左边的第一个字符是用 0 表示,右边的第一个字符用 0-1 表示)

Shell 数组

bash支持一维数组(不支持多维数组),并且没有限定数组的大小。

TAG标签:
版权声明:本文由永利平台娱乐发布于关于我们,转载请注明出处:字符串可以用单引号,也可以用双引号