【开发工具】Linux 服务器 Shell 脚本简单入门
记录一下学习Shell编程的关键知识点,使用最通俗简洁的语句,让阅读者能快速上手Shell脚本的编写
1.什么是Shell?
Shell是一种常用于服务器运维的脚本语言。众所周知,脚本语言不需要编译器,只需要解释器。
在各种Shell解释器中,sh,bash最常用,而bash是兼容sh的,目前市面上的Linux基本用的都是bash。
查看系统当前shell解释器
echo $SHELL
查看系统有的shell解释器
cat /etc/shells
2.编写第一个shell脚本
新建一个.sh文件,比如 class1.sh,编写第一句脚本,保存。
# echo的意思是输出语句。 PS.在不使用EOF方法的情况下,shell只有单行注释,前+#
echo "Hello World!"
把此.sh脚本设为可执行,再执行此脚本
chmod +x ./class1.sh
./class1.sh
3.使用变量
编写一些变量的基础用法
name="sima" #定义一个变量
echo $name #输出此变量,变量前+$
echo "My name is ${name}"
unset name #删除变量,删除后输出变量,没有任何输出
read name #从控制台输入一个变量,赋值给name
echo ${name} #输出此变量 +不+{}都一样
执行此脚本得到
只读变量的使用,执行后报错。
name="sima" readonly name name="sima2"
关于转义字符的替换这里不做过多描述,尽量精简,使用到的时候再百度就好。
4.命令行参数
这个东西可以当做C#、java中的方法理解,一个.sh脚本类似一个方法,给这个方法传递参数,方法再使用这几个数进行计算。
运行脚本时传递给脚本的参数称为命令行参数。命令行参数用 $n 表示,例如,$1 表示第一个参数,$2 表示第二个参数,依次类推。
$* 和 $@ 都表示传递给函数或脚本的所有参数,不被双引号(" ")包含时,都以"$1" "$2" … "$n" 的形式输出所有参数。
但是当它们被双引号(" ")包含时,"$*" 会将所有的参数作为一个整体,以"$1 $2 … $n"的形式输出所有参数;"$@" 会将各个参数分开,以"$1" "$2" … "$n" 的形式输出所有参数。、
举个例子,新建一个脚本 class2.sh ,记得写完要赋予执行权限,运行。
echo "filename: $0" echo "name: $1" echo "age : $2" echo "all : $@" echo "all : $*" echo "Total Number of Parameters : $#"
运行sh文件
./class2.sh sima 25
替换变量
5.Shell运算符
expr 是一款表达式计算工具,使用它能完成表达式的求值操作(若要计算浮点,请使用bc)。新建class3.sh脚本
a=10 b=20 val=`expr $a + $b` echo "a + b : $val" if [ $a == $b ] then echo "a is equal to b" fi if [ $a != $b ] then echo "a is not equal to b" fi
两点注意:
- 表达式和运算符之间要有空格,例如 2+2 是不对的,必须写成 2 + 2,这与我们熟悉的大多数编程语言不一样。
- 完整的表达式要被 ` ` 包含,注意这个字符不是常用的单引号,在 Esc 键下边。
脚本执行后输出的
PS.在Windows下编写好sh文件后,在Linux下运行会报错,这是因为Windows系统的文件换行使用的是\r\n,而Unix系统是\n。解决方法:
# 使用vim打开文件 vim class3.sh # 转换格式 :set ff=unix # 保存文件 :wq
关系运算符及布尔运算符,使用例子
a=10 b=20 if [ $a -lt 5 -o $b -gt 100 ] then echo "$a -lt 100 -o $b -gt 100 : returns true" else echo "$a -lt 100 -o $b -gt 100 : returns false" fi
文件运算符
6.Shell中的字符串
单引号:任何字符都会原样输出,单引号字串中不能出现单引号。
双引号:可以有变量,可以出现转义字符。
拼接字符串,新建class4.sh脚本,输入,执行。
your_name="sima" echo "hello, "$your_name" !" echo "hello, ${your_name} !" echo "hello, $your_name !" #字符串替换 echo ${#your_name} #字符串长度 echo ${your_name:1:2} #截取第2-3位字符串
7. Shell中的数组
新建class5.sh脚本,输入,执行。
array=(sima 25 man) #也可以 array[0]=sima array[1]=25 echo ${array[0]} #某个下标的元素 echo ${array[@]} #数组全部元素 echo ${array[*]} #同上 echo ${#array[@]} #数组长度 echo ${#array[*]} #同上 echo ${!array[@]} #所有下标 echo ${!array[*]} #同上 echo ${#array[1]} #某个下标的长度
printf
格式:printf format-string [arguments...] 其中(format-string: 格式控制字符串、arguments: 参数列表)
案例:printf "%-10s %-8s %-4.2f\n" 郭靖 男 66.1234
%s %c %d %f 都是格式替代符
d:Decimal 十进制整数 对应位置参数必须是十进制整数,否则报错!
s:String 字符串 对应位置参数必须是字符串或者字符型 否则报错
c:Char 字符 对应位置参数必须是字符串或者字符型 否则报错
f:Float 浮点 对应位置参数必须是数字型 否则报错
%-10s : 指一个宽度为10个字符(-表示左对齐,没有则表示右对齐),任何字符都会被显示在10个字符宽的字符内,如果不足则自动以空格填充,超过也会将内容全部显示出来。
%-4.2f :指格式化为小数,宽度为4个字符,其中.2指保留2位小数。
其他转义字符在此省略.