shell的脚步总是以这样的一行开头:
#!/bin/bash
这行叫做shebang
顺序执行两个命令,可以$cmd1;cmd2
要验证脚本语法的准确性,可以用bask-nscriptfilename来验证
如果要debug则为bash-xscr.sh
删除老的文件:
find /home/wwwroot -type f-mtime +30 -exec rm-f{}\;
这里{}和;都是-exec必须的,加\是防止shell解析;
错误输出
如果看见命令结尾有一个2>/dev/null这是将命令的标准错误输出,即2,定向到null
这就是linux的文件描述符decsriptor
stdin0
stdout1
stderr2
你可以把错误和标准输出分别重定向到两个文件
somecmd2>err.txt1>out.txt
变量:
变量既可以做字符也可以做整数,如果是当作整数操作时,要加上let
let"x=$x+1"
不然用x=$x+1就变成后面加上一个+1了
注意变量赋值,等号前后不要有空格!
变量的长度,就是说它有几个字符,${#var}
变量类型:
变量都是作为string存储的,如果要做数学运算,就要用let或者中括号
letresult=no1+no2#这里引用变量不用$了
letreult++
letno1+=6
OR
result=$[no1+no2]#这里对于空格的位置和个数要求很高,中括号里面也可以用$引用
result=$[$no1+100]还有一种方法是用(()),比较烦了
还有方法是expr命令,对于格式要求很高
expr3+4返回7,如果没有加对空格expr3+4就返回“3+4”了!
result=`expr3+4`
result=$(expr$no1+5)
注意上面$加上(),其实也是运行一个命令获取返回值的办法。
注意,如果你要引用变量的值,要放在引号里的话,把它放在双引号里,如果是放在单引号里,不会自动扩展变量的值。
环境变量:
UID,是用户ID,对于root总是0,所以要检查是不是以root身份在运行,
if[$UID-ne0];then
dosomething
fi
输出变量的时候
echo$var
echo${var}
都可以,后者可能是嵌套在双引号里面有用,不容易和其他文字混淆。
数组的定义,可以两种方法
array=(123456)或者
array[0]="a"
array[1]="b"
array[2]="c"
引用数组的值:
echo${array_var[0]}或者echo${array_var[$index]}或者打印所有echo${array_var[*]}
要知道数组长度echo${#array_var[*]}
×××函数
函数定义可以是functionfname(){...}或者直接fname(){...}
引用的时候直接用名字fname,有参数的话加在后面,不用括号
$1$2$3原来使用传递给function的参数
$?表示上次执行的命令返回的值,一般0表示运行正常
循环,判断等顺序的命令:
forvarinlist;
do
commands;#use$var
done
----
whilecondition
do
commands;
done
------
x=0;
until[$x-eq9];
doletx++;echo$x;
done
-----
ifcondition;
then
commands;
fi
-------
ifcondition;
then
commands;
elifcondition;
then
commands
else
commands
fi
--------
在条件判断里面,如果判断string的话,最好是加上双括号
[[$str1==$str2]][[$str1!=$str2]][[$str1>$str2]]
[[-z$str1]]:Returnstrueifstr1holdsanemptystring
[[-n$str1]]:Returnstrueifstr1holdsanon-emptystring
脚本里面运行一个命令或程序,是可把命令程序名称放在变量里的,
看profile运行目录里一系列.sh文件,用了这个方法
for i in/etc/profile.d/&.sh;do
if[-r"$i"];then
.$i
fi
done
Linux对正则表达式支持的很好,如果熟悉的话,工作起来会很方便。
比如对于.conf之类的配置文件,通常里面很多是#开头的注释行。你要看真正有用的配置行的话,就可以用这个命令
grep^[^#]httpd.conf
这里第一个^表示行的开头,中括号里的^表示否,即找出行开头不是#的行
还有很多实用的用法,等以后想到一一补充,呵呵。
sed 里的正则表达式,又有些不同。
小括号和大括号前面都要加上反斜杠,不然就当一个普通字符处理。
-
\{
i
\}
As
*
, but matches exactly i sequences ( i is a decimal integer; for portability, keep it between 0 and 255 inclusive).
\{
i,
j\}
Matches between i and j, inclusive, sequences.
-
\{
i
,\}
-
Matches more than or equal to i sequences.
\(
regexp\)
Groups the inner regexp as a whole,
括号里定义的正则表达式匹配的字符可以引用,
-
\
digit
-
Matches the digit-th
\(...\)
parenthesized subexpression in the regular expression.
-
This is called a back reference.
-
Subexpressions are implicity numbered by counting occurrences of
\(
left-to-right.
-