Chinaunix

标题: awk一次性给多个bash变量赋值 [打印本页]

作者: lord_back    时间: 2012-08-22 11:22
标题: awk一次性给多个bash变量赋值
本帖最后由 lord_back 于 2012-08-22 11:23 编辑

read a b c < <(echo "23 76 海外 海外" | awk '{print $1,$2,$3}')
在命令行下正常, 脚本运行错误
作者: rdcwayx    时间: 2012-08-22 12:19
请贴出脚本中引用的上下代码,并给出具体的错误提示。

作者: blackold    时间: 2012-08-22 13:05
回复 1# lord_back


    问题应该在别的地方。
作者: lord_back    时间: 2012-08-22 14:21
#!/bin/sh
read a b c < <(echo "23 76  海外 海外" | awk '{print $1,$2,$3}')
echo a=$a b=$b c=$c

$ ./read.sh
./read.sh: line 2: syntax error near unexpected token `<'
./read.sh: line 2: `read a b c < <(echo "23 76  海外 海外" | awk '{print $1,$2,$3}')'


如果在命令行下
$read a b c < <(echo "23 76  海外 海外" | awk '{print $1,$2,$3}')
$echo a=$a b=$b c=$c
a=23 b=76 c=海外

就正常

作者: rdcwayx    时间: 2012-08-22 14:27
有没有bash? 换成bash 就可以了。
  1. #!/usr/bin/bash
复制代码

作者: blackold    时间: 2012-08-22 14:28
回复 4# lord_back


    #!/bin/sh  -> #!/bin/bash
作者: lord_back    时间: 2012-08-22 16:20
这是为什么

ls /bin/sh -l
lrwxrwxrwx 1 root root 4 02-28 13:58 /bin/sh -> bash

/bin/sh 本来就是bash
用/bin/sh为什么会有错呢?
作者: waker    时间: 2012-08-22 16:27
lord_back 发表于 2012-08-22 16:20
这是为什么

ls /bin/sh -l

gzip和gunzip也是同一个文件,一个是解压一个是压缩呢
作者: lord_back    时间: 2012-08-22 16:30
回复 8# waker


$ ll /bin/gzip
-rwxr-xr-x 3 root root 63316 2011-07-22 /bin/gzip
$ ll /bin/gunzip
-rwxr-xr-x 3 root root 63316 2011-07-22 /bin/gunzip

是两个程序, 文件, 哥
作者: waker    时间: 2012-08-22 17:14
回复 9# lord_back


    对比一下两个文件的inode
作者: dn833    时间: 2012-08-22 17:21
如果是UBUNTU的话运行一下
  1. dpkg-reconfigure dash
复制代码
选择NO,然后再试试看
作者: xrzs1986    时间: 2012-08-23 01:35
回复 10# waker

貌似不一样呢~

ls -i /bin/gunzip  /bin/gzip
130199 /bin/gunzip  130514 /bin/gzip


uname -a
Linux gotti 2.6.32.45-grsec-2.2.2-r3 #8 SMP Mon Oct 10 13:33:17 PDT 2011 x86_64 GNU/Linux

作者: lord_back    时间: 2012-08-23 08:49
回复 5# rdcwayx

能帮忙
1.       解释一下 read a b c < <()       这个语法吗?
2.       脚本文件中开头  #!/bin/sh   和 #!/bin/bash 有什么区别吗,  我的 /bin/sh是 /bin/bash的一个链接, 但是改成 #!/bin/bash 脚本就是运行正常了
   
作者: rdcwayx    时间: 2012-08-23 09:56
我也不知道, 一般我用下面的方法一次读入多个变量。但是读入的都是直接赋值的。
  1. read a b c << EOF
  2. 23 76 海外
  3. EOF
复制代码
你的这个方法我也是第一次看到,要高级很多,可以用括号内的命令直接控制和产生需要的输出。 一个 < 还好理解,但是不适用这个需求。两个 < ,中间还必须有个空格,等一下看waker 版主和其他筒子的回复。

作者: waker    时间: 2012-08-23 10:31
第一个<是重定向
<(cmds)是bash进程替代(Process Substitution),如果理解什么是命名管道,那么<(...)就是一个临时的命名管道
如果不理解,可以简单的看作bash产生一个/dev/fdxxx的文件,文件内容是cmds的标准输出

bash可以根据自己被exec()时的参数调整自己的行为,你叫它sh它就按sh的规则玩,你叫它bash它就按bash的规则玩
*nix系统里这样的例子太多了,多个工具指向同一个文件,按名字产生不同的结果

作者: rdcwayx    时间: 2012-08-23 11:48
waker 发表于 2012-08-23 12:31
第一个

谢谢




欢迎光临 Chinaunix (http://bbs.chinaunix.net/) Powered by Discuz! X3.2