LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 700|回复: 2

一个bash变量替换的问题

[复制链接]
发表于 2011-3-3 16:24:52 | 显示全部楼层 |阅读模式
我想利用下列命令打印文件前5行:

cmd="'1,5p'"
sed -n $cmd file1

本意是想运行 sed -n '1,5p' file1

结果得到:
sed: -e expression #1, char 1: unknown command: `''

echo $cmd 显示 '1,5p'

我用-x查看了下
[root@asr1k-dev-x2100-6 shells]# sh -x
sh-3.2# xyf="'1,5p'"  
+ xyf=''\''1,5p'\'''  <-这里都是单引号
sh-3.2# sed -n $xyf a1
+ sed -n ''\''1,5p'\''' a1
sed: -e expression #1, char 1: unknown command: `''
sh-3.2#

当然,我可以用cmd="1,5p", 没问题,但是我对这个问题感到很费解。

似乎创建变量的时候,shell自动加了很多单引号。我看了论坛里关于shell处理命令行的帖子,但还是理解不了。请问能否指点一下,谢谢。
发表于 2011-3-10 10:42:30 | 显示全部楼层
  1. sed -n $cmd file1
复制代码
Shell在解析命令的时候,只有直接看到的引号才有引号的作用(用于保留它所引起的字符的原意,比如防止单词分割word split).通过参数扩展/变量替换得到的引号失去了它的特殊意义。
可以通过如下脚本测试命令得到的真实参数.
  1. #!/bin/bash
  2. # file: test_expansion.sh
  3. for arg in "$@"
  4. do
  5.     echo "***$arg***"
  6. done
复制代码
简单测试下:
  1. [jacuro@lab1 ~]$ cmd="'1,5p'"
  2. [jacuro@lab1 ~]$ ./test_expansion.sh $cmd
  3. ***'1,5p'***
  4. [jacuro@lab1 ~]$ cmd="'word1 word2 word3'"
  5. [jacuro@lab1 ~]$ ./test_expansion.sh $cmd
  6. ***'word1***
  7. ***word2***
  8. ***word3'***
  9. [jacuro@lab1 ~]$
复制代码
在第二个测试中,开头的单引号和word1成为第一个参数,可以看出它并没有发挥它引号的左右,而是作为普通字符。
根据Bash参考手册,参数替换的结果会进一步作单词分割,所以第二个测试的结果是合理的。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2011-3-15 19:51:07 | 显示全部楼层
多谢楼上,我明白了
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表