linux shell script: Basic concept01 - String

basic concept01: String
本文所有的测试例如无特殊说明,均based on fish shell

就从字符串说起吧,啥是字符串就不用解释了,我们来看几个简单的例子

?> ~ set param abc
?> ~ echo "string with blank and $param surrounded with double quotation marks"
string with blank and abc surrounded with double quotation marks
?> ~ echo ‘string with blank and $param surrounded with single quotation marks‘
string with blank and $param surrounded with single quotation marks

注意到$parm展开后的区别了吗?这里涉及到我要讲的第一个concept
Concept 01 shell字符串替换:
单引号字符串,shell不做字符串替换
双引号字符串,shell做字符串替换

这是单引号字符串与双引号字符串的区别,那么不加单引号或者双引号的字符串与这两者有什么区别呢?
看下面的例子

?> ~ echo "$param"
abc
?> ~ echo $param
abc

这两条命令都对字符串进行了替换(变量展开),这两条命令效果完全相同。那么没有单引号/双引号的字符串究竟有什么区别呢?
让我们进入bash中写一个例子

[email protected]:~$ x=123
[email protected]-virtual-machine:~$ y=123 456
No command ‘456‘ found, did you mean:
 Command ‘a56‘ from package ‘a56‘ (universe)
456: command not found
[email protected]-virtual-machine:~$ z="123 456"
[email protected]-virtual-machine:~$ echo $x
123
[email protected]-virtual-machine:~$ echo $y

[email protected]-virtual-machine:~$ echo $z
123 456
[email protected]-virtual-machine:~$

看到y变量的赋值报语法错误了吗?无单/双引号的字符串,以空格/回车作为字符串的起始和结束,除此以外,等同于双引号字符串
ok,让我们暂时总结一下, version 01 of concept 01:
1. shell会对字符串做替换
2. shell通过单引号,双引号识别字符串的border,当没有单/双引号时,以空格/回车作为border
3. 单引号字符串不做字符串替换,其他两种都做字符串替换

shell会替换哪些字符串呢?让我们继续来看几个例子

?> ~ set param abc
?> ~ echo "$param"
abc
?> ~ echo "\$param"
$param
?> ~ echo (ls)
Desktop Documents Downloads examples.desktop linux_shell.txt Music Pictures Public PycharmProjects pycharm register keys record software Templates Videos workspace
?> ~
[email protected]-virtual-machine:~$ echo `ls`
Desktop Documents Downloads examples.desktop linux_shell.txt Music Pictures Public PycharmProjects pycharm register keys record software Templates Videos workspace
[email protected]-virtual-machine:~$ 

请注意最后一个例子在bash中执行,`ls`使用反引号,即按键1(不是小键盘的按键1)旁边的键(不按shift)
看明白啦吗?反引号字符串,fish中用圆括号替代,是替换成程序的输出结果。让我们继续总结一下, version 02 of concept 01:
1. shell会对字符串做替换:变量替换($param)、转义字符替换(\$)、程序标准输出替换(`ls`)
2. shell通过单引号,双引号识别字符串的border,当没有单/双引号时,以空格/回车作为border
3. 单引号字符串不做字符串替换,其他两种都做字符串替换

Concept01基本就介绍完了。没错,这个系列写的是本人多年以来对技术的理解和总结,自然不会只有这么一点肤浅的内容。
那么接下来,让我们再看几个例子:
sample 01:

?> ~ set x (echo hello)
?> ~ echo $x
hello
?> ~ set y (aaa)
No command ‘aaa‘ found, did you mean:
 Command ‘jaaa‘ from package ‘jaaa‘ (universe)
 Command ‘aa‘ from package ‘astronomical-almanac‘ (universe)
 Command ‘aha‘ from package ‘aha‘ (universe)
 Command ‘ara‘ from package ‘ara‘ (universe)
aaa: command not found
?> ~ echo $y

?> ~

看到了吗,shell只会使用程序的标准输出(stdout)来替换用()或者反引号的字符串,而stderr虽然也是输出信息,但是并不会被用来替换
version 03 of concept01:
1. shell会对字符串做替换:变量替换、转义字符替换、程序标准输出替换(only stdout, exclude stderr)
2. shell通过单引号,双引号识别字符串的border,当没有单/双引号时,以空格/回车作为border
3. 单引号字符串不做字符串替换,其他两种都做字符串替换

sample 02:

?> ~ echo "abc 123"
abc 123
?> ~ echo "abc \"123\""
abc "123"
?> ~ echo "abc ‘123‘"
abc ‘123‘
?> ~ echo ‘abc 123‘
abc 123
?> ~ echo ‘abc \‘123\‘‘
abc ‘123‘
?> ~ echo ‘abc "123"‘
abc "123"
?> ~

1. single quotation marks字符串中的escaping character \‘会被替换
2. double quotation marks字符串中的escaping character \"会被替换
3. single quotation marks and double quotation marks可以嵌套使用
让我们再总结一下:
version 04 of Concept01
1. shell会对字符串做替换:变量替换、转义字符替换、程序标准输出替换(only stdout, exclude stderr)
2. shell通过单引号,双引号识别字符串的border,当没有单/双引号时,以空格/回车作为border
3. 单引号字符串不做字符串替换,其他两种都做字符串替换。但是单引号字符串中的单引号需要使用转义字符,会被替换。双引号字符串中的双引号需要使用转义字符

sample 03:

?> ~ set param abc
?> ~ set p ‘$param‘
?> ~ echo "$p"
$param
?> ~

$p的值$param并没有被递归替换
version 05 of Concept01:
1. shell会对字符串做替换:变量替换、转义字符替换、程序标准输出替换(only stdout, exclude stderr). 不会递归替换
2. shell通过单引号,双引号识别字符串的border,当没有单/双引号时,以空格/回车作为border
3. 单引号字符串不做字符串替换,其他两种都做字符串替换。但是单引号字符串中的单引号需要使用转义字符,会被替换。双引号字符串中的双引号需要使用转义字符

sample 04:

?> ~ echo 1 (echo 2 (echo 3 abc))
1 2 3 abc

version 06 of Concept01:
1. shell会对字符串做替换:变量替换、转义字符替换、程序标准输出替换(only stdout, exclude stderr). 不会递归替换
2. shell通过单引号,双引号识别字符串的border,当没有单/双引号时,以空格/回车作为border
3. 单引号字符串不做字符串替换,其他两种都做字符串替换。但是单引号字符串中的单引号需要使用转义字符,会被替换。双引号字符串中的双引号需要使用转义字符
4. 圆括号/反引号可以嵌套使用

关于shell中的字符串概念的分析就到此为止了,其实并不复杂,你觉得的?

shell script中的字符串难点在于除了shell本身会对字符串做替换,命令,尤其是使用正则表达式的grep egrep sed也会对字符串做替换,当这些过程mixed,才会真正让人迷惑。
这是下一篇要讲的了。

第二篇的引子:
问题1:
既然不加单双引号的字符串以空格/回车作为border,那么为什么下面这两组命令效果是相同的:
?> ~ echo abc 123
abc 123
?> ~ set param this is a string with blank, but without single/double qutation marks
?> ~ echo $param
this is a string with blank, but without single/double qutation marks
?> ~

?> ~ echo "abc 123"
abc 123
?> ~ set param "this is a string with blank, but without single/double qutation marks"
?> ~ echo $param
this is a string with blank, but without single/double qutation marks
?> ~

问题2:
试看下面几条命令的执行情况
?> ~ echo abc.def abcxdef | grep  ‘abc.def‘ --color=auto
abc.def abcxdef
?> ~ echo abc.def abcxdef | grep  ‘abc\.def‘ --color=auto
abc.def abcxdef
?> ~
?> ~ echo abc.def abcxdef | grep  ‘*.def‘ --color=auto
?> ~ echo abc.def abcxdef | grep  -E ‘*.def‘ --color=auto
abc.def abcxdef
?> ~

时间: 2024-09-30 07:24:09

linux shell script: Basic concept01 - String的相关文章

一个修改配置文件的linux shell script

不久以前,曾经搜到一篇博客是读取配置文件的,http://www.cnblogs.com/bo083/archive/2012/11/19/2777076.html,用到现在,感觉十分方便,感谢作者. 现在,需要通过web界面给用户留出接口来修改类似配置文件,大的方法是从php调用linux shell script,于是,现在贴一个可以修改此种配置文件的linux shell. 首先,配置文件的格式如下: [unit1] field1=value1 field2=value2 [unit2]

【原】Linux shell script 2>&1是什么意思

先说结论, 2>&1 的意思是,把标准错误(stderr)重定向到标准输出(stdout) 如果想了解为什么,可以继续阅读: 1和2 是什么 shell中,有一些常用的文件描述符(file descriptor): 0: 标准输入(stdin) 1: 标准输出(stdout) 2: 标准错误(stderr) 所以 2>&1 中的2就是标准错误,1就是标准输出. > 符号是什么 ">" 是shell中的重定向符, 例如:echo "abc

Linux shell Script初识

shell secript: 执行方式的差异: ./ sh执行都是在创建一个子程序来执行,只会继承环境变量, 其中的变量如果export声明,子程序的子程序会继承,不会升级为环境变量 source 的执行方式是把脚本放到父程序的环境执行, 其中的变量如果export声明,会升级成环境变量 test判断,[]判断是一样的,建议使用[]的判断方式 默认变量($0, $1......) $0,$1....位置变量,代表参数 $#:代表参数的个数 [email protected]:代表参数"$1&qu

1>>linux shell script编程

Studying book is <Linux Command Line and Shell Scripting Bible> by Richard Blum and Christine Bresnahan. Thanks. If I have enough time,I will improve this note. Now,I'm coding.

linux shell脚本

定义: linux shell script是一组shell命令组成的批处理文件.类似于windows的bat文件. shell脚本基本语法 每当读取到一个ENTER符号,就开始尝试执行该行的命令. 如果一行的命令太长,可以在行尾使用反斜杠\将命令延续到下一行. [[email protected] testsh]# cat testenter.sh echo zjf is a good man #开头代表注释. 脚本的执行 脚本的执行方式在前几篇文章里有叙述.这里要重点关注这点: sh和./的

[Linux Command Line and Shell Scripting Bible] basic shell script

1 #!/bin/bash 2 ############################################ 3 # @content chapter 8,9 of Linux Command Line and Shell Scripting Bible 4 # @reader gavin 5 # @date 2014/12/14 6 ############################################ 7 CHAPTER 8 8 9 + user varriab

Unix/Linux shell脚本编程学习--Shell Script II

Shell Script II 10.Shell echo命令 echo "OK!\n”   #显示换行 echo "It is a test" echo无拼接字符时后一般可以不使用”引号”,从上面可看出,双引号可有可无,单引号主要用在原样输出中. 显示结果重定向保存至文件: vim myfile 创建文件 echo "It is a test" > myfile cat myfile 查看文件内容 若需要原样输出字符串(不进行转义),请使用单引号.

Linux 脚本运维总结之Shell script

1. 本地变量和环境变量 变量类型 定义形式 声明位置 显示命令 作用域 本地变量 VARNAME=value 命令行或shell脚本 set (显示所有变量) 本用户,本进程 环境变量 export VARNAME=value ~/.bash_profile (当前登陆用户有效)/etc/profile (所有登陆用户有效) env(仅显示环境变量) 所有用户所有进程 2. 脚本调试 法一 #!/bin/bash -x 法二 set -x 要调试的几行代码 set +x 3. 退出状态 exi

跟鸟哥学Linux之——shell script

从程序员的角度来看,Shell本身是一种用C语言编写的程序,从用户的角度来看,Shell是用户与Linux操作系统沟通的桥梁.用户既可以输入命令执行,又可以利用 Shell脚本编程,完成更加复杂的操作.在系统管理等领域,Shell编程起着不可忽视的作用.前期我对shell编程做了一个初步的认识,现总结如下: 思维导图: 知识分为了两部分: 基本知识: 在基本知识中我将其分为了:执行方法.运算式.变量和判断式四部分.1.执行方法就是在Linux中shell文件执行的命令,用的多了自然会没有问题.2