您的位置:首页 > 文档 > 编程技术 >
 文章分类 

Unix编程/应用问答中文版 ---20.shell script问题


创建:2005-10-26 16:54:03
作者:Unlinux
来自: http://www.Unlinux.com

本文出自:http://www.nsfocus.com 维护:小四

20. shell script问题
20.1 如何获取一个字符串的长度
20.2 读超时自动使用缺省值
20.3
20.4 BASH中如何得到一个字符串的子串
20.5
20.6
20.7
20.8 使用tr命令加密文件
20.9 有哪些命令用于查找定位
20.10
20.11 如何将大写文件名转换为小写文件名
--------------------------------------------------------------------------
20. shell script问题

20.1 如何获取一个字符串的长度

A: Andrei Ivanov

expr `echo $string | wc -c` - 1

echo $string | awk '{ print length( $0 ); }'

/usr/ucb/expr length "$string"

expr "$string" : ".*"

echo "$string" | sed 's/./1+/g;s/+/ /;s/$/p/' | dc

A: http://www.linuxforum.net

假设是bash

$ string='1234567890'
$ echo ${#string}
10
$

20.2 读超时自动使用缺省值

Q: shell script编程,不介入expect、perl、tcl等类似工具。读等待60秒,超时则
自动使用缺省值。可以使用系统缺省外部命令,要求能广泛移植在常用Unix平台


A: CERNET 华中地区网络中心 PUE(UNIX环境程序设计)版 lookout

参看comp.unix.shell新闻组,下面以SPARC/Solaris 2.6为例

--------------------------------------------------------------------------
#! /sbin/sh
stty -icanon min 0 time 255
while true
do
/usr/bin/echo "Press a key or press ENTER to exit:c"
read key
if [ "$key" = "" ] ; then
echo "nYou press Enter or timeout"
break
else
echo "You press the key $key"
fi
done
stty sane
--------------------------------------------------------------------------

20.4 BASH中如何得到一个字符串的子串

A: loginlog@SMTH

BASH 2.0.3 以上版本

${var:offset:length}

20.8 使用tr命令加密文件

A: 水木清华 TheCool

著名的 rot13 密码, 通过把字母移动13个位置实现对文本的加密

tr "[a-m][n-z][A-M][N-Z]" "[n-z][a-m][N-Z][A-M]" < message > newmessage

然后可以用同样的命令进行解密

tr "[a-m][n-z][A-M][N-Z]" "[n-z][a-m][N-Z][A-M]" < newmessage > message

20.9 有哪些命令用于查找定位

A: 小四

type -a telnet
whereis telnet
which telnet
whatis telnet <=> man -k telnet

20.11 如何将大写文件名转换为小写文件名

A: 小四

如果要处理整个目录树的话,可以这样

find -exec sh -c 'mv -f "$0" `echo "$0" | tr "[A-Z]" "[a-z]"` > /de
v/null 2>&1' {} ;

同理,将小写文件名转换为大写文件名如下

find -exec sh -c 'mv -f "$0" `echo "$0" | tr "[a-z]" "[A-Z]"` > /de
v/null 2>&1' {} ;

这个办法有待修正,处理多层目录名本身带有大写字母的情况,有问题。比如存在如
下目录的时候,./A/B/C/D.txt。

A: Potash@www.linuxforum.net 2002-02-05 18:58

--------------------------------------------------------------------------
#! /bin/sh
# Usage: ./loworup.sh <-l | -u>

#
# 第二形参必须是目录,第一形参指定-l或-u
#
if [ $# -ne 2 ] ; then
echo "Usage: ${0} <-l | -u> "
exit 1
fi

if [ ! -d ${2} -o "${1}" != "-l" -a "${1}" != "-u" ] ; then
echo "Usage: ${0} <-l | -u> "
exit 1
fi

exec 1>/dev/null 2>&1

dir=`dirname "${2}"`
cd ${dir}

if [ "${1}" = "-l" ] ; then
base=`basename "${2}" | tr "[A-Z]" "[a-z]"`
else
base=`basename "${2}" | tr "[a-z]" "[A-Z]"`
fi

mv -f "`basename ${2}`" "${base}"

for entry in `find ${base}`
do
before="."
#
# 这个办法依赖for in语法,用空格做分隔符,所以不能处理那些本身名字带空
# 格的目录项,属于小BUG
#
for after in `echo "${entry}" | sed -e 's,/, ,g'`
do
tmp_entry="${before}/${after}"
if [ "${1}" = "-l" ] ; then
before=`echo "${tmp_entry}" | tr "[A-Z]" "[a-z]"`
else
before=`echo "${tmp_entry}" | tr "[a-z]" "[A-Z]"`
fi
mv -f "${tmp_entry}" "${before}"
done
done

转载自:http://www.unlinux.com/doc/program/20051026/2436.html

评论】 【加入收藏夹】 【 】 【打印】 【关闭
 *  请尊重我们的劳动,转载请注明出自UnLinux.Com及作者名 * 

※ 相关链接
 ·Unix编程/应用问答中文版  (2005-10-26 16:54:02)
 ·Unix编程/应用问答中文版 ---0.简介 Unix/C传奇问题  (2005-10-26 16:54:02)
 ·Unix编程/应用问答中文版 ---10.网卡相关问题  (2005-10-26 16:54:02)
 ·Unix编程/应用问答中文版 ---11. package相关问题  (2005-10-26 16:54:02)
 ·Unix编程/应用问答中文版 ---12.日志相关问题 13.进程相关问题  (2005-10-26 16:54:02)
 ·Unix编程/应用问答中文版 ---14.一些小工具的使用 15.32-bit/64-bit相关问题  (2005-10-26 16:54:02)
 ·Unix编程/应用问答中文版 ---16.库相关问题  (2005-10-26 16:54:02)
 ·Unix编程/应用问答中文版 ---17.文件查看问题 18.补丁相关问题  (2005-10-26 16:54:02)
 ·Unix编程/应用问答中文版 ---19.终端相关问题  (2005-10-26 16:54:02)
 ·Unix编程/应用问答中文版 ---2.堆栈相关问题  (2005-10-26 16:54:02)

Copyright © 2005 UnLinux.Com All Rights Reserved