bash的延迟替换命令行

sh/bash/dash/ksh/zsh等Shell脚本
回复
sarrow
帖子: 403
注册时间: 2007-10-27 1:04

bash的延迟替换命令行

#1

帖子 sarrow » 2011-12-16 21:18

我写了一个小脚本,遇到了点问题。

比如,我写了一个名字为~/bin/myscript的脚本,形式如下;
#! /bin/bash
for img in `ls *.{$1}`; do
echo converting "$img"
done

在使用的时候,我想用

$ myscript gif,png

就能像直接键入 ls *.{gif,png}一样,将本目录下,符号后缀规则的文件挑选出来。结果,发现,bash直接就将传入的命令给替换掉``中的$1了。

然后,提示:

ls: 无法访问*.{gif,png}: 没有那个文件或目录

各位,有啥好方法没有,可以避开这个问题?
头像
枫叶饭团
帖子: 14683
注册时间: 2010-06-16 1:05
系统: Mac OS X
来自: Tencent
联系:

Re: bash的延迟替换命令行

#2

帖子 枫叶饭团 » 2011-12-16 22:31

搞了半天我也搞不出来,然后就写成这样子了.用空格分割参数,我用IFS=','参数前面好像始终有个空格导致失败。不懂
[bash]
#!/bin/bash
n=0
y=$#
until [ $n -eq $y ] ; do
ls *.$1
shift
$((n++))
done
exit 0
[/bash]
sarrow
帖子: 403
注册时间: 2007-10-27 1:04

Re: bash的延迟替换命令行

#3

帖子 sarrow » 2011-12-16 22:42

感谢饭团了——怎么感觉你和饭盒是一家人啊?玩笑了。

不过,你的代码,不怎么合适阿!

我的本意,就是将可能个的参数给揉中一起,你这样,我反而的将参数拆开。

那换一个问题,bash下,如何拆分参数,就好像,一般脚本语言的split一样?——我估计,又郁闷了——貌似bash不支持数组。

或者,如何构”造命令行“?
头像
枫叶饭团
帖子: 14683
注册时间: 2010-06-16 1:05
系统: Mac OS X
来自: Tencent
联系:

Re: bash的延迟替换命令行

#4

帖子 枫叶饭团 » 2011-12-16 23:37

我纠结了半天确实不会。不过bash是支持数组的哦!构造命令行?创建命令?可以看path
fnan
帖子: 919
注册时间: 2009-07-01 22:04

Re: bash的延迟替换命令行

#5

帖子 fnan » 2011-12-17 9:04

while read i
do
echo $i
done <<<"$(eval ls *.{$1})"
bash不如perl精妙,学不到lisp的皮毛,远不够c++强悍,不过可以用。
sarrow
帖子: 403
注册时间: 2007-10-27 1:04

Re: bash的延迟替换命令行

#6

帖子 sarrow » 2011-12-17 12:20

fnan厉害。

你能我修改一下这个吗?

for img in $(eval *.{$1}) ; do
echo $img
done

为什么上面这样不行?

按我理解,$(eval *.{$1})这里已经延迟展开了啊!
fnan
帖子: 919
注册时间: 2009-07-01 22:04

Re: bash的延迟替换命令行

#7

帖子 fnan » 2011-12-17 20:43

eval是针对命令而非针对参数的。
这样也行: eval ls *.{$1}|while ..........
bash不如perl精妙,学不到lisp的皮毛,远不够c++强悍,不过可以用。
tusooa
帖子: 6548
注册时间: 2008-10-31 22:12
系统: 践兔
联系:

Re: bash的延迟替换命令行

#8

帖子 tusooa » 2011-12-18 12:56

sarrow 写了:我写了一个小脚本,遇到了点问题。

比如,我写了一个名字为~/bin/myscript的脚本,形式如下;
#! /bin/bash
for img in `ls *.{$1}`; do
echo converting "$img"
done

在使用的时候,我想用

$ myscript gif,png

就能像直接键入 ls *.{gif,png}一样,将本目录下,符号后缀规则的文件挑选出来。结果,发现,bash直接就将传入的命令给替换掉``中的$1了。

然后,提示:

ls: 无法访问*.{gif,png}: 没有那个文件或目录

各位,有啥好方法没有,可以避开这个问题?

代码: 全选

eval echo '*.{'"$1"'}'
别ls.

代码: 全选

] ls -ld //
fnan
帖子: 919
注册时间: 2009-07-01 22:04

Re: bash的延迟替换命令行

#9

帖子 fnan » 2011-12-18 22:35

eval echo '*.{'"$1"'}'
#这个不考虑文件名的空格问题吗?
bash不如perl精妙,学不到lisp的皮毛,远不够c++强悍,不过可以用。
回复