Bash编程中变量有无双引号探秘

对于一般的变量,有无双引号效果是一样的,如下所示:

$ sport="marathon"

$ echo $sport

marathon

$ echo "$sport"

marathon

那么,对于二般的变量,就有差别了,如下:

$ cat sports.txt

walking running swimming

singing drawing dancing

basketball volleyball soccer

$ sports=$(cat sports.txt)

$ echo $sports

walking running swimming singing drawing dancing basketball volleyball soccer

$ echo "$sports"

walking running swimming

singing drawing dancing

basketball volleyball soccer

如上sports变量加上了双引号,echo "$sports"是将其原封不动的,作为一个整体输出。

原封不动是指,sports.txt文件中内容格式是什么样子,输出就是什么样子的。作为一个整体输出,又如何理解呢,可结合下面的for循环看下,其中${item}多加了‘-z’,是为了标示输出次数。可见变量加上双引号,只输出了一次。

$ for item in $sports; do echo ${item}-z; done

walking-z

running-z

swimming-z

singing-z

drawing-z

dancing-z

basketball-z

volleyball-z

soccer-z

$ for item in "$sports"; do echo ${item}-z; done

walking running swimming singing drawing dancing basketball volleyball soccer-z

类似sports这样的变量,在for循环中,一般是为了分析其中的每一行,因为"$sports"形式,作为一个整体输出了,所以不能用。只剩下$sports这种形式了,貌似该形式又输出次数太多了,其实这和Bash中的IFS(Internal Field Separator)变量有关,此处对IFS不做展开说明了,只给出两种解决方法。

第一种,改变IFS,示例代码如下:

$ sports=$(cat sports.txt)

$ old_ifs="$IFS"

$ IFS=$'\n'

$ for item in $sports; do echo $item; done

walking running swimming

singing drawing dancing

basketball volleyball soccer

$ IFS="$old_ifs"

$ for item in $sports; do echo $item; done

walking

running

swimming

singing

drawing

dancing

basketball

volleyball

soccer

第二种,先格式化sports.txt文件,示例代码如下:

$ sed -i -r 's/[ \t]{1,}/,/g' sports.txt

$ cat sports.txt

walking,running,swimming

singing,drawing,dancing

basketball,volleyball,soccer

$ sports=$(cat sports.txt)

$ for item in $sports; do echo $item; done

walking,running,swimming

singing,drawing,dancing

basketball,volleyball,soccer

对于两者,个人比较推荐第二种方法,预先格式化要处理的文件,可以确保熟知文件格式。

对Bash编程中,变量是否要加双引号,稍作总结:

1. 若打印变量内容(或将该变量作为参数传递给一个函数/脚本),要使用双引号。

2. 若变量在for循环中使用,不要使用双引号(留意上面提到的两种方法)。

原文地址:http://blog.51cto.com/coveringindex/2131139

时间: 2024-10-10 21:17:07

Bash编程中变量有无双引号探秘的相关文章

bash编程之变量替换

${var#*word}:表示以word为$VAR的分隔符,从左至右,找到第一次匹配的分隔符以后,去掉分隔符(含分隔符)左侧的所有字符 ${var##*word}:表示以word为$VAR的分隔符,从左至右,找到最后一次匹配的分隔符以后,去掉分隔符(含分隔符)左侧的所有字符 ${var%word*}:表示以word为$VAR的分隔符,从右至左,找到第一次匹配的分隔符以后,去掉分隔符(含分隔符)右侧的所有字符 ${var%%word*}:表示以word为$VAR的分隔符,从右至左,找到最后一次匹配

Linux下Bash编程之变量详解(一)

1.语言分类: 1.1.静态语言:编译型语言 强类型:变量在使用前,必须事先声明,甚至还需要初始化: 编写的程序事先转换成可执行格式 代表有:C.C++.JAVA.C# 动态语言:解释型语言 弱类型:变量用时声明,甚至不区分类型: 编写的程序边解释边执行 代表有: PHP.SHELL.python.perl 1.2.面向过程编程语言:代表有 Shell, C 1.3.面向对象编程语言: 代表有 JAVA, Python, perl, C++ 结论:shell属于弱类型编程语言 2.shell编程

BASH 编程之变量高级篇

内部变量 • $$与$BASHPID都代表着执行程序的进程 ID,我们可以通过 echo 打印,并用 ps 指令检查得到相同的进程 ID [[email protected] ~]# echo $BASHPID #没有结果?? [[email protected] ~]# echo $$ #显示执行进程的 id 号 3131 [[email protected] ~]# ps ax | grep bash 2589 ? Ss 0:00 /usr/bin/ssh-agent /bin/sh -c

shell编程中变量的运算 (shell 06)

主要包括以下3中 字符串操作数学运算浮点运算 一.字符串操作 字符串的连接 连接字2个字符串不需要任何连接符,挨着写即可 长度获取 expr length "hello" expr length "$str" 变量名必须放在双引号里,否者语法错误 查找字符串中字符的位置 expr index "$str" CHARS 第一个是从1 开始的,查找不到返回 0 ,返回匹配到的第一个字符的位置 [[email protected] ~]# echo $

bash 编程中循环语句用法

1.if 是单分支语句,使用格式如下: if condition ; then statement ….. fi 2.if … else 是双分支语句,使用格式如下: if condition ; then statement …. else statement …. fi 3.if …elif…elif…else 是多分支语句,使用格式如下: if condition ; then statement …. elif condition ; then statement ….. elif co

bash编程基础及for循环

bash编程要点 变量: 本地变量:只对当前shell进程有效,对当前shell之外的其它shell(包括其父.子等)无效: 环境变量:对当shell进程及其子shell进程有效: 局部变量:仅在当前shell进程中的某段代码空间内有效:通常用于函数本地程序: 位置变量:$1, $2, ... $1 是传递给该shell脚本的第一个参数 $2 是传递给该shell脚本的第二个参数- 特殊变量: $# 是传给脚本的参数个数 $0 是脚本本身的名字 [email protected] 是传给脚本的所

bash编程初体验(二)

bash编程初体验(二) read if case 概述 在本篇文章中,我们将介绍bash编程中有关if语句的简单用法,.如此,如果条件为真,if会执行一种指令,如果条件为假,if会选择执行另一种指令,这种执行就是所谓的选择结构,它能够改变命令的基本顺序流结构,以选择流的形式运行. 在有关if语句的论述中,我们还将介绍read命令,因为read命令可以方便地引入一个或多个变量,可以天然地与if语句结合:另外,除了if语句,还有一种常见的选择语句:case语句,其简单易用,高效简洁,是时的不二选择

bash编程语法总结,顺序,循环,选择

bash编程语法     首先,我们先说下bash语法都有哪些内容,随后我会随后一一去分析,加强我记忆的同时也分享下给家. linux bash脚本的基本内容构架如下: #!/bin/bash   -----> 每个bash脚本第一行必须要写的,告诉系统这是个bash脚本. #              -----> #为注释的标志符号,#开头的行都是脚本不执行的,仅用作注释 命令段     -----> 脚本要执行的具体命令,来完成相应的功能 bash编程为过程式编程语言,有3种主要语

linux bash 编程

bash 编程中遇到的问题: 首先,建议在linux 下编写bash,如果你要用windows 编写bash 的话,那么,你要特别注意几个问题: 第一:编码问题,用utf-8 编码, 第二:换行符问题,windows是回车换行(CRLF)结尾,linux 是换行(LF)结尾 第三:使用utf-8无bom. 这三点是在windows 下编写bash 的注意事项. 至于语法,我这边就不多做讲了,我也是初次编写bash,语法基本没啥说的,有一年编程基础的都能看懂. http://pan.baidu.c