Shell 基础
创建日期:2013-08-17 07:23 修改日期:2016-08-24 16:57:35

shell 是一个作为用户与系统间接口的程序,它允许用户向操作系统输入需要执行的命令

基本

重定向

> 是输出, >> 是以附加的方式输出

>& kill -9 1234 >killouterr.txt 2>&1

管道

管道用操作符 |

脚本

格式

第一行指定执行 shell 的文件,一般是 #!/bin/bash#!/bin/sh

运行

Shell语法(*)

变量

$ a=hello
$ echo $a
hello

$ b=a
$ echo $b
a

$ b=world
$ echo $b
world

$ echo $a
hello

引号

$ read var
Hello World
$ echo $var
Hello World
var="Hello World"
echo $var     # Hello World
echo "$var"   # Hello World
echo '$var'   # $var
echo \$var    $var

环境变量

条件

test或[命令

if test -f file.c ; then
    ...
fi

if [ -f file.c ] ; then
    ...
fi
str1 = str2
str1 != str2
str1 > str2
str1 < str2
-n str  如果字符串不为空则为 True
-z str  如果字符串为 null,则结果为真
exp1 -eq exp2   ==
exp1 -ne exp2   !=
exp1 -gt exp2   >
exp1 -ge exp2   >=
exp1 -lt exp2   <
exp1 -le exp2   <=
!exp            如果 exp 为假则返回真
-d file    directory
-e file    exist
-f file    common file
-g file    set-group-id ???
-r file    readable
-s file    file space is not 0
-u file    set-user-id ???
-w file    writeable
-x file    executeable

可以使用高级数学特性

val++
val--
++val
--val
!       逻辑求反
~       位求反
**      幂运算
<<      左移位
>>
&       按位与
|
&&      逻辑与
||

字符串的比较,但是支持模式匹配

控制结构

if 语句

if condition
then
    statement
elif condition; then
    statement
else
    statement
fi

for 语句

for var in values
do
    statement
done

循环一个序列:

for var in {1..5}
do
    echo $var
done

Bash For Loop Examples

while 语句

while condition
do
    statenment
done

until 语句

until condition
do
    statenment
done

case 语句

case var in
    passtern [| pattern]... ) statement1;;
    passtern [| pattern]... ) statement2;;
    ...
esac

注: 每个模式都以 ;; 结尾

#!/bin/sh
# case statement

echo "Please answer yes or no"
read ans
case "$ans" in
    yes | y | Yes | YES )   echo "yes";;
    no  | n | No  | NO  )   echo "no";;
esac

exit 0

AND OR 列表

&& ||

con1 && con2 && con3
con1 || con2 || con3

语句块

{}

函数

function_name(){
    statement
}

命令

对语句进行求值

foo=10
x=foo      # echo $y --> foo
y='$'$x
echo $y    # --> $foo

eval y='$'$x
echo $y    # --> 10

把参数当作表达式来求值

x=`expr $x + 1`
x=$(expr $x + 1)

补充

算数运算

$((...))
x=$(($x+1))

命令行获取参数

#!/bin/bash

while getopts "a:bc" arg
do
    case $arg in
        a)
            echo "a's arg:$OPTARG"
            echo "a's ind:$OPTIND"
        ;;
        b)
            echo "b"
            echo "b's ind:$OPTIND"
        ;;
        c)
            echo "c"
            echo "c's ind:$OPTIND"
        ;;
        ?)
            echo "fuck you"
            exit 1
        ;;
    esac
done

特殊参数

$* : 等价于 to $1c$2c.., 其中 c 是 IFS 变量的值的第一个字符

$@ : 等价于 $1 $2

$# : 参数的个数

$? : 退出状态

$0 : 源码文件名

参考