shell入门

来源:互联网 发布:中国石油大学网络认证 编辑:程序博客网 时间:2024/06/03 17:42
1)#!/bin/bash     // 表示用bash shell来执行,不写默认是用bash shell 来执行
     要先加权限:sudo chmod u+x var.sh

2)变量定义的等号两边不能加空格: var=1
     如果有空格,bash会把var当成命令,并且空格是bash脚本命令参数分隔符

3)使用变量值时,需要用$, 比如$var或者${var},如果没有$,默认是字符串

4)得到命令行参数:

echo $0     表示命令本身
echo $1     表示第一个参数
echo $2     表示第二个参数
echo $#     表示有几个参数
echo ${10}     表示第10个参数,注意加{}
                          
5)字符串

var=abcd
var="abcd"
var='abcd'     //同样效果,如果中间有空格,应该用下两种

// 双引号里面的可以解析,单引号不行,同php

6)变量的赋值可以通过 ` 等到命令的处理结果

var=`ls *.sh`     #var得到所有以sh结尾的文件

7)添加或者修改环境变量

export ENVVAR=abc
export ENVVAR=$ENVVAR:def

echo $ENVVAR

控制语句

1) 四则运算 : + - * /
a=100
b=200
echo `expr $a + $b`

2)类似 -gt, 还有 -ge, -lt, -eq, -ne等...

if [ $a -gt $b ]
then
     echo 'a is low then b'
fi

// 字符串比较: =  !=
var1=abcd
var2=abcd
if [ $var1 = $var1 ]
then
     echo "var1 equal var2"
fi

// 还有 -z  -n
if [ -z $var3 ]     // -z是为空, -z, -n 判断字符串是否为空, 它俩相反 
then 
     echo 'varr3 is null'
fi

3)文件条件

if [ -d /home/duan ]
then 
     echo 'dir is exist' 
fi 

-d 表示文件
-e 表示文件存在
-f 表示普通文件

elif:

if [ $1 -gt 90 ]
then 
     echo a
elif [ $1 -gt 80 ]
then
     echo b
elif [ $1 -gt 70 ]
then 
     echo c
fi

4)循环

vars="a b c d"     // 命令用空格分隔
for i in $vars
do 
     echo $var
done

var=1
sum=0
while [ $var -le 100 ]
do
     sum=`expr $var + $sum`
     var=`expr $var + 1`
done
echo $sum

case $1 in
     100)
          echo '100'
          ;;
     200)
          echo '200'
          ;;
     300)
          echo '300'
          ;;
     *)                    #相当于default
          echo "other"
          ;;
esac


模块化

函数:

echo 'out:' $1     #代表外面的命令参数

func()
{
     echo $#     #函数参数个数
     echo $0     #shell的命令
     echo $1     #函数的第一个参数
     echo $2

     return 100     #不能超过255
}

func 100 200 300 400     #函数的调用

#获得最近的函数调用或者执行的脚本返回值
echo $?

文件包含

sub.sh
var=100
echo "in sub.sh var is" $var

main.sh
#普通变量不继承,只在本进程中有效,如是环境变量继承,
var=200
#当使用./sub.sh执行脚本时,其实是fork了一个新的脚本解析器进程去执行了
./sub.sh     #fork new process,那么在sub中的变量,只在sub中有效,执行完就没了
echo $var      #200

#当使用 . sub.sh 来执行脚本的时候,此时不fork新的进程,或者是用source来执行脚本


输入输出从定向


var=100
printf "%d\n" $var

echo aaa > a.txt     #将aaa从定向到a.txt

ls xxx 2> a.txt     #将2的标准错误重定向道a.txt中

ls xxx 2> /dev/null     #将错误信息定向到黑洞

// >> 则表示以追加的方式写入文件


管道:

ps aux | grep a.out     #将前面命令的标准输出定位到后面命令的标准输入

查找文件:grep var(要查找的字符串)  io.sh(文件)

xargs和重定向配合,用来将之前命令的输出的每一个元素,作为后面一个命令的参数,进行执行。
所以后面的命令有可能会执行多次。

// 有 xargs 将前面命令的每一行,当做后面命令的参数
find /usr/include/ -name "*.h" | xargs grep "sockaddr_in"

ls | xargs rm


0 0
原创粉丝点击