Ubuntu--(3)shell快速入门

来源:互联网 发布:北京网络职业学院 八维 编辑:程序博客网 时间:2024/06/05 20:29

运行shell文件方法

sh -x script_name       //将执行脚本并显示所有变量的值sh -n script_name       //不执行脚本,只检查语法sh -v script_name       //执行脚本前把脚本内容显示在屏幕上 sh script-file          //这个好像会有问题./script-file

变量运算

a=10b=20echo $(($a+$b))echo ((3**2))

数字比较选项

test int_num1 option int_num2
或者
if [ int_num1 option int_num2 ]

-eq         //equal相等返回真-ne         //not equal不等返回真-lt         //lower than小于返回真-le         //lower or equal小于或者等于-gt         //greater than大于等于-ge         //greater of equal大于等于返回真

定义数组

declare [-afirx]-a          //定义数组-f          //定义函数-i          //定义整数-r          //定义为只读declare -a myarry=(5 6 7 8)echo ${myarry[2]}

字符串运算:

${#string}//$string的长度${string:position}//$position开始提取字符串${string:position:length}//$从位置position开始提取长度为$length的子串${string#substring}//$从开始删除最短匹配子串${string##substring}//$从开始删除最长匹配子串${string%substring}//$从结尾删除最短匹配子串${string%%substring}//$从结尾删除最长匹配子串

与字符串比较有关的选项

if [ -z "$str1" ]-z str              //当字符串str长度为0时返回真-n str              //当字符串str长度大于0时返回真str1=str2           //当字串str1与str2相等时返回真str1!-str2          //当字符串str1与str2不等时返回真

test判断

-f                  //文件是否存在-d                  //目录是否存在-r                  //文件是否有读权限-w                  //文件是否有写权限-x                  //文件是否有执行权限

例如:

test -f $filename && echo 'exist'||echo 'not exist'test -d $filename && echo 'exist'||echo 'not exist'test -r $filename && echo 'exist'||echo 'not exist'test -w $filename && echo 'exist'||echo 'not exist'test -x $filename && echo 'exist'||echo 'not exist'

用于文件测试的test选项
if [ -x /file1 ]

-b file             //当文件是块设备时返回真-c file             //当文件是字符设备时返回真-d pathname         //当pathname是下一个目录时返回真-e pathname         //当指定的文件或者目录存在时返回真-f file             //当file为常规文件(不包括符号链接、管道、目录等)返回真-g pathname         //当pathname指定的文件或者目录设置了SGID位时返回真-h file             //当file是符号链接时返回真-p file             //当file是命名管道时返回真-r pathname         //当pathname抒写的文件或者目录是可读时返回真-s file             //当file存在且当大小为0时返回真-u pathname         //当pathname指定...设定了SUID位时返回真-w pathname         //当pathname指定...文件可写时返回真-x pathname         //当pathname指定...文件可执行时返回真-o pathname         //当pathname指定...文件被当前用户拥有时返回真

[]判断

在中括号中必须都要使用空格来分隔
在中括号中的变量,最好都要双引号括起来
在中括号中的常数,最好都以单引号括起来

[ '$a' == '$b' ] && echo 'Yes' || echo "No"[ '12' == '10' ] && echo 'Yes' || echo "No"[ '12' != '10' ] && echo 'Yes' || echo "No"

单分支判断

 if[]; then    echo statement  fi

双分支判断

  if[]; then    echo statement  else    echo statement  fi

多分支判断

  if[]; then    echo statement  elif    echo statement  elif    echo statement  fi

case多分支

 case $name in  1)    echo statement;;  2)    echo statement;;  *)    echo statement;;  esac

循环

while condition; do    statementdone;

例如:

i=10while (($i>=5)); do    echo $i;    ((i--));done;

建议下面的用[]

i=10    while [ $i -gt 5 ]; do        echo $i;        ((i--));    done;

until

until condition; do    statementdone;

例如:

a=10until (($a<0)); do    echo $a;    ((a--));done

建议下面的用[]

i=10    until [ $i -lt 1 ]; do        echo $i;        ((i--))    done;

for

for(()); do    statementdone;

例如:

for ((i=0; i<10; i++)); do        echo $i    done;

函数

例子:

function print(){    echo "Your input is $1"}echo "this program will print your selection!"case $1 in    "one")        print 1;;    "two")        print 2;;    "three")        print 3;;    *)        print "Usage $0 (one|two|three)";;esac

运行方法,要传入参数:
./shell_example one

echo $SHELL 看当前所用shell$#     传递到脚本的参数个数$*     传递到脚本的参数,与位置变量不同,此选项参数可超过9$$        脚本运行时当前进程的ID号,常用作临时变量的后缀$!     后台运行的(&)最后一个进程的ID$@$#相同,使用时加引号,并在引号中返回参数个数$-     上一个命令的最后一个参数$?     最后命令的退出状态,0表示没有错误,其他任何值表明有错误

逻辑操作符

-a      逻辑与-o      逻辑或!       逻辑非

例子: [ -r shell.c –a –w test.c ]

Example

#! /bin/bash#display the message "hello world!"echo "hello world!"echo "下面定义变量:"log="monday"echo "the value of logfile is: " $logecho "可以直接放在双引号内部:$log"echo "下面面展示位置参数:"echo "\$0 = ** $0 **"echo "\$1 = ** $1 **"echo "\$2 = ** $2 **"echo "\$3 = ** $3 **"echo "\$4 = ** $4 **"echo "显示有多少文件需要列出"echo "$# file(s) to list"echo "\$# 包含参数的个数 $#"echo "将参数列表的值逐一付给变量file"echo "\$@ 包含参数列表"for file in $@ do    ls -l $filedoneecho "\$* 包含参数列表"for file in $*do    ls -l $filedoneecho "双引号阻止Shell对大多数特殊字符的解释,\$ \`除外"echo '单引号阻止Shell对所有字符解释 $log'echo "倒引号括住的命令会被执行,并将执行结果当作表达式的值:" `date`num=1;echo "表达式求值:" $num=$[$num+3]echo $[(7 + 8) / (6 - 3)]echo $num = $[1 + 2]echo "\$[2#10 + 1] = 3 " $[2#10 + 1]echo "\$[16#10 + 1] = 17 " $[16#10 + 1]echo "\$[8#10 + 1] = 9 " $[8#10 + 1]echo "expr 运算符:" expr 1 + 2

Example:

#! /bin/bashecho "please be attention to the use of hte blankspace:"password="join"test "$password" = "join"[ "$password" = "join" ]echo "为字符串变量加上一个双引号是一个好习惯"echo "Shell对字符区分大小写"echo "please input a test password:"read passwordif [ -z "$password" ]then    echo "the length of the password you input is 0"fiecho "test FOR:"for i in 1 2 3 4 5do    echo $idoneecho "注意这里的符号,不是单引号,是Esc键下面的那个"for i in `seq 5`do    echo $idone

Example:

#! /bin/bashsum=0number=1while test $number -le 100do    sum=$[ $sum + $number ]    let number=$number+1doneecho "the sum is $sum"

Example:

#! /bin/bashecho -n "Enter a number(>0):"while read ndo    sum=0    count=0    if [ $n -gt 0 ]    then        while [ $count -le $n ]        do            sum=$[ $sum + $count ]            let count=$count+1        done        echo "the sum is $sum"    else        echo "please input a number greater than zero"    fi    echo -n "Enter a number(>0):"done

Example:

#! /bin/bashsum=0number=1until ! test $number -le 100do    sum=$[ $sum + $number ]    let number=$number+1doneecho "the sum is $sum"

统计当前目录下文件的个数

#! /bin/bashcount=0for file in `ls`do    if ! [ -d $file ]    then        let count=$count+1    fidoneecho "there are $count files"

脚本执行命令

exit 强行退出一个脚本

Eample:捕获INT信号,并显示信息提示用户怎样退出程序

#! /bin/bashtrap `echo "type quit to exit"` INTwhile [ "$input" != 'quit' ]do    read inputdone

Eample:捕获EXIT信号退出时输出Goodbye

#! /bin/bashtrap `echo "Goodbye"; exit· EXITecho "Type 'quit' to exit"while [ "$input" != "quit" ]do    read inputdone

命令表

可以用一个命令的退出值来控制是否执行另一条命令

a&&b        //与命令表,当且仅当a执行成功才执行ba||b        //或命令表,当且仅当a执行失败才执行ba;b         //顺序命令表,先执行a,再执行b

cut命令以特定的方式分割行,并输出特定的部分Example:
city.txt文件内容如下:

Beijing010Shanghai021Tianjin022Hangzhou0571

对文件city.txt取每行的第3到6个字符前输出

$ cut -c 3-6 city.txt

-f选项提取行中指定的字段,字段间的分割符由-d选项指定,默认分割符为Tab键,下面提取city.txt第二字段

$ cut -f 2 city.txt

diff命令确定两个版本的源文件存在哪些修改,Example:
city2.txt内容如下

Beijing011Shanghai021Tianjin022HangZhou0571

判断city1.txt与city2.txt的修改

$ diff city.txt city2.txt

sort 命令对输入以字母排序,Example:

$ sort city.txt    $ sort -r city.txt //以字母逆序排序    $ sort -k 2 -r city.txt//指定按字段,默认第一个字段

uniq 命令从已经排好序的输入中删除重复行,Example:

$ sort city.txt | uniq

tr 命令按用户指定的方式对字符执行替换,Example:
alph.txt文件内容如下:

HCC DEF GAIjkl mno pqrStU vwx yz12A Cft pOdHct Yoz cc4
$ tr "ABH" "HCA" < alph.txt    //将所有的:A->H, B->C, H->A$ tr "ABC" "[Z*]" < alph.txt   //将所有ABC替换为Z$ tr --delete " " < alph.txt   //删除所有空格

wc命令用来统计文件中字节、单词以及行的数量,Example:

$ wc city.txt

substr命令提取字符串中的一部分,三个参数,原始串,开始位置,字符数 ,Example:

$ expr substr "hello world!" 1 7

seq命令用于生成下一个整数序列,Example:

$ seq 5    $ seq -1 3    $ seq 9 -3 0

定制安全的delete命令

##建立回收机制##将需要删除的文件移动到~/.trash中##分三步完成:a>在用户主目录下添加.trash目录,用作回收站##          b>在每次删除文件或者目录时向用户确认##          c>在需要删除的目录或者文件移动到~/./trash中#! /bin/bashif [ ! -d ~/.trash ]then    mkdir ~/.trashfiif [ $# -eq 0 ]then    # 提示信息    echo "Usage:delete file1 [file2, file3 ...]"else    echo "you are about to delete these files:"    echo $@# 要求用户是否确认删除echo -n "are u sure to do that? [y/n]:"read replyif [ "$reply" != "n" ] && [ "$reply" != "N" ]then    for file in $@    do        # 判断文件或者目录是否存在        if [ -f "$file" ] || [ -d "$file" ]        then            mv -b "$file" ~/.trash/        else            echo "$file: no such file or directory"        fi    done    # 如果回答N或者n    else        echo "no file removed"    fifi 
0 0