前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Bash脚本编程之引用

Bash脚本编程之引用

作者头像
枇杷李子橙橘柚
发布2019-05-26 11:06:40
7640
发布2019-05-26 11:06:40
举报
文章被收录于专栏:没有擅长的YcY没有擅长的YcY

引用的意思是用引号括起一个字符串,以保护字符串中的特殊字符不被shell或shell脚本重新解释或扩展:

代码语言:javascript
复制
# 在通配和正则模式中拥有特殊含义的*号在引用中失去了特殊意义

bash$ ls -l [Vv]*
-rw-rw-r--    1 bozo  bozo       324 Apr  2 15:05 VIEWDATA.BAT
 -rw-rw-r--    1 bozo  bozo       507 May  4 14:25 vartrace.sh
 -rw-rw-r--    1 bozo  bozo       539 Apr 14 17:11 viewdata.sh

bash$ ls -l '[Vv]*'
ls: [Vv]*: No such file or directory

但某些程序会重新解释或扩展引号括起的字符串中的特殊字符。比如某些场景下引号的用途是保护shell命令参数,但仍然允许调用程序扩展特殊字符:

代码语言:javascript
复制
bash$ cat file1.txt
first name in file1.txt
bash$ cat file2.txt
First name in file2.txt

bash$ grep '[Ff]irst name' *.txt
file1.txt:first name in file1.txt
file2.txt:First name in file2.txt

引用变量

引用变量时,通常建议用双引号括起。这可以防止重新解释引用字符串中除$, `, \外的所有特殊字符。

使用双引号可以防止单词拆分,用双引号括起的参数即使包含空格也将视为一个整体:

代码语言:javascript
复制
List="one two three"

for a in $List     # 空格拆分变量为多个部分
do
  echo "$a"
done
# one
# two
# three

echo "---"

for a in "$List"   # 双引号括起变量视为一个整体
do
  echo "$a"
done
# one two three

一个更详细的例子:

代码语言:javascript
复制
variable1="a variable containing five words"
# 以7个参数执行echo指令
# "This" "is" "a" "variable" "containing" "five" "words"
echo This is $variable1
# 以1个参数执行echo指令
# "This is a variable containing five words"
echo "This is $variable1"


variable2=""
# 以0个参数执行echo指令
echo $variable2 $variable2 $variable2
# 以3个参数执行echo指令(3个空字符串)
echo "$variable2" "$variable2" "$variable2"
# 以1个参数执行echo指令(2个空格)
echo "$variable2 $variable2 $variable2"

只有存在单词拆分和空格字符保留的问题时,echo指令用双引号括起参数才是必要的。

单引号引用(强引用)和双引号引用(弱引用)类似,但禁用了$的特殊含义,因此不能引用变量,不止如此,实际上除了'以外的所有特殊字符都将只表示其字面含义。

转义

转义是一种引用单个字符的方法,字符前导的转义符\告诉shell解释该字符的字面含义。

某些指令如echo, sed,对字符转义可能拥有相反的效果,它会触发该字符的特殊含义。例如: \n表示换行符 \r表示回车符 \t表示制表符 \v表示垂直制表符 \b表示退格符 \a表示beep响铃 \0xx表示等效的ASCII字符,其中xx为一串数字。

$'...'形式的字符串扩展结构是一种使用转义八进制或十六进制值分配ASCII字符给变量的机制。

代码语言:javascript
复制
# 使用$'\X'构造形式可以省略-e选项

echo -e "\n"
echo $'\n'           # 打印换行符
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 引用变量
  • 转义
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档