LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 1128|回复: 6

恭喜发财,问题答来:-)

[复制链接]
发表于 2008-1-2 21:53:26 | 显示全部楼层 |阅读模式
在请教问题之前,先祝各位shell编程高手:新年快乐,o8进步!

我是菜鸟,做地壳形变研究的,对shell scripts 不太熟悉,想边学边写一个脚本把现有的一些程序整合起来。真的希望但各位千万别不屑回复我的问题,谢谢了先:-)

问题1

在运行一个bash脚本的时候,想把屏幕中所有输出的内容都拷贝到一个一个文件中,在脚本中加入什么命令实现?(用script,但发现保存的内容很混乱)

问题2

在某一目录下,有N个子目录,假设它们的名字分别为a,b,c,d,e,f,g...用bash怎么获取它们的名字,并两两组合生成新的目录名(新目录总数为N*(N-1)/2)即a-b;a-c;a-d;a-e;a-f;a-g;b-c;b-d;b-e;b-f;b-g;c-d;c-e;c-f;c-g;d-e;d-f;d-g;e-f;e-f;f-g
发表于 2008-1-2 22:09:40 | 显示全部楼层
第一个问题。

脚本名>文件名
回复 支持 反对

使用道具 举报

 楼主| 发表于 2008-1-3 19:01:42 | 显示全部楼层
谢谢lostair;
希望有人能回答第二个问题。再一次感谢!
回复 支持 反对

使用道具 举报

发表于 2008-1-4 14:31:51 | 显示全部楼层
对应于第二个问题的script(假设名字为test.sh)其内容如下:
  1. #!/bin/sh
  2. dirs=$(ls $* | awk '{ dir[NR] = $0 }
  3.         END { for(i=1; i<NR; i++)
  4.                 for(j=i+1; j<=NR; j++)
  5.                         print dir[i] "-" dir[j]
  6.         }')
  7. mkdir $dirs
复制代码
用法: ./test.sh <your dir/*>

利用了awk的数组; 其实bash自身的数组功能也是可以的, 可惜俺不熟....
回复 支持 反对

使用道具 举报

发表于 2008-1-4 15:15:19 | 显示全部楼层
对第二个问题,顺便奉送一个Python版的script  :)
  1. #!/usr/bin/python
  2. import sys, os
  3. dirs = os.listdir(sys.argv[1])
  4. for x in dirs:
  5.         for y in dirs[1:]:
  6.                 os.mkdir(x + "-" + y)
  7.         dirs = dirs[1:]
复制代码
回复 支持 反对

使用道具 举报

发表于 2008-1-5 15:05:11 | 显示全部楼层
bash
先取得目录文件read -r -a  a<<<$(ls  -l  |awk '/^d/ {print $NF|')
对数组a进行用两个循环遍历,将两两连接起来
((c1=${#a[@]}-1))
if [ "$c1" -gt 0 ]
then
for ((i=0;i<c1;i++)
do
((c=i+1))
for  ((j=c;j<${#a[@]};j++))
do
echo ${a[$i]}-${a[$j]}
done
done
fi
-------------
或者
read -r -a  a1<<<$(ls )
j1=0
for ((t=0;i<${#a1[@]};t++))
do
if [[ -d ${a1[$t]} ]]
then
a[$j]=${a1[$t]}
((j++))
fi
done


((c1=j1-1))
if [ "$c1" -gt 0 ]
then
for ((i=0;i<c1;i++)
do
((c=i+1))
for  ((j=c;j<j1;j++))
do
echo ${a[$i]}-${a[$j]}
done
done
fi
回复 支持 反对

使用道具 举报

 楼主| 发表于 2008-1-7 22:25:01 | 显示全部楼层
非常感谢chunchengfh and zswlb9999的回复!我自己也要加倍努力!
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表