分页: 1 / 1
又一个变量替换问题
发表于 : 2012-08-09 17:53
由 fadingkonra
shell编程时,需要将文件名赋值给位置参数。于是set `ls`
但是悲剧的是他空格作为分隔符
代码: 全选
$ls
a.txt b.ogg fire c.avi
$set `ls`
$echo $1
a.txt
$echo $2
b.ogg
$echo $3
fire
$echo $4
c.avi
怎么办?
Re: 又一个变量替换问题
发表于 : 2012-08-09 18:06
由 枫叶饭团
代码: 全选
$ IFS=''
Administrator@maplebeats ~
$ ls
file1 file2
Administrator@maplebeats ~
$ set `ls`
Administrator@maplebeats ~
$ echo $1
file1
file2
Re: 又一个变量替换问题
发表于 : 2012-08-09 18:25
由 fadingkonra
好吧,我好像没说清楚。
我要把目录下的每一个文件名都赋给一个位置参数
比如第一个文件file1 ---> $1
第二个文件file2 ---> $2
可是第三个文件(file\ 3)
名字有空格(file 和3间有空格)
于是实际上第三个文件名分给了两个位置参数
file --->$3
3 --->$4
我就是想“把目录下的每一个文件名都赋给一个位置参数”,
而且我不想先把file\ 3 改名为file3
Re: 又一个变量替换问题
发表于 : 2012-08-09 18:35
由 naturalaw
修改一下IFS到时再改回来。
ps:为什么要抓住位置参数不放。其实你可以使用数组.处理空格直接*
代码: 全选
for files in *;do a=(${a[@]} "$files");echo $files;done
for i in $(seq 0 $(expr ${#a[@]} - 1));do echo $i ${a[$i]};done
Re: 又一个变量替换问题
发表于 : 2012-08-09 18:40
由 lilydjwg
Re: 又一个变量替换问题
发表于 : 2012-08-09 18:42
由 枫叶饭团
代码: 全选
$ ls
asfd a file1 file2
Administrator@maplebeats ~
$ IFS=$'\n'
Administrator@maplebeats ~
$ set `ls -1`
Administrator@maplebeats ~
$ echo $1
asfd a
Administrator@maplebeats ~
$ echo $2
file1
Re: 又一个变量替换问题
发表于 : 2012-08-09 18:43
由 fadingkonra
修改一下IFS到时再改回来。
如果这样的话,所有的文件名不挤在一个参数里了
其实我是想用for+shift+位置参数实现对每个文件的单独操作的
Re: 又一个变量替换问题
发表于 : 2012-08-09 18:47
由 fadingkonra
$ IFS=$'\n'
试了一下,是一个好方法呢

Re: 又一个变量替换问题
发表于 : 2012-08-09 18:53
由 fadingkonra
话说这个 $'\n‘ 是什么呀?
Re: 又一个变量替换问题
发表于 : 2012-08-09 19:03
由 naturalaw
$ IFS=$'\n'
其实是修改我之前说的。
四楼有新回复,不过不用修改$IFS
Re: 又一个变量替换问题
发表于 : 2012-08-09 19:10
由 fadingkonra
太棒了,方法看来有很多呀。
不过有一个小问题,IFS怎么没有手册页呀,是不重要吗?
Re: 又一个变量替换问题
发表于 : 2012-08-09 19:20
由 fadingkonra
找到了,bash(1)里有一句
代码: 全选
IFS 内部字段分隔符 Internal Field Separator 用来在扩展之后进行分词,使用内部命令 read
将行划分成词。默认值是 ``<space><tab><newline>''。