仓酷云

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 921|回复: 8
打印 上一主题 下一主题

[shell编程] 给大家带来Shell经常使用技能 交互式利用shell

[复制链接]
若相依 该用户已被删除
跳转到指定楼层
楼主
发表于 2015-1-14 20:18:53 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
欢迎大家来到仓酷云论坛!交互式利用BashShell:

1.用set下令设置bash的选项:
上面为set次要选项的列表及其表述:
选项名开关缩写形貌allexport-a翻开此开关,一切变量都主动输入给子Shell。noclobber-C避免重定向时文件被掩盖。noglob-d在路径和文件名中,封闭通配符。
#翻开该选项
/>set-oallexport#同等于set-a
#封闭该选项
/>set+oallexport#同等于set+a
#列出以后一切选项确当前值。
/>set-o
allexportoff
braceexpandon
emacson
errexitoff
errtraceoff
functraceoff
hashallon
histexpandon
......
/>set-onoclobber#翻开noclobber选项,避免在重定向时原有文件被掩盖。
/>date>outfile#经由过程date下令师长教师成一个文件outfile。
/>ls>outfile#将ls下令的输入重定向到该文件outfile,shell将提醒不克不及掩盖已存在的文件。
-bash:outfile:cannotoverwriteexistingfile
/>set+onoclobber#封闭noclobber选项。
/>ls>outfile#从头将ls的输入重定向到outfile,乐成。

2.变量:
设置部分变量:
/>name="stephenliu"#注重等号双方不要有空格,假如变量值之间存在空格,则必要用双引号括起
/>echo$name
stephenliu
/>name=#将变量设置为空时,等号前面也不要有空格,间接回车便可。
/>echo$name#name变量为空,因而echo不会有任何输入。
注重:以上变量的声明体例都可交换为declarevariable=value的情势。

/>declarename="stephenliu"
/>readonlyname#将name变量设置为只读。
/>echo$name
stephenliu
/>name="mywife"#假如针对只读变量从头赋值,将报错,提醒name是只读变量。
-bash:name:readonlyvariable
/>unsetname#假如unset只读变量,将一样报错,提醒不克不及unset只读变量。
-bash:unset:name:cannotunset:readonlyvariable

设置全局/情况变量:
在以后Shell中创立的全局/情况变量能够间接传送给它一切的子Shell,以后创立情况变量的Shell被称为夫Shell。
/>exportallname=john#使用export下令,将厥后声明的变量置为情况变量
/>bash#启动一个新的子Shell
/>echo$allname#在子Shell中echo变量$allname,发明夫Shell中设置的值被传送到子Shell
john
/>declare-xallname2=peter#这里的功效和了局都是和下面的下令不异,只是使用declare-x下令设置情况变量
/>bash
/>echo$allname2
peter

上面的列表将给出经常使用的内置Shell情况变量:
变量名寄义BASH暗示bash下令的完全路径名。ENV在启动新bashshell时实行的情况文件名。HOME主目次。LANG当地化言语。PATH下令搜刮路径,相互之间冒号分开。PPID父历程PID。PWD以后事情目次,用cd下令设置。
3.echo下令:
该下令次要用于将其参数打印到尺度输入。个中-e选项使得echo下令能够无穷制地利用本义序列把持输入的效果。上面的列表给出经常使用的本义序列。

本义序列功效c不换行打印
换行        制表符反斜杠echo还供应了一个经常使用的-n选项,其功效不输入换行符。

/>echoTheusernameis$LOGNAME
Theusernameisstephen
#上面下令的输入中的“/>”暗示下令行提醒符。
/>echo-e"        HelloWorldc"
HelloWorld/>
/>echo-n"HelloWorld"
HelloWorld/>

4.printf下令:
该下令和C言语中的printf函数的功效不异,都用用来格局化输入的。格局包含字符串自己和形貌打印效果的字符。界说格局的***和C言语也是完整一样的,即在%前面跟一个申明符,如%f暗示前面是一个浮点数,%d暗示一个整数。printf下令也一样撑持本义序列符,其经常使用本义序列以下:

本义序列功效c不换行打印
换行        制表符反斜杠"双引号其经常使用的格局化申明符列表以下:

申明符形貌%cASCII字符%d,%i十进制整数%f浮点格局%o不带正负号的八进制值%s字符串%u不带正负号的十进制值%x不带正负号的十六进制值,个中利用a-f暗示10-15%X不带正负号的十六进制值,个中利用A-F暗示10-15%%暗示%自己上面是printf的一些经常使用利用体例:
/>printf"Thenumberis%.2f.
"100
这里.2f暗示保存小数点后两位
Thenumberis100.00.
#%-20s暗示一个左对齐、宽度为20个字符字符串格局,不敷20个字符,右边增补响应数目的空格符。
#%-15s暗示一个左对齐、宽度为15个字符字符串格局。
#%10.2f暗示右对齐、10个字符长度的浮点数,个中一个是小数点,小数点前面保存两位。
/>printf"%-20s%-15s%10.2f
""Stephen""Liu"35

StephenLiu35.00
#%10s暗示右对齐、宽度为10的字符串,如不敷10个字符,左边增补响应数目的空格符。
/>printf"|%10s|
"hello

|hello|
在printf中另有一些经常使用的标记符,如下面例子中的标记(-),这里我们再先容一个对照经常使用的标识符"#"
#假如#标记和%x/%X搭配利用,在输入十六进制数字时,后面会加0x/0X前缀。
/>printf"%x%#x
"1515

f0xf

5.变量交换运算符:
bash中供应了一组能够同时查验和修正变量的特定修正符。这些修正符供应了一个快速的***来查验变量是否是被设置过,并把输入了局输入到一个变量中,见下表:
修正符形貌用处${variable:-word}如variable被设置且非空,则前往该值,不然前往word,变量值稳定。如变量不决义,前往默许值。${variable-word}如variable未被设置,则前往word,变量值稳定,假如设置变量,则前往变量值,即便变量的值为空值。如变量未设置,前往默许值。${variable:=word}如variable被设置且非空,则前往该值,不然设置变量为word,同时前往word。假如变量不决义,则设置其为默许值。${variable=word}如variable未设置,则设置变量为word,同时前往word,假如variable被设置且为空,将前往空值,同时variable稳定。不然前往variable值,同时variable稳定。假如变量未设置,则设置其为默许值。${variable:+word}如variable被设置且非空,则前往word,不然前往null,变量值稳定。用于测试变量是不是存在。${variable+word}如variable被设置(即便是空值),则前往word,不然前往空。用于测试变量是不是设置。${variable:?word}如variable被设置且非空,则前往该值,不然显现word,然前进出Shell。假如word为空,打印"parameternullornotset"为了捕获因为变量不决义所招致的毛病。${variable:offset}从variable的offset地位入手下手取,直到开端。${variable:offset:length}从variable的offset地位入手下手取length个字符。
#${variable:-word}的示例,其C言语暗示情势为:
#if(NULL==variable)
#returnword;
#else
#return$variable;
/>unsetvar_name#将变量var_name置为空。
/>var_name=
/>echo${var_name:-NewValue}#var_name为空,因而前往NewValue
NewValue
/>echo$var_name#var_name的值未变更,仍旧为空。

/>var_name=OldValue#给var_name赋值。
/>echo${var_name:-NewValue}#var_name非空,因而前往var_name的原有值。
OldValue
/>echo$var_name#var_name的值未变更,仍旧OldValue。
OldValue

#${variable-word}的示例,其伪码暗示情势为:
#if(variableisNOTset)
#returnword;
#else
#return$variable;
/>unsetvar_name#作废该变量var_name的设置。
/>echo${var_name-NewValue}#var_name为空,因而前往NewValue
NewValue
/>echo$var_name#var_name的值未变更,仍旧为空。

/>var_name=OldValue#给var_name赋值,即使实行var_name=,其了局也是一样。
/>echo${var_name-NewValue}#var_name非空,因而前往var_name的原有值。
OldValue
/>echo$var_name#var_name的值未变更,仍旧OldValue。
OldValue

#${variable:=word}的示例,其C言语暗示情势为:
#if(NULL==variable){
#variable=word;
#returnword;
#}else{
#return$variable;
#}
/>unsetvar_name#将变量var_name置为空。
/>var_name=
/>echo${var_name:=NewValue}#var_name为空,设置变量为NewValue同时前往NewValue。
NewValue
/>echo$var_name#var_name的值已被设置为NewValue。
NewValue
/>var_name=OldValue#给var_name赋值。
/>echo${var_name:=NewValue}#var_name非空,因而前往var_name的原有值。
OldValue
/>echo$var_name#var_name的值未变更,仍旧OldValue。
OldValue

#${variable=word}的示例,其伪码暗示情势为:
#if(variableisNOTset){
#variable=word;
#returnword;
#}elseif(variable==NULL){
#return$variable;//variableisNULL
#}else{
#return$variable;
#}
/>unsetvar_name#作废该变量var_name的设置。
/>echo${var_name=NewValue}#var_name未被设置,设置变量为NewValue同时前往NewValue。
NewValue
/>echo$var_name#var_name的值已被设置为NewValue。
NewValue
/>var_name=#设置变量var_name,并给该变量赋空值。
/>echo${var_name=NewValue}#var_name被设置,且为空值,前往var_name的原有空值。

/>echo$var_name#var_name的值未变更,仍未空值。

/>var_name=OldValue#给var_name赋值。
/>echo${var_name=NewValue}#var_name非空,因而前往var_name的原有值。
OldValue
/>echo$var_name#var_name的值未变更,仍旧OldValue。
OldValue
#${variable:+word}的示例,其C言语暗示情势为:
#if(NULL!=variable)
#returnword;
#else
#return$variable;
/>var_name=OldValue#设置变量var_name,其值为非空。
/>echo${var_name:+NewValue}#因为var_name有值,因而前往NewValue
NewValue
/>echo$var_name#var_name的值仍旧为远之OldValue
OldValue
/>unsetvar_name#将var_name置为空值。
/>var_name=
/>echo${var_name:+NewValue}#因为var_name为空,因而前往null。
/>echo$var_name#var_name仍旧坚持原本的空值。

#${variable+word}的示例,其伪码暗示情势为:
#if(variableisset)
#returnword;
#else
#return$variable;
/>var_name=OldValue#设置变量var_name,其值为非空。
/>echo${var_name+NewValue}#因为var_name有值,因而前往NewValue
NewValue
/>echo$var_name#var_name的值仍旧为远之OldValue
OldValue
/>unsetvar_name#作废对变量var_name的设置。
/>echo${var_name+NewValue}#前往空值。
/>echo$var_name#var_name仍未被设置。

#${variable:?word}的示例,其C言语暗示情势为:
#if(NULL!=variable){
#returnvariable;
#}else{
#if(NULL!=word)
#return"variable:word";
#else
#return"parameternullornotset";
#}
/>var_name=OldValue#设置变量var_name,其值为非空。
/>echo${var_name:?NewValue}#因为var_name有值,因而前往变量的原有值
OldValue
/>unsetvar_name#将var_name置为空值。
/>var_name=
/>echo${var_name:?NewValue}#因为var_name为空,因而前往word。
-bash:var_name:NewValue
/>echo$var_name#var_name仍旧坚持原本的空值。

/>echo${var_name:?}#假如word为空,前往上面的输入。
-bash:var_name:parameternullornotset

#${variable:offset}示例:
/>var_name=notebook
/>echo${var_name:2}
tebook
/>echo${var_name:0}#假如offset为0,则取var_name的全体值。
notebook

${variable:offset:length}示例:
/>var_name=notebook
/>echo${var_name:0:4}
note
/>echo${var_name:4:4}
book

6.变量形式婚配运算符:
Shell中还供应了一组形式婚配运算符,见下表:
运算符交换${variable#pattern}假如形式婚配变量值的开首,则删除婚配的最短局部,并前往剩下的局部,变量原值稳定。${variable##pattern}假如形式婚配变量值的开首,则删除婚配的最长局部,并前往剩下的局部,变量原值稳定。${variable%pattern}假如形式婚配变量值的开头,则删除婚配的最短局部,并前往剩下的局部,变量原值稳定。${variable%%pattern}假如形式婚配变量值的开头,则删除婚配的最长局部,并前往剩下的局部,变量原值稳定。${#variable}前往变量中字母的数目。
#${variable#pattern}示例:
/>pathname="/home/stephen/mycode/test.h"
/>echo${pathname#/home}#变量pathname入手下手处婚配/home的最短局部被删除。
/stephen/mycode/test.h
/>echo$pathname#pathname的原值稳定。
/home/stephen/mycode/test.h

#${variable##pattern}示例:
/>pathname="/home/stephen/mycode/test.h"
/>echo${pathname##*/}#变量pathname入手下手处婚配*/的最长局部被删除,*暗示恣意字符。
test.h
/>echo$pathname#pathname的原值稳定。
/home/stephen/mycode/test.h

#${variable%pattern}示例:
/>pathname="/home/stephen/mycode/test.h"
/>echo${pathname%/*}#变量pathname开头处婚配/*的最短局部被删除。
/home/stephen/mycode
/>echo$pathname#pathname的原值稳定。
/home/stephen/mycode/test.h

#${variable%%pattern}示例:
/>pathname="/home/stephen/mycode/test.h"
/>echo${pathname%%/*}#变量pathname开头处婚配/*的最长局部被删除,这里一切字符串均被删除。

/>echo$pathname#pathname的原值稳定。
/home/stephen/mycode/test.h

#${#variable}示例:
/>name="stephenliu"
/>echo${#name}
11

7.Shell中的内置变量:
Shell中供应了一些以$开首的内置变量,见下表:
变量名形貌$?暗示Shell下令的前往值$$暗示以后Shell的pid$-暗示以后Shell的下令行选项$!最初一个放进背景功课的PID值$0暗示剧本的名字$1--$9暗示剧本的第一到九个参数${10}暗示剧本的第十个参数$#暗示参数的个数$*,$@暗示一切的参数,有双引号时除外,"$*"暗示赋值到一个变量,"$@"暗示赋值到多个。一切的内置变量都对照简单了解,因而这里仅给出$*和$@的区分用法:
/>setapplepiepearspeaches
/>foriin$*
>do
>echo$i
>done
apple
pie
pears
peaches

/>setapplepiepearspeaches
/>foriin$@
>do
>echo$i
>done
apple
pie
pears
peaches

/>setapplepiepearspeaches
/>foriin"$*"#将一切参数变量视为一个
>do
>echo$i
>done
applepiepearspeaches

/>setapplepiepearspeaches
/>foriin"$@"
>do
>echo$i
>done
applepie#这里的单引号将两个单词分解一个.
pears
peaches

8.援用:
Shell中供应三种援用字符,分离是:反斜杠、单引号和双引号,它们可使Shell中一切元字符得到其特别功效,而复原其本意。见以下元字符列表:

元字符形貌;下令分开符&背景处置Shell下令()下令组,创立一个子Shell{}下令组,可是不创立子Shell|管道输出输入重定向$变量前缀*[]?用于文件名扩大的Shell通配符注:单引号和双引号独一的区分就是,双引号内能够包括变量和下令交换,而单引号则不会注释这些,见以下示例:
/>name=Stephen
/>echo"Hi$name,Imgladtomeetyou!"#name变量被交换
HiStephen,Imgladtomeetyou!
/>echoHi$name,Iamgladtomeetyou!#name变量没有被交换
Hi$name,Iamgladtomeetyou!
/>echo"Hey$name,thetimeis$(date)"#name变量和date下令均被交换
HeyStephen,thetimeisFriNov1816:27:31CST2011
/>echoHey$name,thetimeis$(date)
Hey$name,thetimeis$(date)#name变量和date下令均未被交换

9.下令交换:
一样我们必要把下令的输入了局赋值给一个变量大概必要用字符串交换变量的输入了局时,我们可使用变量交换。在Shell中,一般利用反引号的***举行下令交换。
/>d=`date`#将date下令的实行了局赋值给d变量。
/>echo$d
FriNov1816:35:28CST2011
/>pwd
/home/stephen
/>echo`basename`pwd``#基于反引号的下令交换是可嵌进的,可是嵌进下令的反引号必要利用反斜杠本义。
stephen
除反引号能够用于下令交换,这里我们也能够利用$(command)情势用于下令交换。
/>d=$(date)
/>echo$d
FriNov1816:42:33CST2011
/>dirname="$(basename$(pwd))"#和之前的反引号一样,该体例也撑持嵌套。
/>echo$dirname
stephen

10.数学扩大:
Shell中供应了两种盘算数学表达式的格局:$[expression]和$((expression))。
/>echo$[5+4-2]
7
/>echo$[5+2*3]
11
/>echo$((5+4-2))
7
/>echo$((5+2*3))
11
现实上,我们也能够在Shell中声明数值型的变量,这必要在declare下令的前面增加-i选项,如:
/>declare-inum
/>num=5+5#注重在赋值的过程当中,一切的标记之间均没有空格,假如必要空格,必要在表达式的表面加双引号
/>echo$num#假如没有声明declare-inum,该下令将前往5+5
10
/>num="5*5"
/>echo$num
25
/>declarestrnum
/>strnum=5+5
/>echo$strnum#因为并未将strnum声明为数值型,因而该输入将按字符串体例处置。
5+5
Shell还同意我们以分歧进制的体例显现数值型变量的输入了局,其格局为:进制+#+变量。
/>declare-ix=017#017其格局为八进制格局
/>echo$x#缺省是十进制
15
/>x=2#101#二进制
/>echo$x
5
/>x=8#17#八进制
/>echo$x
15
/>x=16#b#十六进制
/>echo$x
11
在Shell中还供应了一个内置下令let,专门用于盘算数学运算的,见以下示例:
/>leti=5
/>leti=i+1
/>echo$i
6
/>let"i=i+2"
/>echo$i
8
/>let"i+=1"
/>echo$i
9

11.数组:
Shell中供应了创立一维数组的才能,你能够把一串数字、名字大概文件放在一个变量中。利用declare的-a选项便可创立它们,大概在变量前面增添下标操纵符间接创立。和良多别的开辟言语一样,Shell中的数组也是0入手下手的,但是分歧的是Shell中数组的下标是能够不一连的。猎取数组中某个元素的语法格局为:${arrayname[index]}。见以下示例:
/>declare-afriends#声明一个数组变量
/>friends=(sherylpeterlouise)#给数组变量赋值
/>echo${friends[0]}#经由过程数组下标的体例会见数组的元素
sheryl
/>echo${friends[1]}
peter
/>echo${friends[2]}
louise
/>echo${friends
  • }#下标中星号暗示一切元素。
    shery1peterlouise
    #${#array
  • }暗示数组中元素的数目,而${#friend[0]}则暗示第一个元素的长度。
    />echo${#friends
  • }
    3
    />unsetfriends#unsetarray清空全部数组,unsetarray[index]仅清空指定下标的元素。

    />x[3]=100
    />echo${x
  • }
    100
    />echo${x[0]}#0下标的元素并没有被赋值过,由于输入为空。

    />echo${x[3]}
    100
    />states=(ME[3]=CA[2]=CT)#ME的下标为0。
    />echo${states[0]}
    ME
    />echo${states[1]}#数组下标为1的地位没有被赋值过,因而没有输入。

    />echo${states[2]}
    CT
    />echo${states[3]}
    CA

    12.函数:
    和C言语一样,Shell中也能够创立本人的自界说函数。其格局以下:
    function_name(){commands;commands;}
    functionfunction_name{commands;commands;}
    functionfunction_name(){commands;commands;}
    函数的参数在函数内是以$[0-9]、${10}...,这类部分变量的体例来会见的。见上面的示例:

    #函数的左花括号和下令之间必需有最少一个空格。每一个下令的前面都要有一个分号,即使是最初一个下令
    />functiongreet{echo"Hello$LOGNAME,todayis$(date)";}
    #此时函数已驻留在以后的bashshell中,因而利用函数效力更高。
    />greet
    Helloroot,todayisFriNov1820:45:10CST2011
    />greet(){echo"Hello$LOGNAME,todayis$(date)";}
    />greet
    Helloroot,todayisFriNov1820:46:40CST2011
    #welcome函数外部利用了函数参数。
    />functionwelcome{echo"Hi$1and$2";}
    />welcomestephenjane
    Histephenandjane
    #declare-F选项将列出以后Shell中驻留的函数
    />declare-F
    declare-fgreet
    declare-fwelcome
    #清空指定的函数,使其不在Shell中驻留。
    />unset-fwelcome

    13.重定向:
    上面的列表为Shell中撑持的从头定向操纵符。
    操纵符功效<从头定向输出>从头定向输入>>追加输入2>从头定向毛病&>从头定向毛病和输入>&从头定向毛病和输入2>&1从头定向毛病到尺度输入1>&2从头定向尺度输入到毛病>|从头定向输入的时分掩盖noclobber选项
    #find下令将搜刮了局输入到foundit文件,把毛病信息输入到/dev/null
    />find.-name"*.c"-print>foundit2>/dev/null
    #将find下令的搜刮了局和毛病信息均输入到foundit文件中。
    />find.-name"*.c"-print>&foundit
    #同上。
    />find.-name"*.c"-print>foundit2>&1
    #echo下令先将毛病输入到errfile,再把信息发送到尺度毛病,该信息尺度毛病与尺度输入兼并在一同(errfile中)。
    />echo"Fileneedsanargument"2>errfile1>&2
    />caterrfile
    Fileneedsanargument


    欢迎大家来到仓酷云论坛!
  • 谁可相欹 该用户已被删除
    沙发
    发表于 2015-1-15 22:41:28 | 只看该作者

    给大家带来Shell经常使用技能 交互式利用shell

    写学习日记,这是学习历程的见证,同时我坚持认为是增强学习信念的法宝。
    深爱那片海 该用户已被删除
    板凳
    发表于 2015-1-21 10:27:49 来自手机 | 只看该作者
    以前觉得Linux就跟dos一样,全是用命令窗口,相对于窗口界面来说多麻烦呀。
    活着的死人 该用户已被删除
    地板
    发表于 2015-1-30 15:02:55 来自手机 | 只看该作者
    一定要养成在命令行下工作的习惯,要知道X-window只是运行在命令行模式下的一个应用程序。在命令行下学习虽然一开始进度较慢。
    冷月葬花魂 该用户已被删除
    5#
    发表于 2015-2-6 14:07:35 | 只看该作者
    通过自学老师给的资料和向同学请教,掌握了一些基本的操作,比如挂载优盘,编译程序,在Linux环境下运行,转换目录等等。学了这些基础才能进行下面的模拟OS程序。?
    小妖女 该用户已被删除
    6#
    发表于 2015-2-16 17:50:18 | 只看该作者
    Linux?最大的优点在于其作为服务器的强大功能,同时支持多种应用程序及开发工具,所以Linux操作系统有着广泛的应用空间。
    山那边是海 该用户已被删除
    7#
    发表于 2015-3-5 08:37:55 | 只看该作者
    其实当你安装了一个完整的Linux系统后其中已经包含了一个强大的帮助,只是可能你还没有发现和使用它们的技巧。
    海妖 该用户已被删除
    8#
    发表于 2015-3-12 06:00:44 | 只看该作者
    Linux只是个内核!这点很重要,你必须理解这一点。只有一个内核是不能构成一个操作系统的。
    飘灵儿 该用户已被删除
    9#
    发表于 2015-3-19 20:59:13 | 只看该作者
    下面笔者在论坛看到的一个好问题: “安装红旗4.0后,系统紫光输入法自带的双拼方案和我的习惯不一样,如何自定义双拼方案解决?谢谢?”这个问题很简练。
    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    QQ|Archiver|手机版|仓酷云 鄂ICP备14007578号-2

    GMT+8, 2024-11-14 14:35

    Powered by Discuz! X3.2

    © 2001-2013 Comsenz Inc.

    快速回复 返回顶部 返回列表