分页: 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
好吧,我好像没说清楚。 :em06
我要把目录下的每一个文件名都赋给一个位置参数
比如第一个文件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

代码: 全选

ls -1
按行读。

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'
试了一下,是一个好方法呢
:em11

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>''。