【开发工具】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系统的文件换行使用的是 ,而Unix系统是 。解决方法:

# 使用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
" 郭靖 男 66.1234
%s %c %d %f 都是格式替代符
d:Decimal 十进制整数 对应位置参数必须是十进制整数,否则报错!
s:String 字符串 对应位置参数必须是字符串或者字符型 否则报错
c:Char 字符 对应位置参数必须是字符串或者字符型 否则报错
f:Float 浮点 对应位置参数必须是数字型 否则报错
%-10s : 指一个宽度为10个字符(-表示左对齐,没有则表示右对齐),任何字符都会被显示在10个字符宽的字符内,如果不足则自动以空格填充,超过也会将内容全部显示出来。
%-4.2f :指格式化为小数,宽度为4个字符,其中.2指保留2位小数。
其他转义字符在此省略.
原文地址:https://www.cnblogs.com/simawenbo/p/14268020.html