错误重定向:
command 2>file
将command命令执行的出错信息输出到文件file中
局部变量 vs 非局部变量:
function foo()
{
para="hello world"
}
这里的para不是local变量,即在函数foo之外,也可以访问到它,整个shell脚本中都可以读写它。如果要让它只存在于函数foo中,需要在para前面加local关键字。
Shell脚本中的export环境变量不起作用:
在一个shell脚本文件test.sh中写了
export MY_VAR=my_test_var_value
然后执行这个test.sh,结果在env中找不到MY_VAR。但是直接在命令行中执行export MY_VAR=my_test_var_value,就能在 env 中找到MY_VAR。
原因在于,test.sh中的export操作在它的的父脚本(可以认为是当前命令行)中是没有效力的,在命令行中执行完 ./test.sh 后,test.sh 中的操作,包括export环境变量都将失效。
解决办法:用在test.sh前面用source或其等效物.,即
source ./test.sh
或
. ./test.sh
对该问题的详细描述,请看《shell中source命令和.逗号命令对当前父shell的影响》
case的default分支:
default分支是 *) 表示的分支
case … in …) do something here ;; …) do something here ;; *) do soemthing for default branch;;esac
Shell中变量的大小写转换的一种简单方法:
declare -l x="Hello"就可以将x的值变成"hello"
declare -u x="Hello"就可以将x的值变成"HELLO"
注意:这种方法不是在所有的机器上都能工作,比如在一台CentOS 5.3机器上做这样的操作,会提示下面的错误
declare: -l: invalid option
declare: usage: declare [-afFirtx] [-p] [name[=value] …]
所以,用下面的方法要靠谱一些
another-variable=`echo ${some-variable} | tr ‘A-Z’ ‘a-z’`
注意,这里的等号右边以及语句最右边的`是Esc下发的`
shell脚本调试方法:
一般使用以下三种方式调试:
1)echo利用echo在可能出错的地方打印出变量的值;2)sh -n your_script 这种运行模式可在不执行脚本的情况下检查出脚本的所有语法错误;3)sh -x your_script 这是shell的调试模式。这种方式运行脚本时将会打印出整个脚本运行过程中的变量值。
tr 的用法
tr(translate缩写)主要用于删除文件中的控制字符,或进行字符转换。语法:tr [–c/d/s/t] [SET1] [SET2]SET1: 字符集1SET2:字符集2-c:complement,用SET2替换SET1中没有包含的字符-d:delete,删除SET1中所有的字符,不转换-s: squeeze-repeats,压缩SET1中重复的字符-t: truncate-set1,将SET1用SET2转换,一般缺省为-t
关于 $*
$*,该变量包含了所有输入的命令行参数值。如果您运行showrpm openssh.rpm w3m.rpm webgrep.rpm此时 $* 包含了 3 个字符串,即openssh.rpm, w3m.rpm and webgrep.rpm
当一个人真正觉悟的一刻,他放弃追寻外在世界的财富,而开始追寻他内心世界的真正财富