zoukankan      html  css  js  c++  java
  • Linux Shell笔记

    echo -e包含转义序列的字符串

    echo -e "1	2	3"

    每种颜色都有对应的颜色码,比如:重置=0,黑色=30,红色=31,绿色=32,黄色=33,蓝色=34,洋红=35,青色=36,白色=37。

    e[1;31将颜色设为红色,e[0m将颜色重新置回

    echo -e "e[1;31m This is red text e[0m"

    export命令用来设置环境变量。至此以后,从当前shell脚本执行的任何程序都会继承这个变量。常用环境变量:HOME、PWD、USER、UID、SHELL等。

    PATH就是其中之一,如果需要在PATH中添加一条新路径,可以使用

    export PATH="$PATH:/home/user/bin"

    常用变量技巧

    1.获得字符串长度

    $ var=1234567890
    $ echo ${#var}

    2.识别当前的shell版本

    $ echo $SHELL

    3.检查是否为超级用户

    if [ $UID -ne 0 ]; then
        echo Non root user. Please run as root.
    else
        echo "Root user"
    fi

    4.修改Bash提示字符串(username@hostname:~$)

    slynux@localhost: ~$ PS1="PROMPT>"
    PROMPT> Type commands here

    数学运算

    可以利用let、(())和[]执行基本的算术操作。

    自加操作 $ let no++

    自减操作 $ let no--

    简写形式 了let no+=6

    result=$[ no1 + no2 ] 也可以使用$前缀 result=$[ $no1 + 5 ]

    result=$(( no1 + 50 ))

    result=`expr 3 + 4`

    result=$(expr $no1 + 5)

    以上这些方法只能用于整数运算,而不支持浮点数。

    bc是一个用于数学运算的高级工具。

    设定小数精度(数值范围)

    $ echo "scale=2;3/8" | bc
    0.37

    进制转换

    no=100
    echo "obase=2;$no" | bc
    1100100
    
    no=1100100
    echo "obase=10;ibase=2;$no" | bc
    100

    计算平方以及平方根

    echo "sqrt(100)" | bc
    echo "10^10" | bc

    可以使用tee一方面将数据重定向到文件,另一方面还可以提供一份重定向数据的副本作为后续命令的stdin。

    默认情况下,tee命令将会将文件覆盖,-a选项,可以用于追加内容。

    $ cat a* | tee -a out.txt | cat -n

     将文件重定向到命令

    $ cmd < file

    重定向脚本内部的文本块

    #!/bin/bash
    cat <<EOF>log.txt
    LOG FILE HEADER
    This is a test log file
    Function: System statistics
    EOF

    在单行中使用一列值来定义一个数组

    array_var=(1 2 3 4 5 6)

    还可以将数组定义成一组索引-值(index-value pair)

    array_var[0]="test1"
    array_var[1]="test2"
    array_var[2]="test3"
    array_var[3]="test4"
    array_var[4]="test5"
    array_var[5]="test6"

    打印特定索引的数组元素内容:

    $ echo ${array_var[0]}
    test1
    
    index=5
    $ echo ${array_var[$index]}
    test6

    以清单形式打印出数组中的所有值:

    $ echo ${array_var[*]}
    test1 test2 test3 test4 test5 test6

    也可以使用:

    $ echo ${array_var[@]}
    test1 test2 test3 test4 test5 test6

    打印数组长度(即数组中原书的个数):

    $ echo ${#array_var[*]}
    6

    定义关联数组

    $ declare -A ass_array

    将元素添加到关联数组

    $ ass_array=([index1]=val1 [index2]=val2)
    $ ass_array[index1]=val1
    $ ass_array[index2]=val2

    列出数组索引

    $ echo ${!array_var[*]}

    也可以使用:

    $ echo ${!array_var[@]}

    对于普通数组,这个方法同样可行。

    创建别名

    $ alias rm='cp $@ ~/backup; rm $@'

    为了使别名设置一直保持作用,可以将它放入~/.bashrc文件中。

    $ echo 'alias cmd="command seq"' >> ~/.bashrc

    字符对命令实施转义,使我们可以执行原本的命令,而不是别名替身。

    $ command

    获取终端的行数和列数:

    tput cols
    tput lines

    打印当前终端名:

    tput longname

    将光标移动到方位(100,100)处:

    tput cup 100 100

    设置终端背景色:

    tput setb no

    其中,no可以在0-9之间取值。将文本前景色设为白色:

    tput setf 9

    设置文本样式为粗体:

    tput bold

    设置下划线的起止:

    tput smul
    tput rmul

    删除当前光标位置到行尾的所有内容:

    tput ed

    在输入密码的时候,不能让输入的内容显示出来。

    #!/bin/sh
    #Filename: password.sh
    
    echo -e "Enter password: "
    stty -echo
    read password
    stty echo
    echo
    echo Password read.

    打印纪元时:

    $ date --date "Thu Nov 18 08:07:21 IST 2010" +%s
    1290047841

    使用格式串结合+作为date命令的参数,打印出对应格式的日期。

    $ date "+%d %B %Y"
    31 December 2015

    设置日期和时间:

    # date -s "格式化的日期字符串"

    ex:

    # date -s "21 June 2009 11:01::22"
    Sun Jun 21 11:01:22 CST 2009

    检查一组命令花费的时间

    #!/bin/bash
    #文件名:time_take.sh
    
    start=$(date +%s)
    commands;
    statements;
    
    end=$(date +%s)
    difference=$(( end - start ))
    echo Time taken to execute commands is $difference seconds.

    使用tput和sleep从0开始计数到40:

    #!/bin/bash
    #Filename: sleep.sh
    
    echo -n Count:
    tput sc
    
    count=0;
    while true;
    do
    if [ $count -lt 40 ];
    then let count++;
    sleep 1;
    tput rc
    tput ed
    echo -n $count;
    else exit 0;
    fi
    done

    调试脚本

    set -x: 在执行时显示参数和命令。

    set +x: 禁用调试。

    set -v: 当命令进行读取时显示输入。

    set +v: 禁止打印输入。

    #!/bin/bash
    #Filename: debug.sh
    
    for i in {1..6}
    do
    set -x
    echo $i
    set +x
    done
    echo "Script executed"

     可以通过传递_DEBUG环境变量来建立自定义格式显示的调试信息

    在Bash中,命令':'告诉shell不要进行任何操作。

    #!/bin/bash
    
    function DEBUG()
    {
        [ "$_DEBUG" == "on" ] && $@ || :
    }
    
    for i in {1..10}
    do
        DEBUG echo $i
    done
    $ _DEBUG=on ./script.sh

    函数定义

    fname()
    {
        echo $1,  $2;         # 访问参数1和参数2
        echo "$@";            # 以列表的方式一次性打印所有参数
        echo "$*";            # 类似于$@,但是参数被作为单个实体
        return 0;             # 返回值
    }

    返回值被称为退出状态,用于分析命令执行成功与否。

    #!/bin/bash
    #Filename: success_test.sh
    
    CMD="command"  # command指你要检测退出与否的目标命令
    status
    $CMD
    if [ $? -eq 0 ]; then
        echo "$CMD executed successfully"
    else
        echo "$CMD terminated unsuccessfully"
    fi

    读取命令序列输出

    子shell(subshell)方式。

    子shell本身就是独立的进程。可以使用()操作符来定义一个子shell:

    cmd_output=$(ls | cat -n)
    echo $cmd_output

    反引用(back-quote)方式。

    cmd_output=`COMMANDS`

    假如我们使用子shell或反引用的方式将命令的输出读入一个变量中,可以将它放入双引号中,以保留空格和换行符( )。

    $ cat text.txt
    1
    2
    3
    
    $ out=$(cat text.txt)
    $ echo $out
    1 2 3  # 丢失了换行符 
    
    
    $ out="$(cat text.txt)"
    echo $out
    1
    2
    3

    read命令

    从输入中读取n个字符并存入变量variable_name:

    $ read -n 2 var
    $ echo $var

    不回显(non-echoed)的方式读取密码:

    read -s var

    显示提示信息:

    read -p "Enter input:" var

    在特定时限内读取输入:

    $ read -t 2 var

    用定界符结束输入行:

    $ read -p ":" var
    hello:   #var被设置为hello

     IFS是存储定界符的环境变量

    #!/bin/bash
    #用途:演示IFS的用法
    
    line="root:x:0:0:root:/root:/bin/bash"
    oldIFS=$IFS;
    IFS=":"
    count=0
    for item in $line;
    do
        [ $count -eq 0 ] && user=$item;
        [ $count -eq 6 ] && shell=$item;
        let count++
    done;
    IFS=$oldIFS
    echo $user's shell is $shell;

    for循环

    for i in {a..z}; do actions; done;
    for((i=0;i<10;i++))
    {
        commands;    #使用变量$i
    }

    while循环

    while condition
    do
    commands;
    done

    until循环

    x=0;
    until [ $x -eq 9 ];
    do let x++; echo $x;
    done

    if条件

    if condition;
    then
        commands;
    fi

    else if 和 else:

    if condition;
    then
        commands;
    elif condition;
    then
        commands
    else
        commands
    fi

    逻辑运算符

    [ condition ] && action;   # 如果condition为真,则执行action
    [ condition ] || action;     # 如果condition为假,则执行action

    算术比较

    [ $var -eq 0 ] or [ $var -ne 0 ]

    -gt:   大于

    -lt:  小于

    -ge:  大于或等于

    -le:   小于或等于

     多条件判断

    [ $var1 -ne 0 -a $var2 -gt 2 ]     # 使用逻辑与 -a
    [ $var1 -ne 0 -o $var2 -gt 2 ]      # 逻辑或 -o

    文件系统相关测试

    [ -f $file_var ];   如果给定的变量包含正常的文件路径和文件名,则返回真。
    [ -x $var ];      如果给定的变量包含的文件可执行,则返回真。
    [ -d $var ];    如果给定的变量包含的是目录,则返回真。
    [ -e $var ];    如果给定的变量包含的文件存在,则返回真。
    [ -c $var ];    如果给定的变量包含的是一个字符设备文件的路径,则返回真。
    [ -b $var ];    如果给定的变量包含的是一个块设备文件的路径,则返回真。
    [ -w $var ];    如果给定的变量包含的文件可写,则返回真。
    [ -r $var ];    如果给定的变量包含的文件可读,则返回真。
    [ -L $var ];    如果给定的变量包含的是一个符号链接,则返回真。

    字符串比较

    [[ $str = $str2 ]]        当str1等于str2时,返回真。
    [[ $str1 == $str2 ]]   检查字符串是否相等的,另一种写法。
    [[ $str1 != $str2 ]]    如果str1和str2不相同,则返回真。
    [[ $str1 > $str2 ]]      如果str1的字母序比str2大,则返回真。
    [[ $str1 < $str2 ]]     如果str1的字母序比str2小,则返回真。
    [[ -z $str1 ]]              如果str1包含的是空字符串,则返回真。
    [[ -n $str1 ]]              如果str1包含的是非空字符串,则返回真。

    cat

    读取文件并拼接数据,-被作为来自stdin文本的文件名

    $ echo 'Text through stdin' | cat - file.txt

    压缩连续的空白行

    $ cat -s file

    也可以用tr移除空白行:

    $ cat multi_blanks.txt | tr -s '
    '

    -T选项能够将制表符标记成^|。

    $ cat -T file

    -n选项会在输出的每一行内容前加上行号。

    $ cat -n file

    find

    -name选项,根据文件名或正则表达式匹配搜索

    $ find /home/slynux -name "*.txt" -print

    -iname选项,忽略字母大小写,作用与-name类似。

    $ find . -iname "example*" -print

    匹配多个条件中的一个

    $ find . ( -name "*.txt" -o -name "*.pdf" ) -print

    -path选项,将文件路径作为一个整体进行匹配

    $ find /home/users -path "*slynux*" -print

    -regex选项,基于正则表达式来匹配文件路径。

    $ find . -regex ".*(.py|.sh)$"

    -iregex选项,忽略正则表达式的大小写

    $ find . -iregex ".*(.py|.sh)$"

    否定参数"!"

    $ find . ! -name "*.txt" -print

    -maxdepth指定最大深度,-mindepath指定最小深度

    $ find . -maxdepth 1 type f -print
    $ find . -mindepth 2 -type f -print

    -type可以对文件搜索进行过滤

    $ find . -type d -print

    根据文件时间进行搜索

    -atime    用户最近一次访问文件的时间

    -mtime    文件内容最近一次被修改的时间

    -ctime     文件源数据最后一次改变的时间

    计量单位是“天”,这些整数值还可以带有-或+:-表示小于,+代表大于。

    $ find . -type f -atime -7 -print
    $ find . -type f -atime +7 -print

    -amin    访问时间

    -mmin   修改时间

    -cmin     变化时间

    计量单位是“分钟”

    $ find . -type f -amin +7 -print

    -newer参数,可以指定一个用于比较时间戳的参考文件,然后找出比参考文件新的所有文件

    $ find . -type f -newer file.txt -print

    -size参数,基于文件大小的搜索

    $ find . -type f -size +2k    # 大于2KB的文件
    
    $ find . -type f -size -2k     # 小于2KB的文件
    
    $ find . -type f -size 2k      # 等于2KB的文件
  • 相关阅读:
    win10- *.msi 软件的安装,比如 SVN安装报2503,2502
    Java-byte[]与16进制字符串互转
    log4j 日志脱敏处理 + java properties文件加载
    CentOS7编译安装SVN(subversion1.9.7)
    Samba安装与配置
    php 实现redis发布订阅消息及时通讯
    PHP中使用ActiveMQ实现消息队列
    sphinx 配置文件全解析
    nginx和apache 配置
    php实现汉诺塔问题
  • 原文地址:https://www.cnblogs.com/edward2013/p/5099874.html
Copyright © 2011-2022 走看看