1.7k likes | 1.87k Vues
Linux 环境中的程序设计基础. 使用 vi 编辑文件. vi 编辑器使用. vi editor 是一个全屏幕文本编辑器 所有的 Linux 版本都提供了这一编辑器 在 Linux 系统中使用 vi 来编写文本文件 vi 也是 Unix 世界里极为普遍的全屏幕文本编辑器. vi 的启动.
E N D
Linux环境中的程序设计基础 使用vi编辑文件
vi编辑器使用 • vi editor是一个全屏幕文本编辑器 • 所有的Linux版本都提供了这一编辑器 • 在Linux系统中使用vi来编写文本文件 • vi也是Unix世界里极为普遍的全屏幕文本编辑器
vi的启动 格式:vi [options] [filename] 功能:自动载入所要编辑的已有文件,或开启一个新文件 输出:如果未指定选项或文件,将进入vi程序并开始编辑一个新缓冲区。当屏幕的左边出现“~”号,表示本行为空行。 常用选项/功能: +n 从第n行开始编辑文件 +/exp 从文件中匹配字符串exp的第一行开始编辑
shell程序文件的建立实例 用vi编辑器建立shell程序文件shex1的步骤: ① 键入命令“vi shex1”,启动vi; ② 按命令“i”,进入vi的插入状态; ③ 输入程序文件内容; clear cal 1 98 cal 2 98 cal 3 98 ④ 按<Esc>键,再键入“:”,切换到vi的命令状态; ⑤ 在“:”后键入命令“wq”,即保存文件内容后,退出vi
vi的2种状态 进入vi后有2种状态:“编辑”状态和“一般命令”状态。 • 编辑状态 在此状态下输入文本编辑命令,输入文本文字信息。 • 一般命令状态 在此状态下键入的都是命令,这些命令用来下达一些文件存档、以及离开vi等等的操作指令。 当进入vi,先在编辑状态,等待编辑命令的输入。 • 2种状态的转换 任何情况下,按“ESC”键就进入编辑命令状态,光标定位在文档中,等待编辑命令的输入。 在编辑命令状态下,按“:”键,进入一般命令状态,屏幕左下方出现“:”提示符,等待输入一般命令。
编辑状态下的文字输入 • 在编辑状态下,有光标闪动,这是文字插入点。 • 在编辑状态下,输入以下编辑命令,便进入插入模式: • a:从光标所在位置后开始追加文字,光标后的文字随追加的文字向后移动。 • i:从光标所在位置前开始插入文字,光标后的文字随追加的文字向后移动。 • o:在光标所在行下方新增一行,并进入编辑状态。 • 编辑状态下输入文字时,有2种模式:“插入”与“改写”,按“Insert”键即可转换状态。 • 编辑状态下按“ESC”键,就退出插入模式。此时输入“/”,进入一般命令状态,然后输入欲搜索的字符再按回车键,光标将指向文本中与字符匹配的地方。
vi 下有多种编辑命令可完成以下功能: • 删除与恢复 • 修改 • 剪贴板 • 查找与替换 • 光标移动 • 寻找、搜索 • …… 但记住编辑命令是麻烦的,实际上,在命令模式下移动方向键就可以移动光标;按[Delete]键与[backspace]键就可删除字符。
退出vi • 在一般命令状态下,键入以下命令: q 结束编辑(打开的文档未作任何修改),退出vi q! 放弃编辑不作保存(打开的文档已编辑过),退出vi wq 保存当前文件后退出vi wq! 强制性保存当前文件(包括只读文件)后退出vi w [filename] 用于对新建文件(直接键入vi)或当前 正编辑的文件作保存后继续编辑 e <filename> 当前没有未保存的修改,则进入由<文 件名>指出的文件进行编辑 e! <filename> 即使有未保存的修改,也不作保存,进 入由<文件名>指出的文件进行编辑
删除与恢复 • 在编辑状态下,对文档内容作删除操作的命令: x 删除当前光标所在位置的字符,功能同“Del”键。 dw 删除当前光标所在位置的单词。 dd 删除当前光标所在的行,注意:dd是按两次d。 d$ 删除当前光标所在位置至本行结尾的所有字符。 dG 删除当前光标所在位置至文件结尾处的所有字符。 • 恢复是指对误删除的恢复,在编辑状态下,若要恢复误删除的内容,则使用命令u。
修改 R 键入R,然后键入修改后的单词。 r 改写光标所在处的单个字符。 ~ 用来改变光标所在处的字符的大小写。
剪切、复制、粘贴 yy 将光标所处行选中,并复制到系统剪贴板上。 c 即cut,是将光标所处行移到剪贴板上,原行内容在屏幕上消失。 p 即paste,是将剪贴板上的内容复制到光标所在行。
查找和替换 • vi中也可进行查找和替换,这无疑为修改相同的字符串带来了方便,vi的查找和替换功能是在命令方式下实现的,其命令如下: s / 需替换内容 / 修改后内容 / 需改内容所在行号 • 注意:在查找替换操作前,必须将光标移至文件首。 例: 用“After completion”来替换“Once I have completed it.”
shell程序运行的2种方法 运行shell程序有两种方法: • 在shell环境下,将shell 程序文件作为子shell程序被调用执行 $sh <shell程序文件名> [<参数1> <参数2> ……] 例: $sh shex1
将shell程序文件视作命令来执行(因此,shell程序文件可以看作是将各种命令组合在一起而形成的新命令),此时必须赋予shell程序文件执行权限将shell程序文件视作命令来执行(因此,shell程序文件可以看作是将各种命令组合在一起而形成的新命令),此时必须赋予shell程序文件执行权限 $ <shell程序文件名> [<参数1> <参数2> ……] 例: ① $ chmod a+x shex1 给程序文件赋予可执行属性 ② $ /home/user1/shex1 以完整的路径名键入程序名 或 $ ./shex1 以相对路径名键入程序名
带参数的运行命令 • 运行命令中有[参数]和无[参数]的2种情况,分别称为带参数的运行命令和不带参数的运行命令 • 在shell程序中一般使用的形参为:$0、$1、$2、……$9,共10个 • 当程序运行时,命令行中的<参数1>、<参数2>…依次赋值给$1、$2、…,通常称运行命令中所带的参数为实参 • $0是一个特殊的形参,其值规定为当前运行的shell程序命令本身
例:建立shell程序shex3,其内容为: clear cal $1 98 cal $2 98 cal $3 98 执行时输入命令的形式为: $ sh shex3 1 2 3 第一个实参值是1,运行时代换给程序中的形参$1, 第二个实参值是2,运行时代换给程序中的形参$2, 第三个实参值是3,运行时代换给程序中的形参$3
命令shift作用 • 由于形参个数有限(一般为10个),当参数较多时,可通过命令shift来移动形参与实参的对应关系 • 执行一次 shift 后,$1、$2、……变为依次与<参数2> <参数3>……对应 • 再执行一次shift后,$1、$2、……变为依次与<参数3> <参数4>……对应,依此类推
例:建立shell程序shex2,其内容为: echo $0 $1 $2 shift echo $0 $1 $2 运行时情况如下: # /root/shex2 yesterday today tomorrow /root/shex2 yesterday today /root/shex2 today tomorrow # 可见: $0始终是当前运行的shell程序命令本身,即/root/shex2
Shell 变量 • shell 变量大致可以分为三类:内部变量、用户变量和环境变量。 • 内部变量:由系统提供,用户不能修改。 • 用户变量:由用户建立和修改,在 shell脚本编写中会经常用到。是在当前shell中使用的局部变量,不能被在shell下运行的其他命令或其它shell程序使用 • 环境变量:这些变量决定了用户工作的环境,它们不需要用户去定义,可以直接在 shell中使用,其中某些变量用户可以修改。它可将值传给shell运行的其他命令或shell程序使用,也就是说系统变量是全局变量
Shell 变量 • PATH 变量是最重要的环境变量之一。当用户在命令行中输入命令时, shell 就会根据该变量定义的路径(目录)和顺序,查找并执行该命令。如果没有正确设置 PATH 变量,则必须输入完整的路径名来运行某个命令。 • 在 Linux 下输入命令的两种方式: • 直接在命令行中输入命令:根据 PATH 查找该命令 • 输入完整的路径名 • 用户可以根据需要修改环境变量 如:HISTSIZE,PATH,PS1,PS2 等
Shell 变量查询 • 查询当前 shell中的环境变量:env env • 查询某个变量的值:echo echo ${变量名}
命令提示符 • 在 bash 中,有两个级别的命令输入提示: • 一级提示符是当 bash等待输入命令时所出现的提示符,由环境变量 PS1控制,缺省值为 “$”; • 二级提示符是在 bash执行一个命令后,需要用户进一步输入才能完成次命令时,所出现的提示符,由环境变量PS2控制,缺省值为 “>”。 • 重设 PS1和PS2的设置 export 使变量的值对当前shell及其所有子进程都可见 例:export PS1=“\t\w\$”
命令提示符 • 在创建提示符时,可以使用下面的特殊字符:
bash 配置文件 • bash 配置文件 • 在命令行中设置和修改的变量值,只在当前的 shell 中有效。一旦用户退出 bash,所做的一切改变都会丢失。 • 在启动交互式会话过程中,在出现提示符前,系统会读取几个配置文件,并执行这些文件中的命令。所以这些文件可以用来定制 bash环境。如:设置 shell变量值或建立别名等。 • bash 配置文件: /etc/profile ~/.bash_profile ~/.bash_login ~/.profile ~/.bashrc
bash 配置文件 • /etc/profile Linux 系统中的全局 bash启动脚本,任何用户登录系统时/etc/profile都会被执行。通常用来设置标准 bash环境,但修改该文件需 root 权限。 • 读取 /etc/profile文件后,bash将在用户主目录中按顺序查找以下文件,并执行第一个找到的文件: ~/.bash_profile ~/.bash_login ~/.profile 在这些文件中,用户可以定义自己的环境变量,而且能够覆盖在 /etc/profile中定义的设置。
bash 配置文件 • bash 启动后,将读入配置文件 ~/.bashrc ,并执行这个文件中的所有内容。 • 另外,还可以从另一个 shell或者 bash自身启动一个新的 bash,这种过程称为非登录交互式,启动新 bash的命令为 bash,此时所读入的唯一 bash 配置文件是 ~/.bashrc 通常,个人bash环境设置都定义在 ~/.bashrc 文件里
变量命名 • 变量名必须以字母或下划线开头,后面可以跟字母、数字 或下划线。任何其它字符都标志变量名的结束。 • 变量名关于大小写敏感。 • 变量类型: • 根据变量的作用域,变量可以分为局部变量和环境变量 • 局部变量只在创建它们的 shell中可用。而环境变量则 在所有用户进程中可用,通常也称为全局变量。 • 变量赋值: variable=value • 等号两边不能有空格 • 如果要给变量赋空值,可以在等号后面跟一个换行符 变 量
变量赋值 格式:<变量名> =<字符串> 功能:将等号右边的字符串赋给等号左边的变量 变量名可以由任意字符、数字或下划线组成,但数字不能作为变量名的首字符。 变量名不能包含空格、惊叹号字符 变量名不能使用shell中保留的关键词等符号 变量名不能多于一个词,因为shell使用空格分析命令、定界命令名和参数,所以若字符串中含有空格,则在字符串上加上引号 例:name1=MARY name2="X Window"
显示变量的值 echo $variable或 echo ${variable} • 清除变量 unsetvariable • 显示所有变量 set 例: myname=jypan echo $myname unset myname echo $myname 变 量
变量的作用域 是指变量在一个程序中那些地方可见。对于 shell来说,局部变量的作用域限定在创建它们的 shell中。 例: 局部变量和作用域 $是特殊变量,用来存储当前运行进程的PID
引用变量 格式:$<变量名> 功能:引用变量的值。只要在变量名前加上“$”字符,变量名即将变量值取代 例: # name2=$name1 将变量name1值赋予变量name2 # echo $name1 在屏幕上显示变量name1的值
单引号和双引号允许用户一次把几个字符引起来。双引号不可以把美元符$引起,因为$操作符将导出变量所代表的值。如果已包含在双引号中有$字符,并紧跟变量名,则在执行shell命令时,字符串中的变量将被变量所代表的数值所取代单引号和双引号允许用户一次把几个字符引起来。双引号不可以把美元符$引起,因为$操作符将导出变量所代表的值。如果已包含在双引号中有$字符,并紧跟变量名,则在执行shell命令时,字符串中的变量将被变量所代表的数值所取代 例: # winner=david # notice="The person who won is $winner." # echo $notice 显示结果为:The person who won is david.
但若用户不希望求出包含在字符串中的变量的值,在这种情况下,应该使用单引号作为字符串的定界符。单引号将抑制任何变量值,并把美元符看成另一个字符但若用户不希望求出包含在字符串中的变量的值,在这种情况下,应该使用单引号作为字符串的定界符。单引号将抑制任何变量值,并把美元符看成另一个字符 例: # winner=david # notice='The name is in the $winner variable.' # echo $notice 显示结果为:The name is in the $winner variable.
若要将美元符使用,可以加上反斜杠\来引导$操作符若要将美元符使用,可以加上反斜杠\来引导$操作符 例: # winner=david # result="$winner won \$100.00" # echo $result 显示结果为: david won $100.00.
释放变量 格式:unset <变量名> 功能:释放一个现存的shell变量。要慎用unset *,因为它将删除全部shell变量 例: # unset name1
只读变量 是指不能被清除或重新赋值的变量。 readonly variable 例: 只读变量
环境变量 • 作用域包含创建它们的 shell,以及从该 shell产生的任意子 shell或进程。 • 按照惯例,环境变量通常使用大写。 • 环境变量是已经用 export内置命令输出的变量。 环境变量 • 变量被创建时所处的 shell称为父 shell。如果在父 shell中启动一个新的 shell(或进程),则该 shell ( 或进程 ) 被称为子shell ( 或子进程 )。 • 环境变量就象 DNA,可以从父亲传递给儿子,再到孙子,但不能从子进程传递给父进程。
export:使变量的值对当前shell的所有子进程都可见。 说明:设置或显示环境变量。 语法:export [选项] [变量名称]=[变量设置值] 该命令的各选项含义如下: -f 代表[变量名称]中为函数名称; -n 删除指定变量,变量实际未删除,只是不输出到后续指令的执行环境中; -p 列出所有shell赋予程序的环境变量。
设置环境变量 export variable=value variable=value; export variable 例: export -n variable export -p 环境变量举例 将全局变量转换成局部变量 列出所有全局变量
内置命令 declare 可用来创建变量。 declare [选项]variable=value 内置命令 declare declare常用选项
例: declare myname=jypan declare –xmyname2=pjy myname2=pjy declare –xmyname2 declare 举例 declare –rmyname=jypan unset myname declare myname="Jianyu Pan" declare
printf 命令 • printf可用来按指定的格式输出变量 printf format 输出参数列表 printf的打印格式与 C语言中的 printf相同 printf "%-12.5f\n" 123.456 format以%开头 格式符 flag field width precision -:左对齐 +:输出符号 0:空白处添0 空格:前面加一空格 字段宽度 小数点后输出位数
printf 命令 printf命令的格式说明符 format中还可以使用
printf 命令举例 例: printf "The number is: %.2f\n" 100 printf "%-20s|%12.5f|\n" "Joy" 10 printf "%-10d%010o%+10x\n" 20 20 20 printf "%6d\t%6o\"%6x\"\n" 20 20 20
变量测试 • shell 提供一些专用的修饰符来检查某个变量是否已被设置,然后根据测试结果指定变量的值,也称变量置换
变量测试举例 例: color=blue newcolor=${color:-grey} unset color echo "The sky is ${color:-grey} today" echo$color echo "The sky is ${color:=grey} today" echo$color echo "The sky is ${color:?error} today" echo$color echo "The sky is ${color:+blue} today" echo$color
位置参量(命令行参数) • 位置参量是一组特殊的内置变量,通常被 shell脚本用来从命令行接受参数,或被函数用来保存传递给它的参数。 • 执行 shell脚本时,用户可以通过命令行向脚本传递信息,跟在脚本名后面的用空格隔开的每个字符串都称为位置参量。 • 在脚本中使用这些参数时,需通过位置参量来引用。例如: $1表示第一个参数,$2表示第二个参数,以此类推。 $9以后需要用花括号把数字括起来,如第 10 个位置参量以 ${10}的方式来访问。