精华内容
下载资源
问答
  • .sh文件

    千次阅读 2019-05-22 18:44:52
    怎么写一个.sh文件1 开头程序必须以下面的行开始(必须方文件的第一行):编译运行2 注释3 变量4 环境变量5 Shell命令和流程控制1)Unix 命令:2) 概念: 管道, 重定向和 backtick3) 流程控制 1 开头程序必须以下面的...

    1 开头程序必须以下面的行开始(必须方在文件的第一行):

    #!/bin/sh
    符号#!用来告诉系统它后面的参数是用来执行该文件的程序。在这个例子中我们使用/bin/sh来执行程序。
    当编写脚本完成时,如果要执行该脚本,还必须使其可执行。
    要使编写脚本可执行:

    编译

    chmod +x filename

    运行

    ./filename

    2 注释

    在进行shell编程时, 以#开头的句子表示注释,直到这一行的结束 。

    3 变量

    在其他编程语言中必须使用变量。在shell编程中,所有的变量都由字符串组成,并且不需要对变量进行声明。要赋值给一个变量,可以这样写:
    #!/bin/sh
    #对变量赋值:
    a=”hello world”
    #现在打印变量a的内容:
    echo “A is:”拆分组合成功
    echo $a

    有时候变量名很容易与其他文字混淆,比如:
    num=2
    echo “this is the $numnd”
    这并不会打印出”this is the 2nd”,而仅仅打印”this is the “,因为shell会去搜索变量numnd的值,但是这个变量时没有值的。可以使用花括号来告诉shell我们要打印的是

    num变量:
    num=2
    echo “this is the ${num}nd”
    这将打印: this is the 2nd

    4 环境变量

    由export关键字处理过的变量叫做环境变量。我们不对环境变量进行讨论,因为通常情况下仅仅在登录脚本中使用环境变量。

    5 Shell命令和流程控制

    在shell脚本中可以使用三类命令:

    1)Unix 命令:

    虽然在shell脚本中可以使用任意的unix命令,但是还是由一些相对更常用的命令。这些命令通常是用来进行文件和文字操作的。
    常用命令语法及功能
    echo “some text”: 将文字内容打印在屏幕上

    ls: 文件列表

    wc –l filewc(计算文件行数) -w filewc (计算文件中的单词数)-c file(计算文件中的字符数):

    cp sourcefile destfile: 文件拷贝

    mv oldname newname : 重命名文件或移动文件

    rm file: 删除文件

    grep ‘pattern’ file: 在文件内搜索字符串比如:grep’searchstring’ file.txt

    cut -b colnum file: 指定欲显示的文件内容范围,并将它们输出到标准输出设备比如:输出每行第5个到第9个字符cut -b5-9 file.txt千万不要和cat命令混淆,这是两个完全不同的命令

    cat file.txt: 输出文件内容到标准输出设备(屏幕)上

    file somefile: 得到文件类型

    read var: 提示用户输入,并将输入赋值给变量

    sort file.txt: 对file.txt文件中的行进行排序

    uniq: 删除文本文件中出现的行列比如: sortfile.txt | uniq

    expr: 进行数学运算 Example: add 2 and 3 expr 2 “+” 3

    find: 搜索文件比如:根据文件名搜索find .-name filename –print

    tee: 将数据输出到标准输出设备(屏幕) 和文件比如:somecommand | tee outfile

    basename file: 返回不包含路径的文件名比如: basename /bin/tux将返回 tux

    dirname file: 返回文件所在路径比如:dirname/bin/tux将返回 /bin

    head file: 打印文本文件开头几行

    tail file : 打印文本文件末尾几行

    sed: Sed是一个基本的查找替换程序。可以从标准输入(比如命令管道)读入文本,并将结果输出到标准输出(屏幕)。该命令采用正则表达式(见参考)进行搜索。不要和shell中的通配符相混淆。比如:将linuxfocus替换为 LinuxFocus :cat text.file | sed ’s/linuxfocus/LinuxFocus/’ >newtext.fileawk:

    awk 用来从文本文件中提取字段。缺省地,字段分割符是空格,可以使用-F指定其他分割符。
    catfile.txt | awk -F, ‘{print $1 “,” $3}’这里我们使用,作为字段分割符,同时打印第一个和第三个字段。如果该文件内容如下: Adam Bor, 34, IndiaKerryMiller, 22, USA命令输出结果为:Adam Bor, IndiaKerry Miller, USA

    2) 概念: 管道, 重定向和 backtick

    管道 (|) 将一个命令的输出作为另外一个命令的输入。
    grep “hello” file.txt | wc –l
    在file.txt中搜索包含有”hello”的行并计算其行数。
    在这里grep命令的输出作为wc命令的输入。当然您可以使用多个命令。

    重定向:将命令的结果输出到文件,而不是标准输出(屏幕)。
    > 写入文件并覆盖旧文件
    >>加到文件的尾部,保留旧文件内容。

    反短斜线
    使用反短斜线可以将一个命令的输出作为另外一个命令的一个命令行参数。
    命令:
    find . -mtime -1 -type f -print
    用来查找过去24小时(-mtime –2则表示过去48小时)内修改过的文件。如果您想将所有查找到的文件打一个包,则可以使用以下linux 脚本:

    #!/bin/sh
    #The ticks are backticks () not normal quotes (‘): tar -zcvf lastmod.tar.gzfind . -mtime -1 -type f -print`

    3) 流程控制

    1.if
    “if” 表达式
    如果条件为真则执行then后面的部分:
    if ….; then….
    elif ….; then….
    else….
    fi
    大多数情况下,可以使用测试命令来对条件进行测试。比如可以比较字符串、判断文件是否存在及是否可读等等…

    通常用” [ ] “来表示条件测试。注意这里的空格很重要。要确保方括号的空格。
    [ -f “somefile” ] :判断是否是一个文件
    [ -x “/bin/ls” ] :判断/bin/ls是否存在并有可执行权限
    [ -n " v a r " ] : 判 断 var" ] :判断 var"]var变量是否有值
    [ “ a " = " a" = " a"="b” ] :判断 a 和 a和 ab是否相等
    执行man test可以查看所有测试表达式可以比较和判断的类型。
    直接执行以下脚本:

    #!/bin/sh
    if [ “$SHELL” = “/bin/bash” ]; then
    echo “your login shell is the bash (bourne againshell)”
    else
    echo “your login shell is not bash but $SHELL”
    fi

    变量$SHELL包含了登录shell的名称,我们和/bin/bash进行了比较。
    快捷操作符
    熟悉C语言的朋友可能会很喜欢下面的表达式:

    [ -f “/etc/shadow” ] && echo “This computer uses shadow passwors”
    这里 && 就是一个快捷操作符,如果左边的表达式为真则执行右边的语句。

    也可以认为是逻辑运算中的与操作。上例中表示如果/etc/shadow文件存在则打印” This computer uses shadow passwors”。同样或操作(||)在shell编程中也是可用的。这里有个例子:

    #!/bin/sh
    mailfolder=/var/spool/mail/james
    [ -r "KaTeX parse error: Expected '}', got 'EOF' at end of input: …o “Can not readmailfolder” ; exit 1; }
    echo “$mailfolder has mail from:”
    grep “^From ” $mailfolder
    该脚本首先判断mailfolder是否可读。如果可读则打印该文件中的”From” 一行。如果不可读则或操作生效,打印错误信息后脚本退出。这里有个问题,那就是我们必须有两个命令:

    ◆打印错误信息

    ◆退出程序

    我们使用花括号以匿名函数的形式将两个命令放到一起作为一个命令使用。一般函数将在下文提及.不用与和或操作符,我们也可以用if表达式作任何事情,但是使用与或操作符会更便利很多。

    展开全文
  • android开发笔记之sh脚本

    万次阅读 2016-05-15 11:02:44
    这个例子中我们使用/bin/sh来执行程序。执行sh脚本当编辑好脚本时,如果要执行该脚本,还必须使其可执行。 要使脚本可执行: Sh代码chmod +x filename或者sudo chmod 777 filename然后,您可以通过输入下面二个...

    这里写图片描述

    sh脚本开头

    #!/bin/sh

    符号#!用来告诉系统它后面的参数是用来执行该文件的程序。在这个例子中我们使用/bin/sh来执行程序。

    执行sh脚本

    当编辑好脚本时,如果要执行该脚本,还必须使其可执行。
    要使脚本可执行:
    Sh代码

    chmod +x filename

    或者

    sudo chmod 777 filename

    然后,您可以通过输入下面二个命令的一个来执行您的脚本。

     ./filename

    或者

    source filename

    输出信息:

    echo "hello sh"

    退出当前shell

    exit 1
    exit 0

    注释,

    在进行shell编程时,以#开头的句子表示注释,直到这一行的结束。

    #print debug info

    多行注释

    : << !
    语句1
    语句2
    语句3
    语句4
    !

    变量

      在shell编程中,所有的变量都由字符串组成,并且您不需要对变量进行声明。要赋值给一个变量,您可以这样写:

    变量名=

    取出变量值可以加一个美元符号($)在变量前面

    #test variable
    var_1=12
    echo "var_1=${var_1}"
    #test variable
    var_2=abc_21
    echo "var_2=${var_2}"

    条件判断—if

    if 语句格式:

    if条件; then
    Command
    fi
    if 条件; then
      command
    else
      command
    fi
    if 条件; then
      command
    elif 条件; then
      command
    else
      command
    fi

    条件判断:

    字符串判断

    str1 = str2      当两个串有相同内容、长度时为真
    str1 != str2      当串str1和str2不等时为真
    -n str1        当串的长度大于0时为真(串非空)
    -z str1        当串的长度为0时为真(空串)
    str1         当串str1为非空时为真
    \ > \ < 比较大小的时候 可以使用大于号,小于号,但是需转义。例如 [ “2006.01.23” > “2005.03.01” ] && echo dayu || echo budayu

    数字的判断

    int1 -eq int2    两数相等为真
    int1 -ne int2    两数不等为真
    int1 -gt int2    int1大于int2为真
    int1 -ge int2    int1大于等于int2为真
    int1 -lt int2    int1小于int2为真
    int1 -le int2    int1小于等于int2为真

    文件的判断

    -r file     用户可读为真
    -w file     用户可写为真
    -x file     用户可执行为真
    -f file     文件为正规文件为真
    -d file     文件为目录为真
    -c file     文件为字符特殊文件为真
    -b file     文件为块特殊文件为真
    -s file     文件大小非0时为真
    -t file     当文件描述符(默认为1)指定的设备为终端时为真

    复杂逻辑判断

    -a         与
    -o        或
    !        非

    上面的三种写在括号内,对应的 && || 写在中括号之间。
    例如,

    if  [   "$a"  eq   1  -o  "$b" eq 2 ]  &&  [   "$c"  eq  3 ]

    字符串匹配

    if [  `echo $str | grep -e regexp`  ];then .

    数字的样例:

    #!/bin/sh
    var_1=$1
    var_2=$2
    echo "var_1=${var_1}"
    echo "var_2=${var_2}"
    if [ ${var_2} -eq ${var_1} ] ; then
      echo "var_2:{$var_2} == var_1:{$var_1}"
    elif [ ${var_2} -gt ${var_1} ] ; then
      echo "var_2:{$var_2} > var_1:{$var_1}"
    else
      echo "var_2:{$var_2} < var_1:{$var_1}"
    fi

    ./test.sh 10 10

    var_1=10
    var_2=10
    var_2:{10} == var_1:{10}

    字符串的样例:

    #!/bin/sh
    
    var_1=$1
    var_2=$2
    
    echo "var_1=${var_1}"
    echo "var_2=${var_2}"
    
    if [ ${var_2} = ${var_1} ] ; then
      echo "var_2:{$var_2} == var_1:{$var_1}"
    fi

    ./test.sh a a

    var_1=a
    var_2=a
    var_2:{a} == var_1:{a}

    case语句:

    第一种:
    case分支语句的格式如下:

    case $变量名 in
    模式1)
    命令序列1
             ;;
        模式2)
             命令序列2
             ;; 
        *)
             默认执行的命令序列     
    ;; 
    esac

    例如:

        case $(uname -s) in
            Darwin)
                ANDROID_EMULATOR_PREBUILTS=$T/prebuilts/android-emulator/darwin-x86_64
                ;;
            Linux)
                ANDROID_EMULATOR_PREBUILTS=$T/prebuilts/android-emulator/linux-x86_64
                ;;
            *)
                ANDROID_EMULATOR_PREBUILTS=
                ;;
        esac

    Demo:

    #!/bin/sh
    var_1=$1
    echo "var_1=${var_1}"
    case $var_1 in
            user)
                echo "var_1 is user"
                ;;
            eng)
                echo "var_1 is eng"
                ;;
            userdebug)
                echo "var_1 is userdebug"
                ;;
            *)
                echo "var_1 is not one of (user,eng,userdebug)"
                ;;
    esac

    ./test.sh user

    var_1=user
    var_1 is user

    第二种:
    case分支语句的格式如下:

    case $变量名 in
    模式1 |模式2|模式3)
    命令序列
             ;;
        *)
             默认执行的命令序列     
    ;; 
    esac

    样例:

    #!/bin/sh
    var_1=$1
    echo "var_1=${var_1}"
    case  $var_1 in
        "user" | "userdebug" | "eng")   
           echo "var_1 is $var_1"
               ;; 
            *)
               echo "var_1 is not one of (user,eng,userdebug)"
               ;;
    esac

    ./test.sh user

    var_1=user
    var_1 is user

    循环:

    形式一:

    while ...; do 
    ... 
    done

    形式二:

    for var in ....; do 
    .... 
    done 
    for i in {1..6};
    do
       echo $i
    done  

    ./test.sh

    1
    2
    3
    4
    5
    6
    for File in 1 2 3 4 5 ;
    do 
        echo $File 
    done

    ./test.sh

    1
    2
    3
    4
    5
    for shname in `ls *.sh`;
    do 
      name=`echo "$shname" | awk -F. '{print $1}'`           
      echo $name
    done

    ./test.sh

    test_01
    test
    
    for((i=1;i<50;i++));
    do
        if(((i%3)==0));
        then
            echo $i
        fi
    done

    ./test.sh

    3
    6
    9
    12
    15
    18
    21
    24
    27
    30
    33
    36
    39
    42
    45
    48
    min=1
    max=20
    while [ $min -le $max ];
    do
        echo $min
        min=`expr $min + 1`
    done
    

    ./test.sh

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20

    函数

    function name()
    {
        # inside the body $1 is the first argument given to the function 
        # $2 the second ... 
    body
    }
    #!/bin/sh
    
    function usage()
    {
        echo "usage()------------start"
        echo "-----------------------"
        echo "usage()-------------end"
    }
    
    usage

    ./test.sh

    usage()------------start
    -----------------------
    usage()-------------end
    

    expr

    四则计算:

    a1=10
    a2=20
    a3=`expr $a1 + $a2`
    echo "========================="
    echo "a3=$a3"
    echo "========================="
    a4=`expr 10 + 12`
    echo "a4=$a4"
    echo "========================="

    ./test.sh

    =========================
    a3=30
    =========================
    a4=22
    =========================

    计算字符串的长度:

    string="hello,everyone my name is xiaoming"
    leng_01=`echo ${#string}`
    echo "leng_01=$leng_01"
    leng_02=`expr length "$string"`
    echo "leng_02=$leng_02"

    ./test.sh

    leng_01=34
    leng_02=34

    expr中的expr index stringsubstring string上找出substring中字符第一次出现的位置,若找不到则expr index返回0或1

    
    string="hello,everyone my name is xiaoming"
    index_start=`expr index "$string" hello`
    echo "index_start=$index_start"

    ./test.sh

    index_start=1

    expr中的expr match $string substring命令在string字符串中匹配substring字符串,然后返回匹配到的substring字符串的长度,若找不到则返回0

    string="hello,everyone my name is xiaoming"
    match_length=`expr match "$string" everyone`
    echo "match_length=$match_length"
    match_length=`expr match "$string" hell.* `
    echo "match_length=$match_length"
    match_length=`expr match "$string" hell`
    echo "match_length=$match_length"

    ./test.sh

    match_length=0
    match_length=34
    match_length=4

    在shell中可以用{string:position}和{string:position:length}进行对string字符串中字符的抽取。第一种是从position位置开始抽取直到字符串结束,第二种是从position位置开始抽取长度为length的子串。而用expr中的expr substr string position $length同样能实现上述功能

    string="hello,everyone my name is xiaoming"
    echo ${string:10}
    echo ${string:10:6}  
    echo ${string:10:10}  
    substring=`expr substr "$string" 11 6`
    echo "substring:$substring"

    ./test.sh

    yone my name is xiaoming
    yone m
    yone my na
    substring:yone m

    Unix 命令:

      虽然在shell脚本中可以使用任意的unix命令,但是还是由一些相对更常用的命令。这些命令通常是用来进行文件和文字操作的。

    常用命令语法及功能
    echo “some text” 将文字内容打印在屏幕上
    ls 文件列表
    mv oldname newname 重命名文件或移动文件
    cp sourcefile destfile 文件拷贝
    rm file 删除文件
    cat file.txt 输出文件内容到标准输出设备(屏幕)上
    wc file.txt 计算文件行数 计算文件中的单词数 计算文件中的字符数
    grep pattern file 在文件内搜索字符串比如:grep searchstring file.txt
    file somefile 得到文件类型
    read var 提示用户输入,并将输入赋值给变量
    sort file.txt 对file.txt文件中的行进行排序
    head file 打印文本文件开头几行
    tail file 打印文本文件末尾几行
    tee 将数据输出到标准输出设备(屏幕) 和文件比如:somecommand | tee outfile
    basename file 返回不包含路径的文件名
    dirname file 返回文件所在路径
    uniq 删除文本文件中出现的行列比如: sort file.txt | uniq
    find 搜索文件比如:根据文件名搜索find . -name filename -print

    #!/bin/sh
    
    SRC_DIR=$PWD
    file=$SRC_DIR/test.sh
    
    #echo "some text"
    #echo "----------------"
    #ls
    
    #echo "----------------"
    #wc $SRC_DIR
    #wc $file
    
    #echo "----------------"
    #grep -ni fi $file 
    
    #echo "----------------"
    #file $file
    
    #echo "----------------"
    #sort $file
    
    #echo "----------------"
    #echo -e "Please enter your name:"
    #read name
    #echo "your name:$name"
    
    #echo "----------------"
    #cat $file
    
    #echo "----------------"
    #head $file
    
    #echo "----------------"
    #tail $file
    
    #echo "----------------"
    #cat $file | tee 123.txt
    
    #echo "----------------"
    #basename $file
    
    #echo "----------------"
    #dirname $file
    
    #echo "----------------"
    #cat test.sh | sort |uniq
    
    #echo "----------------"
    #find . -name "*.sh" -print
    
    exit 1

    管道 (|)

    将一个命令的输出作为另外一个命令的输入。

    grep "hello" file.txt | wc -l 

    在file.txt中搜索包含有”hello”的行并计算其行数。

    重定向

    将命令的结果输出到文件,而不是标准输出(屏幕)。

    写入文件并覆盖旧文件

    加到文件的尾部,保留旧文件内容。

    export

    设置或显示环境变量, export可新增,修改或删除环境变量,供后续执行的程序使用。export的效力仅及于该次登录操作

    export PATH=”$PATH:/home/user/bin” 增加
    export -p 显示shell赋予程序的环境变量

    mbldenv.sh

    #!/bin/bash
    # ##########################################################
    # ALPS(Android4.1 based) build environment profile setting
    # ##########################################################
    # Overwrite JAVA_HOME environment variable setting if already exists
    JAVA_HOME=/usr/lib/jvm/java-7-openjdk-amd64
    export JAVA_HOME
    
    # Overwrite ANDROID_JAVA_HOME environment variable setting if already exists
    ANDROID_JAVA_HOME=/usr/lib/jvm/java-7-openjdk-amd64
    export ANDROID_JAVA_HOME
    
    # Overwrite PATH environment setting for JDK & arm-eabi if already exists
    PATH=/usr/lib/jvm/java-7-openjdk-amd64/bin:$PATH
    export PATH

    常用的一些sh命令:

    当前目录的绝对路径:

    #!/bin/sh
    my_source_dir=$(pwd)
    echo "my_source_dir:${my_source_dir}"
    
    my_source_dir_02=$PWD
    echo "my_source_dir_02:$my_source_dir_02"

    ./test.sh

    my_source_dir:/home/android/test_sh
    my_source_dir_02:/home/android/test_sh

    系统属性相关的写读操作:

    setprop qcom.audio.init complete
    target=`getprop ro.board.platform`

    日期

    RELEASE=`date +%Y%m%d`
    echo $RELEASE

    输出日期:
    20160510

    RELEASE=`date +%Y%m%d%H%M%S`
    echo $RELEASE

    输出日期:
    20161103160827

    删除文件夹,创建文件夹

    rm -rf $BUILD_OUT
    mkdir -p $BUILD_OUT

    进入目录

    cd /sys/devices/*wcnss-wlan

    执行sh脚本时,输入参数的个数:

    $#
    //执行脚本的名字
    echo $0
    //执行sh脚本时,输入的第一个参数:
    echo $1
    //执行sh脚本时,输入的第二个参数:
    echo $2
    
    echo $#
    echo $0
    echo $1
    echo $2

    ./test_01.sh 1 2

    2
    ./test_01.sh
    1
    2

    参考资料:

    http://blog.csdn.net/crazyhacking/article/details/10182563
    linux shell 之if——-用if做判断

    http://www.cnblogs.com/kangyoung/p/3556186.html
    Linux shell for while 循环

    http://blog.csdn.net/junjieguo/article/details/7293622
    bash shell中expr命令下几种的使用

    http://blog.csdn.net/a2005120832/article/details/5656187
    linux的sh脚本编程

    http://blog.csdn.net/xifeijian/article/details/9209643
    Linux Shell脚本编程--wc命令

    展开全文
  • build.sh脚本

    万次阅读 2017-11-01 18:13:25
    这个例子中我们使用/bin/sh来执行程序。 当编写脚本完成时,如果要执行该脚本,还必须使其可执行。 要使编写脚本可执行: 编译chmod +x filename这样才能用./filename来运行 2注释 进行shell编程时,以#开头的...

    1 开头
    程序必须以下面的行开始(必须方在文件的第一行):
    #!/bin/sh
    符号#!用来告诉系统它后面的参数是用来执行该文件的程序。在这个例子中我们使用/bin/sh来执行程序。
    当编写脚本完成时,如果要执行该脚本,还必须使其可执行。
    要使编写脚本可执行:
    编译 chmod +x filename 这样才能用./filename 来运行


    2 注释
    在进行shell编程时,以#开头的句子表示注释,直到这一行的结束。


    3 变量
    在shell编程中,所有的变量都由字符串组成,并且不需要对变量进行声明。要赋值给一个变量,可以这样写:
    #!/bin/sh
    #对变量赋值:
    a=”hello world”
    # 现在打印变量a的内容:
    echo “A is:”
    echo $a
    有时候变量名很容易与其他文字混淆,比如:
    num=2
    echo “this is the $numnd”
    这并不会打印出”this is the 2nd”,而仅仅打印”this is the “,因为shell会去搜索变量numnd的值,但是这个变量时没有值的。可以使用花括号来告诉shell我们要打印的是num变量:
    num=2
    echo “this is the ${num}nd”
    这将打印: this is the 2nd


    4 环境变量
    由export关键字处理过的变量叫做环境变量。我们不对环境变量进行讨论,因为通常情况下仅仅在登录脚本中使用环境变量。


    5 Shell命令和流程控制
    shell脚本中可以使用三类命令:
    1)Unix 命令:
    虽然在shell脚本中可以使用任意的unix命令,但是还是有一些相对更常用的命令。这些命令通常是用来进行文件和文字操作的。
    常用命令语法及功能
    echo “some text”: 将文字内容打印在屏幕上
    ls: 文件列表
    wc –l filewc -w filewc -c file: 计算文件行数计算文件中的单词数计算文件中的字符数
    cp sourcefile destfile: 文件拷贝
    mv oldname newname : 重命名文件或移动文件
    rm file: 删除文件
    grep ‘pattern’ file: 在文件内搜索字符串比如:grep ’searchstring’ file.txt
    cut -b colnum file: 指定欲显示的文件内容范围,并将它们输出到标准输出设备比如:输出每行第5个到第9个字符cut -b5-9 file.txt千万不要和cat命令混淆,
    这是两个完全不同的命令
    cat file.txt: 输出文件内容到标准输出设备(屏幕)上
    file somefile: 得到文件类型
    read var: 提示用户输入,并将输入赋值给变量
    sort file.txt: 对file.txt文件中的行进行排序
    uniq: 删除文本文件中出现的行列比如: sort file.txt | uniq
    expr: 进行数学运算
    Example: add 2 and 3expr 2 “+” 3
    find: 搜索文件比如:根据文件名搜索find . -name filename -print
    tee: 将数据输出到标准输出设备(屏幕) 和文件比如:
    somecommand | tee outfile
    basename file: 返回不包含路径的文件名比如: basename /bin/tux将返回 tux
    dirname file: 返回文件所在路径比如:dirname /bin/tux将返回 /bin
    head file: 打印文本文件开头几行
    tail file : 打印文本文件末尾几行
    sed: Sed是一个基本的查找替换程序。可以从标准输入(比如命令管道)读入文本,并将结果输出到标准输出(屏幕)。该命令采用正则表达式(见参考)进行搜索。不要和shell中的通配符相混淆。比如:将linuxfocus替换为 LinuxFocus :cat text.file | sed ’s/linuxfocus/LinuxFocus/’ >newtext.file

    awk: awk 用来从文本文件中提取字段。缺省地,字段分割符是空格,可以使用-F指定其他分割符。
    catfile.txt | awk -F, ‘{print $1 “,” $3}’这里我们使用“,”作为字段分割符,同时打印第一个和第三个字段。如果该文件内容如下: Adam Bor, 34, IndiaKerryMiller, 22, USA命令输出结果为:Adam Bor, IndiaKerry Miller, USA


    2) 概念: 管道, 重定向和 backtick
    这些不是系统命令,但是他们真的很重要。
    1.管道(|)-----将一个命令的输出作为另外一个命令的输入。
    grep “hello” file.txt | wc -l
    file.txt中搜索包含有”hello”的行并计算其行数。
    在这里grep命令的输出作为wc命令的输入。当然您可以使用多个命令。
    2.重定向-----将命令的结果输出到文件,而不是标准输出(屏幕)。
    3.>----- 写入文件并覆盖旧文件
    4.>>----- 加到文件的尾部,保留旧文件内容。
    5.反短斜线-----使用反短斜线可以将一个命令的输出作为另外一个命令的一个命令行参数。
    命令:
    find . -mtime -1 -type f -print
    用来查找过去24小时(-mtime –2则表示过去48小时)内修改过的文件。如果您想将所有查找到的文件打一个包,则可以使用以下linux 脚本:
    #!/bin/sh
    # The ticks are backticks (`) not normal quotes (‘):
    tar -zcvf lastmod.tar.gz `find . -mtime -1 -type f -print`


    3) 流程控制
    1.if
    “if” 表达式 如果条件为真则执行then后面的部分:
    if ….; then
    ….
    elif ….; then
    ….
    else
    ….
    fi
    大多数情况下,可以使用测试命令来对条件进行测试。比如可以比较字符串、判断文件是否存在及是否可读等等…


    通常用” [ ] “来表示条件测试。注意这里的空格很重要。要确保方括号的空格。
    [ -f "somefile" ] :判断是否是一个文件
    [ -x "/bin/ls" ] :判断/bin/ls是否存在并有可执行权限
    [ -n "$var" ] :判断$var变量是否有值
    [ "$a" = "$b" ] :判断$a$b是否相等
    执行man test可以查看所有测试表达式可以比较和判断的类型。
    直接执行以下脚本:
    #!/bin/sh
    if [ "$SHELL" = "/bin/bash" ]; then
    echo “your login shell is the bash (bourne again shell)”
    else
    echo “your login shell is not bash but $SHELL”
    fi

    变量$SHELL包含了登录shell的名称,我们和/bin/bash进行了比较。
    快捷操作符
    熟悉C语言的朋友可能会很喜欢下面的表达式:
    [ -f "/etc/shadow" ] && echo “This computer uses shadow passwors”
    这里 && 就是一个快捷操作符,如果左边的表达式为真则执行右边的语句。
    您也可以认为是逻辑运算中的与操作。上例中表示如果/etc/shadow文件存在则打印” This computer uses shadow passwors”。同样或操作(||)shell编程中也是可用的。这里有个例子:
    #!/bin/sh
    mailfolder=/var/spool/mail/james
    [ -r "$mailfolder" ]‘ ‘{ echo “Can not read $mailfolder” ; exit 1; }
    echo “$mailfolder has mail from:”
    grep “^From ” $mailfolder
    该脚本首先判断mailfolder是否可读。如果可读则打印该文件中的”From” 一行。如果不可读则或操作生效,打印错误信息后脚本退出。这里有个问题,那就是我们必须有两个命令:
    打印错误信息
    退出程序
    我们使用花括号以匿名函数的形式将两个命令放到一起作为一个命令使用。一般函数将在下文提及。
    不用与和或操作符,我们也可以用if表达式作任何事情,但是使用与或操作符会更便利很多。

     

    2.case

    case :表达式可以用来匹配一个给定的字符串,而不是数字。

    case ... in

    ...) do something here ;;

    esac

      让我们看一个例子。 file命令可以辨别出一个给定文件的文件类型,比如:

    file lf.gz

      这将返回:

    lf.gz: gzip compressed data, deflated, original filename,

    last modified: Mon Aug 27 23:09:18 2001, os: Unix

     我们利用这一点写了一个叫做smartzip的脚本,该脚本可以自动解压bzip2, gzip 和zip 类型的压缩文件:

    #!/bin/sh

    ftype=`file "$1"`

    case "$ftype" in

    "$1: Zip archive"*)

      unzip "$1" ;;

    "$1: gzip compressed"*)

      gunzip "$1" ;;

    "$1: bzip2 compressed"*)

      bunzip2 "$1" ;;

    *) echo "File $1 can not be uncompressed with smartzip";;

    esac

      您可能注意到我们在这里使用了一个特殊的变量$1。该变量包含了传递给该程序的第一个参数值。

    也就是说,当我们运行:

    smartzip articles.zip

    $1 就是字符串 articles.zip


    3. selsect

    select 表达式是一种bash的扩展应用,尤其擅长于交互式使用。用户可以从一组不同的值中进行选择。

    select var in ... ; do

     break

    done

    .... now $var can be used ....

    下面是一个例子:

     
    #!/bin/sh

    echo "What is your favourite OS?"

    select var in "Linux" "Gnu Hurd" "Free BSD" "Other"; do

        break

    done

    echo "You have selected $var"

      下面是该脚本运行的结果:

    What is your favourite OS?

    1) Linux

    2) Gnu Hurd

    3) Free BSD

    4) Other

    #? 1

    You have selected Linux

     

    4.loop

         while-loop 将运行直到表达式测试为真。will run while the expression that we test for is true.

    关键字"break" 用来跳出循环。而关键字”continue”用来不执行余下的部分而直接跳到下一个循环。

    while ...; do

    ....

    done

      

          for-loop表达式查看一个字符串列表 (字符串用空格分隔) 然后将其赋给一个变量:

    for var in ....; do

      ....

    done

    在下面的例子中,将分别打印ABC到屏幕上:

    #!/bin/sh

    for var in A B C ; do

      echo "var is $var"

    done

    下面是一个更为有用的脚本showrpm,其功能是打印一些RPM包的统计信息:

    #!/bin/sh

    # list a content summary of a number of RPM packages

    # USAGE: showrpm rpmfile1 rpmfile2 ...

    # EXAMPLE: showrpm /cdrom/RedHat/RPMS/*.rpm

    for rpmpackage in $*; do

     if [ -r "$rpmpackage" ];then

      echo "=============== $rpmpackage =============="

      rpm -qi -p $rpmpackage

     else

      echo "ERROR: cannot read file $rpmpackage"

     fi

    done

      这里出现了第二个特殊的变量$*,该变量包含了所有输入的命令行参数值。

    如果您运行showrpm openssh.rpm w3m.rpm webgrep.rpm

    此时 $* 包含了 3 个字符串,即openssh.rpm, w3m.rpm and webgrep.rpm.

     

    5. 引号

    在向程序传递任何参数之前,程序会扩展通配符和变量。这里所谓扩展的意思是程序会把通配符(比如*)替换成合适的文件名,它变量替换成变量值。为了防止程序作这种替换,您可以使用引号:让我们来看一个例子,假设在当前目录下有一些文件,两个jpg文件, mail.jpg 和tux.jpg。

     

    1.2 编译SHELL脚本

    #ch#!/bin/sh mod +x filename

     cho *.jpg ∪缓螅梢酝ü淙耄?./filename 来执行您的脚本。 【???】

      这将打印出"mail.jpg tux.jpg"的结果。

        引号 (单引号和双引号) 将防止这种通配符扩展:

    #!/bin/sh

    echo "*.jpg"

    echo '*.jpg'

      这将打印"*.jpg" 两次。

      单引号更严格一些。它可以防止任何变量扩展。双引号可以防止通配符扩展但允许变量扩展。

    #!/bin/sh

    echo $SHELL

    echo "$SHELL"

    echo '$SHELL'

      运行结果为:

    /bin/bash

    /bin/bash

    $SHELL

      最后,还有一种防止这种扩展的方法,那就是使用转义字符——反斜杆:

    echo *.jpg

    echo $SHELL

      这将输出:

    *.jpg

    $SHELL

     

    6. Here documents

    当要将几行文字传递给一个命令时,here documents(译者注:目前还没有见到过对该词适合的翻译)是一种不错的方法。对每个脚本写一段帮助性的文字是很有用的,此时如果我们四有那个 here documents就不必用echo函数一行行输出。 一个 "Here document" 以  shift by 2

      --) shift;break;; # end of options

      -*) echo "error: no such option $1. -h for help";exit 1;;

      *) break;;

    esac

    done

    echo "opt_f is $opt_f"

    echo "opt_l is $opt_l"

    echo "first arg is $1"

    echo "2nd arg is $2"

      您可以这样运行该脚本:

    cmdparser -l hello -f -- -somefile1 somefile2

      返回的结果是:

    opt_f is 1

    opt_l is hello

    first arg is -somefile1

    2nd arg is somefile2

      这个脚本是如何工作的呢?脚本首先在所有输入命令行参数中进行循环,将输入参数与case表达式进行比较,如果匹配则设置一个变量并且移除该参数。根据unix系统的惯例,首先输入的应该是包含减号的参数.

     

     

    第2部分 实例

    现在我们来讨论编写一个脚本的一般步骤。任何优秀的脚本都应该具有帮助和输入参数。并且写一个伪脚本(framework.sh),该脚本包含了大多数脚本都需要的框架结构,是一个非常不错的主意。这时候,在写一个新的脚本时我们只需要执行一下copy命令:

    cp framework.sh myscript

     然后再插入自己的函数。

      让我们再看两个例子:

    二进制到十进制的转换

      脚本 b2d 将二进制数 (比如 1101) 转换为相应的十进制数。这也是一个用expr命令进行数学运算的例子:

    #!/bin/sh

    # vim: set sw=4 ts=4 et:

    help()

    {

     cat <

    b2h -- convert binary to decimal

    USAGE: b2h [-h] binarynum

    OPTIONS: -h help text

    EXAMPLE: b2h 111010

    will return 58

    HELP

     exit 0

    }

    error()

    {

      # print an error and exit

      echo "$1"

      exit 1

    }

    lastchar()

    {

      # return the last character of a string in $rval

      if [ -z "$1" ]; then

        # empty string

        rval=""

        return

      fi

      # wc puts some space behind the output this is why we need sed:

      numofchar=`echo -n "$1" | wc -c | sed 's/ //g' `

      # now cut out the last char

      rval=`echo -n "$1" | cut -b $numofchar`

    }

    chop()

    {

      # remove the last character in string and return it in $rval

      if [ -z "$1" ]; then

        # empty string

        rval=""

        return

      fi

      # wc puts some space behind the output this is why we need sed:

      numofchar=`echo -n "$1" | wc -c | sed 's/ //g' `

      if [ "$numofchar" = "1" ]; then

        # only one char in string

        rval=""

        return

      fi

      numofcharminus1=`expr $numofchar "-" 1`

      # now cut all but the last char:

      rval=`echo -n "$1" | cut -b 0-${numofcharminus1}`

    }

    while [ -n "$1" ]; do

    case $1 in

      -h) help;shift 1;; # function help is called

      --) shift;break;; # end of options

      -*) error "error: no such option $1. -h for help";;

      *) break;;

    esac

    done

    # The main program

    sum=0

    weight=1

    # one arg must be given:

    [ -z "$1" ] && help

    binnum="$1"

    binnumorig="$1"

    while [ -n "$binnum" ]; do

      lastchar "$binnum"

      if [ "$rval" = "1" ]; then

        sum=`expr "$weight" "+" "$sum"`

      fi

      # remove the last position in $binnum

      chop "$binnum"

      binnum="$rval"

      weight=`expr "$weight" "*" 2`

    done

    echo "binary $binnumorig is decimal $sum"

     该脚本使用的算法是利用十进制和二进制数权值 (1,2,4,8,16,..),比如二进制"10"可以这样转换成十进制:

    0 * 1 + 1 * 2 = 2

      为了得到单个的二进制数我们是用了lastchar 函数。该函数使用wc –c计算字符个数,然后使用cut命令取出末尾一个字符。Chop函数的功能则是移除最后一个字符。

     

    文件循环程序

      或许您是想将所有发出的邮件保存到一个文件中的人们中的一员,但是在过了几个月

    以后,这个文件可能会变得很大以至于使对该文件的访问速度变慢。下面的 脚本rotatefile

    可以解决这个问题。这个脚本可以重命名邮件保存文件(假设为outmail)为outmail.1,

    而对于outmail.1就变成了outmail.2 等等等等...
     

    #!/bin/sh

    # vim: set sw=4 ts=4 et:

    ver="0.1"

    help()

    {

      cat <

    rotatefile -- rotate the file name

    USAGE: rotatefile [-h] filename

    OPTIONS: -h help text

    EXAMPLE: rotatefile out

    This will e.g rename out.2 to out.3, out.1 to out.2, out to out.1

    and create an empty out-file

    The max number is 10

    version $ver

    HELP

      exit 0

    }

    error()

    {

      echo "$1"

      exit 1

    }

    while [ -n "$1" ]; do

    case $1 in

      -h) help;shift 1;;

      --) break;;

      -*) echo "error: no such option $1. -h for help";exit 1;;

      *) break;;

    esac

    done

    # input check:

    if [ -z "$1" ] ; then

    error "ERROR: you must specify a file, use -h for help"

    fi

    filen="$1"

    # rename any .1 , .2 etc file:

    for n in 9 8 7 6 5 4 3 2 1; do

      if [ -f "$filen.$n" ]; then

        p=`expr $n + 1`

        echo "mv $filen.$n $filen.$p"

        mv $filen.$n $filen.$p

      fi

    done

    # rename the original file:

    if [ -f "$filen" ]; then

      echo "mv $filen $filen.1"

      mv $filen $filen.1

    fi

    echo touch $filen

    touch $filen

      这个脚本是如何工作的呢?在检测用户提供了一个文件名以后,我们进行一个9到1的循环。文件9被命名为10,文件8重命名为9等等。循环完成之后,我们将原始文件命名为文件1同时建立一个与原始文件同名的空文件。

    调试

      最简单的调试命令当然是使用echo命令。您可以使用echo在任何怀疑出错的地方打印任何变量值。这也是绝大多数的shell程序员要花费80%的时间来调试程序的原因。Shell程序的好处在于不需要重新编译,插入一个echo命令也不需要多少时间。

      shell也有一个真实的调试模式。如果在脚本"strangescript" 中有错误,您可以这样来进行调试:

    sh -x strangescript

      这将执行该脚本并显示所有变量的值。

      shell还有一个不需要执行脚本只是检查语法的模式。可以这样使用:

    sh -n your_script

      这将返回所有语法错误。 

    展开全文
  • 今天遭遇到一个问题 ...atest.sh 代码如下 #!/bin/bash dir=${PWD} echo "export PATH=/$PATH:${dir}" >> ~/.bash_profile export PATH=$PATH:${dir} 但是用sh atest.sh 怎么执行环境变量都无法生效 ...
    今天遭遇到一个问题
    写了一小段脚本想增加一个环境变量
    atest.sh
    代码如下
    #!/bin/bash
    dir=${PWD}
    echo "export PATH=/$PATH:${dir}" >> ~/.bash_profile
    export PATH=$PATH:${dir}
     
    但是用sh atest.sh 怎么执行环境变量都无法生效
    通过
    $echo PATH
    还是无法看见新增的环境变量
    但是写文件的操作还是成功了,什么原因了,查阅了很多文档。
    终于大致明白,原来sh 执行脚本,实际上执行了两个脚本,一个母shell sh ,一个子shell atest;而子shell的变量是不会在母shell中生效的。
    所以只能直接执行atest.sh
    但是必须首先修改脚本读写权限,chmode atest.sh 777
    这样执行./atest.sh就可以了
     
     
    还有一种做法,不需要chmode atest.sh 777
     
    而是直接. atest.sh
    查阅相关资料
    . 命令的作用:相当于在当前shell环境执行当前目录下的文件atest.sh。


    本文转自elbertchen 51CTO博客,原文链接:http://blog.51cto.com/linkyou/751807,如需转载请自行联系原作者
    展开全文
  • 交易过程中,发送方会将自己的UTXO(字符串,比特币区块链中能代表一定数额的比特币,使得比特币可以追踪)使用锁定脚本进行锁定,锁定接收方的地址上(也就是表示只有证明自己是接收方,才能够使用)。...
  • sh文件编写

    万次阅读 2019-04-24 09:46:55
    1.文件首行 文件第一行: .../bin/sh 符号#!用来告诉系统后面的参数是用来执行该程序的程序 脚本完成之后 chmod +x filename 保证可以使用如下语句执行 ./filename 2.注释 #开头的句子表示注释 3.变量 ...
  • sh -s 用法

    千次阅读 2020-03-09 23:01:31
    展开 1.基础用法 ... 当sh -s 后面跟的参数,从第一个非 - 开头的参数,就被赋值为子shell的$1,$2,$3.... 2.示例 (1) jiajia@jiajia-pc:~/ruby$ echo 'ls $2' | sh -s '' '-l' total 12 -rwxrwxr...
  • nohup 和 sh 或者 ./ 执行 sh文件的不同

    千次阅读 2018-03-14 15:26:16
    nohup 执行 sh 文件后,会后台创建一个线程执行sh当前线程执行,如果当前连接 关掉后,会停止 sh文件的执行
  • linux sh命令简述

    万次阅读 2020-07-03 18:00:52
    sh命令1. 可能需要的执行方式linux下执行.sh文件的方法2. 开头:#!/bin/sh3. 变量4. Shell命令和流程控制Unix命令概念:管道,重定向和backtick(反斜线)流程控制 1. 可能需要的执行方式 linux下执行.sh文件的方法 ...
  • 脚本调试sh -x xx.sh、set -x

    万次阅读 2018-07-04 10:06:02
    “-x”选项使shell执行脚本的过程中把它实际执行的每一个命令行显示出来,并且在行首显示一个”+”号。 “+”号后面显示的是经过了变量替换之后的命令行的内容,有助于分析实际执行的是什么命令。 ...
  • SH脚本入门总结

    千次阅读 2016-11-11 09:45:06
    把学到sh脚本相关知识总结如下: #!/bin/bash 注明用什么运行 #!/bin/sh  Chmod +xfilename 使得脚本有权限执行 变量名不需要定义,直接赋值使用双引号,lua脚本和sh脚本都是这样的,也可以使用语句赋值,...
  • set JAVA_OPTS='-Xms64 -Xmx512' 上面无效的话这样写: declare -x JAVA_OPTS="-Xms128m -Xmx256" "declare -x"一定要,不然就会报-x指令无效,还有后面的引号也要注意加上
  • .sh文件语法

    万次阅读 2018-03-01 20:08:38
    这个例子中我们使用/bin/sh来执行程序。当编写脚本完成时,如果要执行该脚本,还必须使其可执行。要使编写脚本可执行:编译 chmod +x filename 这样才能用./filename 来运行 2 注释进行shell编程时, 以#开头的...
  • nohup sh xxx.sh &>/dev/null &

    千次阅读 2019-08-17 17:44:47
    nohup sh xxx.sh &>/dev/null & 或者其它类似写法 nohup ./xxx [args] &>/dev/null & 这个命令的作用是:后台运行进程xxx并将标准输出和标准错误流重定向到linux的空设备 下面对于命令中的...
  • sh 脚本格式

    千次阅读 2010-09-29 17:18:00
    这个例子中我们使用/bin/sh来执行程序。  当编辑好脚本时,如果要执行该脚本,还必须使其可执行。  要使脚本可执行:  编译 chmod +x filename 这样才能用./filename 来运行 例如: ...
  • 第一步安装libevent成功,后面解压fastdFS(版本跟博客说的不一致),解压后按照博文说的去配置 vim make.sh ,配置好后执行 “./make.sh C_INCLUDE_PATH=/home/users/wangyanpei/libevent-2.0.21/include LIBRARY_...
  • 先说下我遇到这个情况的背景: windows上写了sh脚本,放到linux 上跑 通过:set ff 查看脚本格式 fileformat=dos 如果不是unix 就通过:set ff=unix 设置...第二个问题是我启动jar包的最后面加了; 去掉就好了...
  • catalina.sh详解

    千次阅读 2016-09-20 08:17:13
    catalina.sh详解 1 - 概述 脚本catalina.sh用于启动和关闭tomcat服务器,是最关键的脚本 另外的脚本startup.sh和shutdown.sh都是使用不同的参数调用了该脚本 该脚本的使用方法如下(引自该脚本本身): ...
  • Linux中执行.sh脚本,异常/bin/sh^M: bad interpreter: No such file or directory。 最快的解决方案:dos2unix myshell.sh分析:这是不同系统编码格式引起的:windows系统中编辑的.sh文件可能有不可见字符,...
  • sh_脚本语法

    万次阅读 2012-01-04 12:56:24
    这个例子中我们使用/bin/sh来执行程序。 当编写脚本完成时,如果要执行该脚本,还必须使其可执行。 要使编写脚本可执行: 编译 chmod +x filename 这样才能用./filename 来运行 2 注释 进行shell编程
  • linux 下 sh 的使用

    千次阅读 2015-02-28 14:32:40
    Linux系统中,虽然有各种各样的图形化接口工具,但是sell仍然是一个非常灵活的工具。Shell不仅仅是命令的收集,而且是一门非常棒的编程语言。您可以通过使用shell使大量的任务自动化,shell特别擅长系统管理任务,...
  • 一、使用背景 鉴于业务需求,需要编写一个脚本文件,用于不间断的获取一些信息。...touch test.sh(2)编写test.sh 文件vim test.sh //此时开始编写 i //进入编写模式//下面是.sh文件内容 #!/bin/bash
  • build.sh脚本文件 #!/bin/bash # 1.该行是如果出现错误,就退出脚本执行 set -e # ---设置基本环境变量start--------------------- export LC_ALL=en_US.UTF-8 # 1. BASH_SOURCE[0]等价于BASH_SOURCE,取得当前...
  • 管道符使用方法,du -sh

    千次阅读 2017-03-03 17:32:11
    管道符|: lvs | grep 名字,必须grep的后面 du -sh 的使用方法: du -sh 查看整个文件夹大小 du -sh * :分别显示每个文件夹下面的文件夹大小
  • sh脚本语法_基础

    万次阅读 多人点赞 2012-04-25 10:32:29
    这个例子中我们使用/bin/sh来执行程序。 当编写脚本完成时,如果要执行该脚本,还必须使其可执行。 要使编写脚本可执行: 编译 chmod +x filename 这样才能用./filename 来运行 2 注释 进行shell编程时,...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 213,205
精华内容 85,282
关键字:

在sh后面加