Linux-----三.学习shell脚本

mac2025-10-20  5

三.学习shell脚本

1.第一个shell脚本

练习所编写的shell脚本存放路径:/home/benjamin/bin

(1).注意事项

命令是从上而下,从左而右的分析与执行命令的之间的多个空格(包括空白行和[Tab]键)都会被认为是一个空格如果读取到一个Enter符号,当前行的命令就会被执行(参考翻译型语言如Python的执行过程)如果一行的内容过多,可以使用\[Enter]将[Enter]符号转移掉来拓展至下一行#可作为注释

(2).关于执行

.sh文件必须具有可读和可执行权限(rx)可以使用绝对路径和相对路径(当前目录下使用./xxx.sh)来执行命令以[bash]或[sh]来运行.sh文件(此时不需要x权限),在测试中直接运行文件可能导致一些无法解析转移的问题

(3).HelloWorld模板

#!/bin/bash # Program: # this program shows "Hello world!" in your screen. # this is my first shell script. # # author:Benjamin # date:2019.8.21 PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin export PATH echo -e "Hello World! \a \n" exit 0 第一行#!/bin/bash在声明这个.sh文件所使用的shell名称#后的内容作为注释存在第八九行设置的环境变量可以直接使用外部的命令第十行为程序的主体第十一行定义返回值(参考C语言)

2.简单的shell脚本练习

(1).交互式脚本

输入命令:

read -p "Please input (Y/N): " yn

参考python的语法,这里字符串部分为提示语句,yn为存储输入的变量

(2).简单加减乘除

read -p "first number: " firstNum read -p "secound nmumber: " secoundNum total=$(( ${firstNum} * ${secoundNum} ))

利用$((计算式))可以进行数值运算,仅支持整数.

3.脚本的执行方式的差异

(1).直接执行(./ , bash , sh)

会使用一个新的bash环境来执行脚本内的命令,也就是子进程中执行.重点在于当子进程完成后,子进程中的各种变量和操作不会穿回到父进程中.

(2).source执行

在父进程中执行,用于生效系统中的各种配置文件.

4.判断式

(1).test测试功能

test命令可以对文件属性,表达式,字符串进行一定程度的判断.

<<鸟哥>>P395

(2).判断符号[ ]

除了test命令之外,也可以使用判断符号[ ](中括号)进行数据的判断.

[ "${yn}" == "y" -o "${yn}" == "Y" ]

中括号中的每个组件都要有扣个相隔,变量(避免其值被作为变量名)和常数都应使用双引号引起来,

(3).命令执行的判断依据

cmd ; cmd 不考虑命令相关性的连续执行,无论前一个命令执行是否成功,结果如何,直接执行后一个命令cmd1 && cmd2 如果cmd1执行完毕且正确执行,则开始执行cmd2cmd1 || cmd2 如果cmd1执行完毕且执行结果为错误,则开始执行cmd2

(4).例子

#!/bin/bash # Program: # get 1 input, if it is "y" or "n", print something. # # author:Benjamin # date:2019.8.21 PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin export PATH read -p "Please input (Y/N): " yn [ "${yn}" == "y" -o "${yn}" == "Y" ] && echo "OK, countinue" && exit 0 [ "${yn}" == "n" -o "${yn}" == "N" ] && echo "Ok, interrupt" && exit 0 echo "I don't know what your choice is" && exit 0 exit 0

5.shell脚本的默认变量

/path/to/scriptname opt1 opt2 opt3 opt4 $0 $1 $2 $3 $4

以上代码展示了一个命令的执行在脚本内部的参数表示,$0为命令的脚本文件名,$1~$4分别为可以附加的变量

还有一些特殊用法:

$#: 代表参数的数量$@: 代表参数列表

6.条件判断式

(1).利用if…then

语法:

# 多个条件判断(if...elif...elif...else)分多种不同情况执行 if [ 条件判断式一 ];then 满足条件判断式一执行的命令. elif [ 条件判断式二 ];then 满足条件判断式二执行的命令. else 当不满足前两种条件判断式时执行的代码 fi

(2).利用case…esac判断

语法:

case $变量名称 in #关键字为case,变量名称前有美元符号 "第一个变量内容") 程序段 ;; "第二个变量内容") 程序段 ;; *) #最后用*代表其他的所有其他值 不包含前两个变量内容执行的程序段 ;; esac

(3).function功能

语法:

function fname(){ 程序段 } # 调用 fname opt1 opt2 opt3

就是寻常编程语言中的方法

内置变量与shell脚本的变量很类似,$0代表函数名,$1$2…代表括号中的后续变量.

7.循环(loop)

(1).不定循环(while…do…done , until…do…done)

语法:

# while循环意为当condition为真时一直进行循环 while [ condition ] # condition是一个判断式 do 程序段落 done # until循环意为一直进行循环,直到condition为真时退出循环 until [ condition ] do 程序段落 done

(2).固定循环(for…do…done)

语法:

for var in con1 con2 con3... do 程序段 done # 使用以下方式生成序列来代替con1 con2 con3 $(seq 1 100) ==> 1 2 3 4 5...100 {1..100} ==> 1 2 3 4 5...100 {a..z} ==> a b c d e...z

类似与Python中的for循环,或Java中的foreach循环.

在每一次循环中,var的值分为为con1,con2,con3.

(3).for…do…done的数值处理

for循环的另外一种写法:

for(( 初始值; 判断式; 运算 )) do 程序段 done

类似Java和c中的for循环.

最新回复(0)