zoukankan      html  css  js  c++  java
  • shell编程基础

    echo 输出

    转义--- c 不换行 跳格 换行

    echo -n 不换行 
    注意:linux系统中,必须用 –e 选项才能使转义控制符有效

    read 读取数据

    read var1 var2...

    read 

    -p 提示信息 -t 等待用户输入的时间 -n接受指定的字符数 -s 隐藏输入的数据

    如果输入的值个数多于变量个数,多余的值会赋给最后一个变量。每个值或每个变量之间有空格

    cat 显示文件

    cat [-n所有输出行编号 -b 空白行不编号] file1 file2

    例1:$cat file1 file2 file3
    管道命令 | :可以通过管道把一个命令的输出传递给另外一个命令作为输入。
    格式:命令 1 | 命令 2
    例2: $cat test.txt | grep ‘hello’

    tee 输出打印到显示器且保存到文件

    tee [-a追加到文件末尾] file

    tee file ->输入内容直接修改文件

    ps -e | tee file

    Shell输入输出 ------ 标准输入、标准输出、标准错误
    文件描述符
    输入文件 – 标准输入 0
    输出文件 – 标准输出 1
    错误文件 – 标准错误 2
    常用文件重定向命令:(注意没有空格)
    command > file 标准输出重定向到一个文件,错误仍然输出到屏幕
    command >> file 标准输出重定向追加到文件file
    command 1> file 标准输出重定向到file,1是标准输出文件描述符
    command 2>> file 标准错误重定向追加到file
    command 1>file 2>&1 标准输出和标准错误一起重定向到文件file

              &1指向file
    command >> file 2> &1 标准输出和标准错误一起重定向追加到文件file
    command < file1 > file2 以file1做为标准输入,file2做为标准输出
    command < file 以file做为文件标准输入
    注:上面的command 1>file 2>&1 可以修改为command>file 2>>file

    cat -n $1 $2 $3 1>catfile.log 2>catfile.err

    标准输出到catfile.log错误输出catfile.err

    shell变量

      环境变量(/etc/profile )

    定义环境变量:
    var_name=value

    export var_name

    查看环境变量的值:
    echo $var_name
    删除某个系统环境变量:
    unset var_name
    注:只是从当前用户shell进程中删除,不会从文件/etc/profile删除

      本地变量

    查看echo ${var_name} ---建议使用这个方法

      只读变量

    readonly  var_name

      位置变量

    作用:向shell 脚本传递参数,参数个数可以任意多,但只有前9个被访问到,shift命令可以更改这个限制。参数以数字编号,每个编号前加$,第一个参数$0 是实际的脚本名字,无论脚本是否有参数,此值均有效,$1 ~ $9 是脚本的第一至第九个参数。 例:$vi test.sh

    #!/bin/bash
    echo “The script name is : $0”  -》脚本名
    echo “The first parameter is : $1” 第一个参数
    echo “The second parameter is : $2”
    echo “The third parameter is : $3”
    echo “The fourth parameter is :$4”
    echo “The fifth parameter is : $5”
    echo “The sixth parameter is : $6”
    
    shift
    echo “The sixth parameter is : $10”

    保持文件为可执行文件,执行 $./test.sh would you like to do it

    一共9个参数,超出需要使用shift

    练习:
    写一个简单的脚本文件catfile.sh,要求实现功能:用户随意输入3个文件名,这3个文件的内容能够被cat命令连接起来显示,并且所有行都被标号;用户输入的文件可能真实存在,也可能不存在,需要将标准输出和标准错误分别重定向到文件 catfile.log和catfile.err
    Cat -n $1 $2 $3 >catfile.log 2> catfile.err
    

      

    特定变量(预定义变量)

    特定的shell变量列表:
    $# 传递到脚本的参数个数
    $* 以一个单字符串的形式显示所有向脚本传递的参数,与位置变量不同,此项参数可以超过9个,返回的是一个整体参数
    $$ 脚本运行的当前进程id号
    $! 后台运行的最后一个进程的进程id号
    $@ 功能与$*相同,但使用时加引号,并在引号中返回每个参数,返回的是每一个独立参数
    $? 显示最后命令退出的状态,0表示正确,其他任何值表示错误
    例:修改上例中的test脚本,加上以下内容:
    echo “The number of arguments passed: $#”
    echo “Show all arguments: $*”
    echo “Show my process id: $$”
    echo “Did my script go with any errors: $?”

    变量运算

    例1: $x=20 y=30 #同一行对多个变量赋值,用空格分开。
    $((w=x+y))	#运算放在双括号里面
    $echo $w
    50
    
    例2:	$let k=3*8	#用let 进行运算。
    $echo $k
    $24
    如果没用双括号,也没用let,运算的结果会变成字符串。 

    (())算式放在双括号里运算

    expr   >>dd=$(expr $aa + $bb)----注意空格

    let   >> sum

    浮点运算

    shell里面需要用工具bc来进行浮点运算,bc是linux下的一个计算工具,对应的程序是/usr/bin/bc。可以直接运行bc,然后在后面输入运算式子进行计算,输入式子之前,需要输入scale的值,它表示小数点后面保留几位,如果没有输入,结果会得到整数部分,而没有小数部分。

    例1: $x=20 y=30 #同一行对多个变量赋值,用空格分开。
    $((w=x+y))	#运算放在双括号里面
    $echo $w
    50
    
    例2:	$let k=3*8	#用let 进行运算。
    $echo $k
    $24
    如果没用双括号,也没用let,运算的结果会变成字符串。  

    文件测试

    test condition 或者 [ condition ]
    test是关键字,”[””]”与condition之间有空格。

    --------------------------------- 文件状态列表 --
    -d 目录      -s 文件长度大于0,非空
    -f 一般文件    -w 文件可写
    -L 符号链接文件  -r 文件可读
    -x 文件可执行  -e 文件存在

    test -f file     [ -w file ]

    echo $?

    逻辑操作 -a  -o !

    例1:$[ -r myfile1 -a -w myfile2 ]
    $echo $?
    例2:$[ -w myfile1 -o -x myfile2 ]
    $echo $?
    逻辑与,或,非可以用双中括号格式,如下:
    [[ condition1 && condition2 ]] 逻辑与
    [[ condition1 || condition2 ]] 逻辑或

    [[ !condition ]] 逻辑非

    命令的与、或、非,格式:
    命令1 && 命令2 命令逻辑与,命令1先执行,成功时,命令2才执行
    命令1 || 命令2 命令逻辑或,命令1先执行,成功时,命令2不再执行

    例子:ls && echo yes || echo no    命令成功执行打印yes否则打印no
    例4:如果文件a.txt存在,则删除,不存在不做删除。

    字符串测试

    字符串测试:测试两个字符串的关系,特别是比较用户输入与变量字符串。
    格式:test “string”
    test string_operator “string”
    test “string1” string_operator “string2”
    [ string_operator string ]
    [ string1 string_operator string2 ]
    注:string_operator是操作符,它的取值:
    = 等于 != 不等于 -z 空串 -n 非空串

    例子:

    $string1=“hello”
    $string2=“Hello”
    $[ “$string1” = “$string2” ]
    $echo $?
    注:在进行字符串比较时,建议加上引号。

    数值测试

    格式:”number1” number_operator “number2”
    或者 [ “number1” number_operator “number2” ]
    注:number_operator是操作符,它的取值:
    -eq (equal)数值相等   -gt(grater than) 大于
    -ne (unequal)数值不相等   -lt (less than)小于
    -le(less equal) 小于等于 -ge (grater equal)大于等于

    例1:$num1=130
    $[ $num1 –eq 130 ]
    $echo $?

    整数的关系运算还可以放在双小括号里面进行,这时的运算符与C语言一致,&&表示与运算,||表示或运算,!表示非,==判断是否相等,!=判断是否不等。
    例3: $(( 5>6 ))
    $echo $?
    1 #5>6不成立,退出状态为1

    expr语句手工计算

    $expr 10 + 10 #注意空格
    $expr 300 / 6 / 5
    $expr 30 * 3 #注意:乘号必须用反斜线屏蔽其特定含义

    增量计数,expr在循环中用于增量计算,首先,循环初始化为0,然后循环加1,常用的做法:从expr接受输出赋给循环变量。
    例:$LOOP=0
    $LOOP=`expr $LOOP + 1`

    数值测试,可以用expr测试一个数,如果对非整数进行计算,则返回错误。
    例:$expr 1.1 + 1 #返回错误
    $expr 1 + 1 #返回2

    字符串测试,expr也有返回的状态,但与系统最后返回的值刚好相反,expr返回成功为1,其他值为失败。
    例:$value=hello
    $expr $value = “hello” #注意等号前后都有空格
    $1 #expr执行成功的值
    $echo $?
    $0 #系统命令返回成功的值

     If条件语句

    if      [条件1] 
    then    命令1
    elif    [条件2]
    then    命令2
    else     命令3
    fi
    
    if [条件1]; then
    命令1
    fi 
    例子(输入一个目录名,判断它里面的内容是否为空)
    $vi myfile.sh
    
    #!/bin/bash
    DIR=$1
    if [ “`ls –A $DIR`”= “” ] 
    then
    echo “$DIR is indeed empty”
    else
    echo “$DIR is not empty”
    fi
    
    
    ./myfile.sh /etc
    #``反斜杠表示运行此命令  
    例子(要求用户可以随意输入一个账号,打印出该账号,如果账号为空,打印”You did not) enter any info”
    account=$1
    if [ "$account" = "" ]
    then
    echo "you did not enter any info"
    else 
    echo "$account" 
    fi

    For语句

    用法一
    for 变量名 in 列表
    do
    命令1
    命令2
    done
    用法二
    for((i=0;i<n;i++))
    do
    命令
    done
    用法1例子
    #!/bin/bash
    for loop1 in {1..10}	#数字列表
    do
    echo $loop1
    done
    用法一例子(打印shell脚本的参数,文件名for4.sh)
    #!/bin/bash
    for params in $*
    do
    echo “You supplied $params as a command line option”
    done
    echo $params
    修改添加可执行权限:chmod u+x for4.sh
    运行:./for4.sh a b c d e f
    用法二例子(99乘法表打印)
    #!/bin/bash
    for((i=1;i<10;i++))
    do 
    	for((j=1;j<=i;j++))
    	do
    	#sloution1
    	let sum=$i*$j                   
    	echo -en "$i*$j=$sum	"  
    	#solution2
    	echo -en "$i*$j=$(($i*$j))	"
    	done
    echo
    done
    
    #echo -e 使转义符生效
    #echo -n 不换行,echo命令默认换行

    while语句

    while 命令
    do
    命令1
    ……
    done  
    使用while循环读取一个文件的内容
    #!/bin/bash
    while read FILE1
    do
    echo “the info is: $FILE1”
    done < a.file

    until语句

    until 条件
    do
    命令1
    ……
    done

    case语句

    case 变量 in
    模式 1)
    命令1
    ……
    ;;
    模式 2)
    命令2
    ……
    ;;
    esac

    case 变量后面必须为in,每个模式必须以右括号结束,case后面的变量可以是常数值,找到匹配模式后,执行相关命令直到;;

    练习1:输入某个字母,判断是否元音字母。
    #!/bin/bash
    echo -n please input a letter from a to z: 
    read letter
    case $letter in
    a|e|i|o|u) 
    echo “It is a vowel.”
    ;;
    *)
    echo “input error.”	;;
    esac

    break 允许跳出循环或case语句,在多层循环里,break可以跳出本层循环。
    continue类似于break, 区别是continue只会跳过当次的循环,不会跳出整层循环。

    函数

    函数名( )
    {
    命令1
    ……	}
    或者:
    function 函数名( ) { …… }
    例:脚本 func1.sh
    #!/bin/bash
    hello( )
    {
    echo “Hello, today’s date is `date`”
    }
    echo “now, going to the function hello”
    hello
    echo “back from the function”

    本地变量

    local varname

    变量如果在函数内外名称相同则默认为全局,否则加local为本地

    函数返回值

    格式: return 从函数中返回,用最后状态$?决定返回值。
    return 0 无错误返回 return 1 有错误返回

    函数使用

    1创建函数 例:function.main
    
    2载入文件
    
    格式: source 路径带文件名 或者 . 路径带文件名
    $source ./function.main 或 $ . function.main
    
    3. 检查载入的函数
    使用set命令查看已经载入到shell的函数
    4. 执行函数
    键入函数名,如果需要参数,函数名后面带上参数
    $findit hello
    5. 修改shell函数,需要借助unset 命令先从shell中删除函数,修改后重新载入。
    $unset findit
    修改后……重新载入
    $. ./function.main
    练习:
    写一个脚本,和用户进行交互,要求用户输入一个目录名称,通过在脚本中调用函数的方法实现:函数能够对这个目录名称进行判断,如果不是目录,也不是文件,则返回1,否则返回0;如果函数返回1,脚本创建该目录。 #!/bin/bash Is_dir(){ if [ -d $1 -o -f $1 ]; then return 0 else return 1 fi } Is_dir $1 ret=$? if [ $ret = 1 ]; then mkdir $1 fi

    变量

    变量的叠加

      a=123

      -1--a="$a"456

      -2--a=${a}456

      echo a >>a=123456

     set 查看所有的变量

    emv查看环境变量

      set -u 如果不存在可以提示楚

    unset name删除变量

    变量的区别

      自定义变量只能在当前的用户shell中生效

      环境变量是全局变量

    pstree 查看进程树

    export将自定义变量变为环境变量

    ps1 提示符设置

     

    d 显示日期 H显示主机名 显示时间 A 显示时间 u显示当前用户名

    w显示所在目录绝对路径 W显示当前目录最后一个目录 $显示提示符

     locale 显示当前语系

    LANG

    LC_ALL

    declare   [+/-] 选项 变量名

    -给变量设定类型

    +取消变量类型属性

    -a将变量声明为数组类型

    -i声明为整形

    -x声明为环境变量

    -r声明为只读变量

    -p显示变量的声明类型

    例子:declare -i aa=$bb+$ss

    Keep going
  • 相关阅读:
    Leetcode:Convert Sorted List to Binary Search Tree
    Leetcode:Unique Binary Search Trees & Unique Binary Search Trees II
    Leetcode::Longest Common Prefix && Search for a Range
    Leetcode::Flatten Binary Tree to Linked List
    Leetcode::JumpGame
    leetcode power(x,n)
    Leetcode Letter Combinations of a Phone Number
    leetcode Reverse Nodes in k-Group
    leetcode Merge k Sorted Lists
    word ladder
  • 原文地址:https://www.cnblogs.com/maoxianfei/p/5738900.html
Copyright © 2011-2022 走看看