您的位置:首页 > 运维架构 > Shell

linux Shell编程

2016-04-23 20:21 405 查看
0. man bash可以看到很多很多

1. 变量与变量值(展开)

如果你需要的是变量名,直接使用变量名;如果你需要的是变量值,使用$符号。例如:

export PATH=/home/bin:\$PATH

如果你不确定是要变量还是展开的变量值,那么试着展开下代入表达式看看对不对头。

一般来说,需要左值的地方(给变量赋值)直接用变量名;需要右值的地方(取变量的值)加$符号。

2. 变量赋值,等于号前后不要加空格(加空格的形式用于变量比较)。

3 隔开变量和后缀:

\${go}ing

注意不要{\$go}ing

4. shell通配符和引号

4.1 没有引号

例如ls *.*,shell会将*.*展开为当前目录下所有文件,然后传递给 ls。

4.2 双引号

如果你用ls "*.*",shell会将*.*原样传递给ls,ls就会告诉你没有哪个文件的文件名是*.*

但是,如果双引号内存在\$符号,shell还是会解释。

4.3 单引号

好了,现在连\$也不解释了。

5. C风格表达式

#!/bin/bash

var=2 # 默认变量类型是string,不能直接进行数学运算

echo \$((var * var)) # ((C stype expression)),放在两个小括号内,可以在运算符前后加空格,取变量var的值不需要\$,计算得到的新(临时?)变量仍然用\$引用交给echo

echo \$var # var的值还是2,没有改变。如果上一行是\$((var++)),那这一行就是3了。

6. if条件语句

在shell中,if、[、]等都是内置命令,所以if和[之间以及[]和条件之间都需要用空格分开,避免解释器将if[解释为一条命令。同样的理由,if语句和then语句要分两行或以分号隔开,避免解释器将then认作是if的参数(虽然then不是内置命令)。

if [ -f testfile ]
then
# do something
fi
#或者这样写
if [ -f testfile ]; then
#do something
fi


上面程序可简写为:

[ -f testfile ] && do_something

||符号也是也可以这么用的:

[ -f testfile ] || { echo "oops!"; exit 1; }

同样需注意空格问题:[]和||和{}之间;{}内侧;分号后面。原因都是为了告知bash,命令或参数已结束。注意大括号内部的命令,每条后面都要加分号。

更多结束:[]内部语句相当于一个测试表达式,有返回值。因此你可以用if判断这个返回值,也可以让bash判断这个返回值。

6.1 字符串比较

# "=="符号前后加空格
# 两个字符串都用引号包围
# 否则当$str未定义时会发生问题
if [ "$str" == "string" ]; then
# do something
fi


字符串比较时,两个字符串都用引号包围。script在执行前,变量会被替换为其真正的值,因此,若变量不存在,那么不加引号的if [ \$str == “what” ]会在执行前被替换为if [ == "what"]。

使用-z "string" (string is Empty)或-n (string is Not empty)时同样需加引号,否则[ -z \$a ]就可能会被替换为[ -z ]。而根据bash规则,无参数测试总是为true(?)。因此,若\$a为空,那么[ -z \$a ]和[ -n \$a ]测试将同时成立。

既然可以使用==,那么在需要时也可以使用!=、>、<。注意>和<都是shell特殊字符,因此需要加转义:

[ "a" \< "b" ] && echo "char a is less then char b"

6.2 数值比较

数值比较使用-eq、-ne、-gt、-lt、-ge、-le。

7. 其他测试选项

使用help test可以查看所有可用测试选型。

8. 在当前shell环境中执行script

source your_script

或者

. your_script

以上,your_script不需要x权限。
9. 引用命令执行结果

两种形式:

echo \$(find . -name "*.c")

echo `find . -name *.c`

10. cp file file.orig

可以用如下形式:

cp \$file{,.orig}

\$var{.a,.b,.c,.d}将被展开为

\${var}.a \${var}.b \${var}.c \${var}.d

逗号前后不能有空格。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: