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

三.学习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执行完毕且正确执行,则开始执行cmd2
  • cmd1 || 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循环.

你可能感兴趣的:(Linux)