错误重定向:
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的影响》
default分支是 *) 表示的分支
case ... in
...) do something here ;;
...) do something here ;;
*) do soemthing for default branch;;
esac
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下发的`
一般使用以下三种方式调试:
1)echo 利用echo在可能出错的地方打印出变量的值;
2)sh -n your_script 这种运行模式可在不执行脚本的情况下检查出脚本的所有语法错误;
3)sh -x your_script 这是shell的调试模式。这种方式运行脚本时将会打印出整个脚本运行过程中的变量值。
tr(translate缩写)主要用于删除文件中的控制字符,或进行字符转换。
语法:tr [–c/d/s/t] [SET1] [SET2]
SET1: 字符集1
SET2:字符集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