新手问题 关于 shell 中 $() 捕获的问题

z_ach · 2016年08月08日 · 最后由 boyishwei 回复于 2016年08月11日 · 2090 次阅读

echo $(ls -l) 的结果会连接多行输出

total 16 -rw-r--r-- 1 jankin staff 403 Aug 8 07:12 README.md drwxr-xr-x 3 jankin staff 102 Aug 8 07:12 _build drwxr-xr-x 3 jankin staff 102 Aug 8 07:12 config drwxr-xr-x 3 jankin staff 102 Aug 8 07:12 lib -rw-r--r-- 1 jankin staff 659 Aug 8 07:12 mix.exs drwxr-xr-x 4 jankin staff 136 Aug 8 07:12 test

echo "$(ls -l)" 的结果可以正确输出

total 16
-rw-r--r--  1 jankin  staff  403 Aug  8 07:12 README.md
drwxr-xr-x  3 jankin  staff  102 Aug  8 07:12 _build
drwxr-xr-x  3 jankin  staff  102 Aug  8 07:12 config
drwxr-xr-x  3 jankin  staff  102 Aug  8 07:12 lib
-rw-r--r--  1 jankin  staff  659 Aug  8 07:12 mix.exs
drwxr-xr-x  4 jankin  staff  136 Aug  8 07:12 test

有谁知道为什么出现第一种输出么? (用的 zsh, osx archlinux 都试了)

第一种相当

echo 1 2 3 4

第二种相当于

echo "1 2 3 4"

不加引号输出结果会用空格 TAB 换行这些空字符分隔成多个参数

可以写个简单的小脚本来看参数是怎么传的

$ cat ~/bin/echo-args 
#!/bin/sh

echo $# args: | tee -a "/tmp/echo-args$UID"

id=1
for a; do
    printf "$id\t"
    echo "|$a|"
    let id=id+1
done | tee -a "/tmp/echo-args$UID"

#4 楼 @doitian 还有个问题,你的脚本 for 循环里的 a 是什么意思?好像没有赋值过,试了一下换成其他字母也可以。

shell 中不要放空格,有用个要记得用双引号引起来。

你试下 mkdir xxx/{abc,def,xyz} -p, 中间没空格所有目录都能创建,有一个空格,报错。在 shell 中,一般空格是用来区分参数!!!

需要 登录 后方可回复, 如果你还没有账号请 注册新账号