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
-
联系:
#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
#3
帖子
由 fadingkonra » 2012-08-09 18:25
好吧,我好像没说清楚。
我要把目录下的每一个文件名都赋给一个位置参数
比如第一个文件file1 ---> $1
第二个文件file2 ---> $2
可是第三个文件(file\ 3)
名字有空格(file 和3间有空格)
于是实际上第三个文件名分给了两个位置参数
file --->$3
3 --->$4
我就是想“把目录下的每一个文件名都赋给一个位置参数”,
而且我不想先把file\ 3 改名为file3
-
naturalaw
- 帖子: 1360
- 注册时间: 2011-09-06 22:04
#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
-
lilydjwg
- 论坛版主
- 帖子: 4258
- 注册时间: 2009-04-11 23:46
- 系统: Arch Linux
-
联系:
#5
帖子
由 lilydjwg » 2012-08-09 18:40
-
枫叶饭团
- 帖子: 14683
- 注册时间: 2010-06-16 1:05
- 系统: Mac OS X
- 来自: Tencent
-
联系:
#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
#7
帖子
由 fadingkonra » 2012-08-09 18:43
修改一下IFS到时再改回来。
如果这样的话,所有的文件名不挤在一个参数里了
其实我是想用for+shift+位置参数实现对每个文件的单独操作的
-
naturalaw
- 帖子: 1360
- 注册时间: 2011-09-06 22:04
#10
帖子
由 naturalaw » 2012-08-09 19:03
$ IFS=$'\n'
其实是修改我之前说的。
四楼有新回复,不过不用修改$IFS
-
fadingkonra
- 帖子: 30
- 注册时间: 2012-07-10 13:59
#12
帖子
由 fadingkonra » 2012-08-09 19:20
找到了,bash(1)里有一句
代码: 全选
IFS 内部字段分隔符 Internal Field Separator 用来在扩展之后进行分词,使用内部命令 read
将行划分成词。默认值是 ``<space><tab><newline>''。