Unix程式設計/應用問答中文版 ---20.shell script問題(轉)

post0發表於2007-08-10
Unix程式設計/應用問答中文版 ---20.shell script問題(轉)[@more@]

作者:不祥 [文章出自: ]

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:

假設是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 " You 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@ 2002-02-05 18:58

--------------------------------------------------------------------------

#! /bin/sh

# Usage: ./loworup.sh

#

# 第二形參必須是目錄,第一形參指定-l或-u

#

if [ $# -ne 2 ] ; then

echo "Usage: ${0} "

exit 1

fi

if [ ! -d ${2} -o "${1}" != "-l" -a "${1}" != "-u" ] ; then

echo "Usage: ${0} "

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

--------------------------------------------------------------------------

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/8225414/viewspace-940446/,如需轉載,請註明出處,否則將追究法律責任。

相關文章