zoukankan      html  css  js  c++  java
  • shell 命令

    声明变量

    name='hello world'
    

    使用变量

    echo ${name}
    

    设置只读变量

    readonly name
    

    删除变量(不能删除只读变量)

    name2='name2'
    unset name2
    

    设置全局变量

    name='name2'
    export $name
    

    用户输入

    read [-pt] variable 
    
    选项与参数:
    -p :后面可以接提示字符
    -t :后面可以接等待的『秒数!』这个比较有趣~不会一直等待使用者啦!
    
    $ read -p "Your name:" name
    Your name:Wang
    
    
    $ echo $name
    Wang
    

    声明变量类型

    declare [-aixrp] variable 
    
    选项与参数:
    -a :将后面名为variable 的变数定义成为阵列(array) 类型
    -i :将后面名为variable 的变数定义成为整数数字(integer) 类型
    -x :用法与export 一样,就是将后面的variable 变成环境变数;+x 可以取消全局变量哦
    -r :将变数设定成为readonly 类型,该变数不可被更改内容,也不能unset
    -p :查看某个变量的类型
    
    $ declare -i a
    $ a=100+20
    $ echo $a
    120
    
    

    字符串拼接

    text1='Wang'
    test2="I love ${text1}"       #注意要用双引号
    echo ${text2}
    

    字符串长度

    echo ${#text2}
    

    截取字符串(从索引1开始,截取3个字符)

    注意,是从某个索引开始,截取几个!而不是截取到几。

    aa="012345"
    echo ${aa:1:3}   # 结果:123
    echo ${aa:3:1}   # 结果:3
    

    声明数组

    数组以圆括号定义,内部的元素以空格分隔

    array=('I' 'am' 'beautiful')
    

    读取数组

    数组下标以0开始,表示第一个元素

    echo ${array[0]}
    

    修改数组元素

    array[0]='He'
    

    获取所有元素 @

    echo ${array[@]}
    

    数组长度

    整个数组长度

    length=${#array[@]}
    

    单个元素长度

    echo ${#array[1]}
    

    脚本传参

    建一个脚本文件test.sh

    echo "0 is the file itself: ${0}"
    echo "1 is from the cmd :   ${1}"
    

    执行:

     ./test.sh arg1
    

    结果:

    0 is the file itself: ./test.sh
    1 is from the cmd :   arg1
    
    参数处理 说明
    $# 传递到脚本的参数个数
    $* 用一个字符串表示所有参数
    $$ 脚本运行的当前进程ID号
    $! 后台运行的最后一个进程的ID号
    $@ 用数组表示所有参数。
    $- 显示Shell使用的当前选项,与set命令功能相同。
    $? 显示最后命令的退出状态。0表示没有错误,其他任何值表明有错误。
    ${num} ${0} 代表脚本本身; ${1},${2},${3}...则代表第1,2,3个参数; 也可以不加{}

    修改test.sh如下

    echo "0 is the file itself: ${0}"
    echo "1 is from the cmd :   ${1}"
    echo "2 is from the cmd :   ${2}"
    echo "args number: $#"
    echo "args is: $*"
    echo "args are: $@"
    echo "current pid is: $$"
    echo "execute state: $?"
    

    执行:

    $ ./test.sh arg1 arg2
    

    结果:

    $ ./test.sh arg1 arg2
    0 is the file itself: ./test.sh
    1 is from the cmd :   arg1
    2 is from the cmd :   arg2
    args number: 2
    args is: arg1 arg2
    args are: arg1 arg2
    current pid is: 30204
    execute state: 0
    

    运算符

    算数运算

    运算符 说明 举例
    + 加法 expr $a + $b 结果为 30。
    - 减法 expr $a - $b 结果为 -10。
    * 乘法 expr $a * $b 结果为 200。
    / 除法 expr $b / $a 结果为 2。
    % 取余 expr $b % $a 结果为 0。
    = 赋值 a=$b 将把变量 b 的值赋给 a。
    == 相等。用于比较两个数字,相同则返回 true。 [ $a == $b ] 返回 false。
    != 不相等。用于比较两个数字,不相同则返回 true。 [ $a != $b ] 返回 true。

    例子:

    a=10
    b=20
    
    val=`expr $a + $b`
    echo "a + b : $val"
    
    val=`expr $a - $b`
    echo "a - b : $val"
    
    val=`expr $a * $b`
    echo "a * b : $val"
    
    val=`expr $b / $a`
    echo "b / a : $val"
    
    val=`expr $b % $a`
    echo "b % a : $val"
    
    if [ $a == $b ]
    then
       echo "a 等于 b"
    fi
    if [ $a != $b ]
    then
       echo "a 不等于 b"
    fi
    

    注意`expr 表达式` 是反引号,不是单引号。

    注意符号 + 左右一定要加空格

    乘号(*)前边必须加反斜杠()才能实现乘法运算;

    条件表达式也要空格:

    例如: [$a==$b] 是错误的,必须写成 [ $a == $b ]
    

    关系运算符

    关系运算符只支持数字,不支持字符串,除非字符串的值是数字。

    下表列出了常用的关系运算符,假定变量 a 为 10,变量 b 为 20:

    运算符 说明 举例
    -eq 检测两个数是否相等,相等返回 true。 [ $a -eq $b ] 返回 false。
    -ne 检测两个数是否不相等,不相等返回 true。 [ $a -ne $b ] 返回 true。
    -gt 检测左边的数是否大于右边的,如果是,则返回 true。 [ $a -gt $b ] 返回 false。
    -lt 检测左边的数是否小于右边的,如果是,则返回 true。 [ $a -lt $b ] 返回 true。
    -ge 检测左边的数是否大于等于右边的,如果是,则返回 true。 [ $a -ge $b ] 返回 false。
    -le 检测左边的数是否小于等于右边的,如果是,则返回 true。 [ $a -le $b ] 返回 true。

    关系运算符实例如下:

    a=10
    b=20
    
    if [ $a -eq $b ]
    then
       echo "$a -eq $b : a 等于 b"
    else
       echo "$a -eq $b: a 不等于 b"
    fi
    if [ $a -ne $b ]
    then
       echo "$a -ne $b: a 不等于 b"
    else
       echo "$a -ne $b : a 等于 b"
    fi
    if [ $a -gt $b ]
    then
       echo "$a -gt $b: a 大于 b"
    else
       echo "$a -gt $b: a 不大于 b"
    fi
    if [ $a -lt $b ]
    then
       echo "$a -lt $b: a 小于 b"
    else
       echo "$a -lt $b: a 不小于 b"
    fi
    if [ $a -ge $b ]
    then
       echo "$a -ge $b: a 大于或等于 b"
    else
       echo "$a -ge $b: a 小于 b"
    fi
    if [ $a -le $b ]
    then
       echo "$a -le $b: a 小于或等于 b"
    else
       echo "$a -le $b: a 大于 b"
    fi
    

    布尔运算符

    下表列出了常用的布尔运算符,假定变量 a 为 10,变量 b 为 20:

    运算符 说明 举例
    ! 非运算,表达式为 true 则返回 false,否则返回 true。 [ ! false ] 返回 true。
    -o 或运算,有一个表达式为 true 则返回 true。 [ $a -lt 20 -o $b -gt 100 ] 返回 true。
    -a 与运算,两个表达式都为 true 才返回 true。 [ $a -lt 20 -a $b -gt 100 ] 返回 false。

    逻辑运算符

    以下介绍 Shell 的逻辑运算符,假定变量 a 为 10,变量 b 为 20:

    运算符 说明 举例
    && 逻辑的 AND [[ $a -lt 100 && $b -gt 100 ]] 返回 false
    || 逻辑的 OR [[ $a -lt 100 || $b -gt 100 ]] 返回 true

    字符串运算符

    下表列出了常用的字符串运算符,假定变量 a 为 "abc",变量 b 为 "efg":

    运算符 说明 举例
    == 检测两个字符串是否相等,相等返回 true。 [ $a == $b ] 返回 false。
    != 检测两个字符串是否相等,不相等返回 true。 [ $a != $b ] 返回 true。
    -z 检测字符串长度是否为0,为0返回 true。 [ -z $a ] 返回 false。
    -n 检测字符串长度是否不为 0,不为 0 返回 true。 [ -n "$a" ] 返回 true。
    $ 检测字符串是否为空,不为空返回 true。 [ $a ] 返回 true。

    文件测试运算符

    文件测试运算符用于检测 Unix 文件的各种属性。

    属性检测描述如下:

    操作符 说明
    -b file 检测文件是否是块设备文件,如果是,则返回 true。 [ -b $file ] 返回 false。
    -c file 检测文件是否是字符设备文件,如果是,则返回 true。 [ -c $file ] 返回 false。
    -d file 检测文件是否是目录,如果是,则返回 true。 [ -d $file ] 返回 false。
    -f file 检测文件是否是普通文件(既不是目录,也不是设备文件),如果是,则返回 true。 [ -f $file ] 返回 true。
    -g file 检测文件是否设置了 SGID 位,如果是,则返回 true。 [ -g $file ] 返回 false。
    -k file 检测文件是否设置了粘着位(Sticky Bit),如果是,则返回 true。 [ -k $file ] 返回 false。
    -p file 检测文件是否是有名管道,如果是,则返回 true。 [ -p $file ] 返回 false。
    -u file 检测文件是否设置了 SUID 位,如果是,则返回 true。 [ -u $file ] 返回 false。
    -r file 检测文件是否可读,如果是,则返回 true。 [ -r $file ] 返回 true。
    -w file 检测文件是否可写,如果是,则返回 true。 [ -w $file ] 返回 true。
    -x file 检测文件是否可执行,如果是,则返回 true。 [ -x $file ] 返回 true。
    -s file 检测文件是否为空(文件大小是否大于0),不为空返回 true。 [ -s $file ] 返回 true。
    -e file 检测文件(包括目录)是否存在,如果是,则返回 true。 [ -e $file ] 返回 true。

    其他检查符:

    • -S: 判断某文件是否 socket。
    • -L: 检测文件是否存在并且是一个符号链接。

    实例:

    file="/var/www/runoob/test.sh"
    if [ -r $file ]
    then
       echo "文件可读"
    else
       echo "文件不可读"
    fi
    if [ -w $file ]
    then
       echo "文件可写"
    else
       echo "文件不可写"
    fi
    

    echo

    显示字符

    echo "Hello world!"
    

    显示执行命令结果

    注意用反引号

    echo `ls`    # 显示的结果可能没有格式,在同一行
    
    echo "`ls`"  # 按照格式显示出来,有换行
    

    显示原字符(不转义)

    使用单引号,可以直接显示原字符串

    $ echo '${name}
    '
    ${name}
    
    

    激活转义 -e

    echo -e可以将转义字符显示

    $ echo -e "abc 
     def"
    abc
     def
    

    • 删除前一个字符;
    •c 最后不加上换行符号;
    •f 换行但光标仍旧停留在原来的位置;
    • 换行且光标移至行首;
    • 光标移至行首,但不换行;
    • 插入tab;
    •v 与f相同;
    • 插入字符;

    不换行显示

    echo -n 可以不换行继续显示

    $ echo -n 'a' ; echo -n 'b' ; echo -n 'c'
    abc
    

    定向至文件

    echo <result> > file

    $ echo "`ls`" > ls.txt
    $ cat ls.txt
    a.txt
    dump_ftrace/
    Logs/
    Monkey_Doc_Tools/
    src/
    test.txt
    tmp/
    utility/
    

    printf

    printf是一个输出命令,默认不换行

    $ printf "hello " ; printf "world"
    hello world
    

    格式化打印

    %s 代表字符串,%d 代表整数,%f 代表小数;

    $ printf "%s is a %dkg dog" "lili" 6
    lili is a 6kg dog
    

    %-10s 指一个宽度为10个字符(-表示左对齐,没有则表示右对齐),任何字符都会被显示在10个字符宽的字符内,如果不足则自动以空格填充,超过也会将内容全部显示出来。

    %.2f 指格式化为小数,其中.2指保留2位小数。

    $ printf "%-6s is a %.4fkg dog" "lili" 6
    lili   is a 6.0000kg dog
    

    test

    test用于判断条件是否成立。

    $ if test 1 == 2
    > then echo "equal"
    > else echo "not"
    > fi
    not
    

    也可以写成:

    $ if [ 1 == 2 ]
    > then echo 'equal'
    > else echo 'not equal'
    > fi
    not equal
    
    

    流程控制

    if then

    if <condition> ; then <steps> ; fi

    fiif反写的,代表着语句结束

    if condition
    then
        command1 
        command2
        ...
        commandN 
    fi
    

    写成一行:

    if [ condition ]; then steps; fi
    

    eg.

    $ if [ 1 == 1 ]; then echo "equal" ;fi
    equal
    

    if then else

    if [ condition ]
    then
    	command
    elif [ condition ]    # 可以多个elif then语句,也可以不加elif then 语句
    then
    	command 
    ...
    else
    	command
    fi
    

    eg.

    $ if [ 1 == 2 ]; then echo "equal" ; else echo "Not equal"; fi
    Not equal
    

    for 循环

    格式:

    for var in item1 item2 ... itemN
    do
        command1
        command2
        ...
        commandN
    done
    
    *****************************************
    for ((init,value,))
    do
    	command
    done
    

    eg.

    $ for x in 1 2 3 4 5
    > do
    > printf ${x}
    > done
    12345
    
    $ n=5
    $ for ((i=1;i<=$n;i++))
    > do
    > echo $i
    > done
    1
    2
    3
    4
    5
    
    

    while 循环

    格式:

    while condition
    do
        command
    done
    

    eg.

    $ a=1
    $ while (($a <= 5)); do echo $a ; let "a++"; done
    1
    2
    3
    4
    5
    

    while 无限循环

    while true
    do
    	command
    done
    

    until 循环

    until 循环与 while 循环在处理方式上刚好相反。until 循环执行一系列命令直至条件为 true 时停止。

    语法:

    until condition
    do
        command
    done
    

    实例:

    $ a=1
    $ until [ $a == 5 ]
    > do echo $a
    > let "a++"
    > done
    1
    2
    3
    4
    

    case

    case语句为多选择语句。可以用case语句匹配一个值与一个模式,如果匹配成功,执行相匹配的命令。case语句格式如下:

    case 值 in
    模式1)
        command1
        command2
        ...
        commandN
        ;;
    模式2)
        command1
        command2
        ...
        commandN
        ;;
    esac
    

    实例:

    $ name="wang"
    $ case $name in
    > "wang")
    >   echo "wang"
    > ;;
    > "zhang")
    >   echo "zhang"
    > ;;
    > esac
    wang
    

    使用*号:

    $ case "haha" in  "wang")   echo "wang"; ;; "zhang")   echo "zhang" ;; *) echo "I don't know what you inputed" ;; esac
    I don't know what you inputed
    
    

    函数

    [ function ]是可选的,可写可不写,如果没有返回值,则默认返回最后一个命令的结果,return后跟数值n(0-255)

    [ function ] funname [()]
    
    {
        action;
        [return int;]
    }
    

    实例:

    $ hello(){
    > echo "hello world"
    > }
    
    
    $ hello
    hello world
    

    实例2:返回值

    # 定义函数
    $ hello(){
    > echo "recv first arg if $1"
    > echo "recv tenth arg is ${10}"
    > echo "the sum of $1 and ${10} is $(($1+${10}))"
    > return $(($1+${10}))
    > }
    
    # 传参
    $ hello 1 2 3 4 5 6 7 8 9 10
    
    # 结果:
    recv first arg if 1
    recv tenth arg is 10
    the sum of 1 and 10 is 11
    
    # 使用 $? 获取返回值:
    $ echo $?
    11
    
    
    参数处理 说明
    $# 传递到脚本或函数的参数个数
    $* 以一个单字符串显示所有向脚本传递的参数
    $$ 脚本运行的当前进程ID号
    $! 后台运行的最后一个进程的ID号
    $@ 与$*相同,但是使用时加引号,并在引号中返回每个参数。
    $- 显示Shell使用的当前选项,与set命令功能相同。
    $? 显示最后命令的退出状态。0表示没有错误,其他任何值表明有错误。

    输入输出重定向

    命令 说明
    command > file 将输出重定向到 file。
    command < file 将输入重定向到 file。
    command >> file 将输出以追加的方式重定向到 file。
    n > file 将文件描述符为 n 的文件重定向到 file。
    n >> file 将文件描述符为 n 的文件以追加的方式重定向到 file。
    n >&m 将输出文件 m 和 n 合并。
    n <&m 将输入文件 m 和 n 合并。
    << tag 将开始标记 tag 和结束标记 tag 之间的内容作为输入。

    输出重定向:

    $ ls > ls.txt
    
    $ cat ls.txt
    ~$Stability_Basic.xlsx
    22gis/
    book/
    BUGFIX_622/
    BUGFIX_622.7z
    chrome.lnk*
    CNT-CATS-PLAN-Precondition_definition.xlsx
    delUpdate.lnk*
    desktop.ini
    django.md
    
    

    追加到文件:

    $ ipconfig >> ls.txt
    
    zhongtao.wang@GG678S2 MINGW64 ~/Desktop
    $ cat ls.txt
    ~$Stability_Basic.xlsx
    22gis/
    book/
    BUGFIX_622/
    BUGFIX_622.7z
    chrome.lnk*
    CNT-CATS-PLAN-Precondition_definition.xlsx
    delUpdate.lnk*
    desktop.ini
    django.md
    
    Windows IP Configuration
    
    
    Ethernet adapter Ethernet:
    
       Media State . . . . . . . . . . . : Media disconnected
       Connection-specific DNS Suffix  . : cnt01.local
    
    Unknown adapter Local Area Connection:
    
       Media State . . . . . . . . . . . : Media disconnected
       Connection-specific DNS Suffix  . :
    
    Wireless LAN adapter Local Area Connection* 2:
    
       Media State . . . . . . . . . . . : Media disconnected
       Connection-specific DNS Suffix  . :
    
    Wireless LAN adapter Local Area Connection* 1:
    
    

    标准输入输出:

    一般情况下,每个 Unix/Linux 命令运行时都会打开三个文件:

    • 标准输入文件(stdin):stdin的文件描述符为0,Unix程序默认从stdin读取数据。
    • 标准输出文件(stdout):stdout 的文件描述符为1,Unix程序默认向stdout输出数据。
    • 标准错误文件(stderr):stderr的文件描述符为2,Unix程序会向stderr流中写入错误信息。

    将错误重定向到文件:

    command 2 > file 
    command 2 >> file
    

    stdout 和 stderr 合并后重定向到文件:

    command > file 2>&1
    

    /dev/null 文件

    /dev/null 是一个特殊的文件,写入到它的内容都会被丢弃

    command > /dev/null
    

    屏蔽 stdout 和 stderr

    command > /dev/null 2>&1
    

    导入文件

    . filename   # 注意点号(.)和文件名中间有一空格
    或
    source filename
    

    实例:

    t1.sh

    name="Elias"
    

    t2.sh

    . ./t1.sh
    name2=$name
    echo $name2
    

    执行:

    $ ./t2.sh
    Elias
    

    其他内容:

    括号含义

    ()

    1.子进程

    a=0
    (a=1;b=2;echo $a) # 子进程内输出a为1
    echo $a # 主进程,输出a为0
    

    2.格式为 $(command),相当于 command。shell遇到此格式,会先执行 command 命令,得到标准输出,再将此输出放回到原来命令。

    SCRIPTPATH=$(dirname $0)  # sh脚本的相对目录
    

    3.数组

    数组用括号来表示,元素用"空格"符号分割开。

    array=(1 2 3 4)
    

    (())

    1.表达式 $((exp)),其中exp只要符合C语言规则的运算符即可,包括加减乘除、+=<=>=等。

    进行不同进位(如二进制、八进制、十六进制)运算时,输出结果会全都自动转化成十进制。

    echo $((2*2+(1-2))) # 输出3
    a=1
    echo $((a++)) # 输出2,且从此之后a=2
    

    2.更新变量值

    ((exp))中可以对变量进行定义或重新赋值,且之后脚本全部有效(不是像()那样只在子进程有效)。

    a=1
    ((a=2))
    echo $a # 输出2
    

    3.算数比较

    ((exp))中可以进行算术比较(不能进行字符串比较),双括号中的变量可以省略$符号前缀,当然也可以带着。

    $ a=1
    $ if ((a==1))
    > then echo 'equal'
    > fi
    equal
    

    []

    1.条件判断

    [] 本质上是 test 语句,[是调用test的命令标识,]是关闭条件判断

    $ if [ 1 == 1 ]
    > then echo 'equal'
    > fi
    equal
    

    [[]]

    条件判断,比[]更加高级

    $ if [[ 1+2 -gt 2 ]]; then echo "True"; else echo "False"; fi
    True
    

    使用[]就出错了

    $ if [ 1+2 -gt 2 ]; then echo "True"; else echo "False"; fi
    bash: [: 1+2: integer expression expected
    False
    

    原文链接:https://blog.csdn.net/HappyRocking/java/article/details/90609554

    变量内容的替换,删减

    格式:

    ${var [# | ## | % | %%] pattern }     # 变量删除
    ${var [// | /]old/new}                # 变量内容的替换
    

    参数:

    • #:从左往右删除符合pattern的字符串(非贪婪模式,只匹配最短的那个)
    • ##:从左往右删除符合pattern的字符串(贪婪模式,匹配最多的那个)
    • %:从右往左删除符合pattern的字符串(非贪婪模式)
    • %%:从右往左删除符合pattern的字符串(贪婪模式)
    • /:替换第一个匹配到的字符串
    • //:替换所有符合的字符串

    示例:

    $ name='111222333444555'
    $ echo ${name#*2}     # 从左删除到2,非贪婪模式
    22333444555
    
    $ echo ${name##*2}   # 贪婪模式
    333444555
    
    $ echo ${name%2*}   # 从右往左删除到2,非贪婪
    11122
    
    $ echo ${name%%2*}
    111
    
    

    替换:

    $ echo ${name/1/a}
    a11222333444555
    
    
    $ echo ${name//1/a}
    aaa222333444555
    
    
    变数设定方式 var1= var1='' var1 已设定非为空字串 解释
    var=${var1-var2} var=var2 var='' var=$var1 var1=None时,var取值var2;否则取值var1
    var=${var1:-var2} var=var2 var=var2 var=$var1 var1=None或者=‘’时,var取值var2,否则取值var1
    var=${var1+var2} var= var=var2 var=var2 var1=None时,var取值None,否则取值var2
    var=${var1:+var2} var= var='' var=var2 var1=None或者=‘’时,var取值var1,否则取值var2
    var=${var1=var2} var1=var2 var1="" var1不变 当var1=None时,var和var1都取值var2,否则取值var1
    var=${var1:=var2} var1=var2 var1=var2 var1不变 当var1=None或=“”时,var和var1都取值var2,否则取值var1
    var=${var1?var2} var2 输出至stderr var='' var=$var1 当var1=None,var2输出到stderr,否则var取值var1
    var=${var1:?var2} var2 输出至stderr var2 输出至stderr var=$var1 当var1=None或=“”时,var2输出到stderr,否则var取值var1
  • 相关阅读:
    Vivian's Problem UVA
    Prime k-tuple UVA
    M
    Make a Crystal UVA
    Cryptography Reloaded UVALive
    Gauss Prime UVA
    Discrete Square Roots UVALive
    The Bells are Ringing UVALive
    Huge Mods UVA
    指数循环节
  • 原文地址:https://www.cnblogs.com/wztshine/p/13182089.html
Copyright © 2011-2022 走看看