又一个变量替换问题

sh/bash/dash/ksh/zsh等Shell脚本
回复
头像
fadingkonra
帖子: 30
注册时间: 2012-07-10 13:59

又一个变量替换问题

#1

帖子 fadingkonra » 2012-08-09 17:53

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
怎么办?
头像
枫叶饭团
帖子: 14683
注册时间: 2010-06-16 1:05
系统: Mac OS X
来自: Tencent
联系:

Re: 又一个变量替换问题

#2

帖子 枫叶饭团 » 2012-08-09 18:06

代码: 全选

$ IFS=''

Administrator@maplebeats ~
$ ls
file1  file2

Administrator@maplebeats ~
$ set `ls`

Administrator@maplebeats ~

$ echo $1
file1
file2
头像
fadingkonra
帖子: 30
注册时间: 2012-07-10 13:59

Re: 又一个变量替换问题

#3

帖子 fadingkonra » 2012-08-09 18:25

好吧,我好像没说清楚。 :em06
我要把目录下的每一个文件名都赋给一个位置参数
比如第一个文件file1 ---> $1
第二个文件file2 ---> $2
可是第三个文件(file\ 3)
名字有空格(file 和3间有空格)
于是实际上第三个文件名分给了两个位置参数
file --->$3
3 --->$4
我就是想“把目录下的每一个文件名都赋给一个位置参数”,
而且我不想先把file\ 3 改名为file3
头像
naturalaw
帖子: 1360
注册时间: 2011-09-06 22:04

Re: 又一个变量替换问题

#4

帖子 naturalaw » 2012-08-09 18:35

修改一下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
上次由 naturalaw 在 2012-08-09 19:00,总共编辑 1 次。
  • The eternal law
头像
lilydjwg
论坛版主
帖子: 4258
注册时间: 2009-04-11 23:46
系统: Arch Linux
联系:

Re: 又一个变量替换问题

#5

帖子 lilydjwg » 2012-08-09 18:40

代码: 全选

ls -1
按行读。
头像
枫叶饭团
帖子: 14683
注册时间: 2010-06-16 1:05
系统: Mac OS X
来自: Tencent
联系:

Re: 又一个变量替换问题

#6

帖子 枫叶饭团 » 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
头像
fadingkonra
帖子: 30
注册时间: 2012-07-10 13:59

Re: 又一个变量替换问题

#7

帖子 fadingkonra » 2012-08-09 18:43

修改一下IFS到时再改回来。
如果这样的话,所有的文件名不挤在一个参数里了
其实我是想用for+shift+位置参数实现对每个文件的单独操作的
头像
fadingkonra
帖子: 30
注册时间: 2012-07-10 13:59

Re: 又一个变量替换问题

#8

帖子 fadingkonra » 2012-08-09 18:47

$ IFS=$'\n'
试了一下,是一个好方法呢
:em11
头像
fadingkonra
帖子: 30
注册时间: 2012-07-10 13:59

Re: 又一个变量替换问题

#9

帖子 fadingkonra » 2012-08-09 18:53

话说这个 $'\n‘ 是什么呀?
头像
naturalaw
帖子: 1360
注册时间: 2011-09-06 22:04

Re: 又一个变量替换问题

#10

帖子 naturalaw » 2012-08-09 19:03

$ IFS=$'\n'
其实是修改我之前说的。
四楼有新回复,不过不用修改$IFS
  • The eternal law
头像
fadingkonra
帖子: 30
注册时间: 2012-07-10 13:59

Re: 又一个变量替换问题

#11

帖子 fadingkonra » 2012-08-09 19:10

太棒了,方法看来有很多呀。
不过有一个小问题,IFS怎么没有手册页呀,是不重要吗?
头像
fadingkonra
帖子: 30
注册时间: 2012-07-10 13:59

Re: 又一个变量替换问题

#12

帖子 fadingkonra » 2012-08-09 19:20

找到了,bash(1)里有一句

代码: 全选

  IFS    内部字段分隔符    Internal    Field    Separator    用来在扩展之后进行分词,使用内部命令    read
              将行划分成词。默认值是 ``<space><tab><newline>''。
回复