[ 永遠的UNIX::UNIX技術資料的寶庫 ]   GB |BIG5

首頁 > 編程技術 > C/C++ > 正文
Unix編程/應用問答中文版 ---20.shell script問題
本文出自:http://www.nsfocus.com 維護:小四 (2002-11-15 11:20:03)
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 <iva@racoon.riga.lv> 

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: 小四 <cloudsky@263.net> 

如果要處理整個目錄樹的話,可以這樣 

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

同理,將小寫文件名轉換為大寫文件名如下 

find <target_dir> -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> <target_directory> 


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

if [ $# -ne 2 ] ; then 
    echo "Usage: ${0} <-l | -u> <target_directory>" 
    exit 1 
fi 

if [ ! -d ${2} -o "${1}" != "-l" -a "${1}" != "-u" ] ; then 
    echo "Usage: ${0} <-l | -u> <target_directory>" 
    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.fanqiang.com)
    進入【UNIX論壇

相關文章
 

★  樊強制作 歡迎分享  ★