shell 入门学习基础教程

介绍

C 语言编写的程序设计语言,也是一个命令语言,它是连接了外部用户和 Linux 内核的桥梁

shell 脚本(.sh)即 shell 编写的程序

Linux 中 shell 版本众多,常见有 C shell,K shell,Bash shell 等,bash shell 也是大多数 Linux 中默认的 shell

基础

# 其中的 #! 表示脚本要用什么解释器来运行
#!/bin/bash

# 执行 shell 脚本请使用 ./test.sh 这样的形式,因为直接写 test.sh 会去 Path 环境变量中去找命令
./test.sh
# 运行 shell 或者直接使用解释器来解释脚本
/bin/sh test.sh

# shell 脚本中 . 表示引用文件,可引用 shell 脚本文件
. ./test.sh
# shell 脚本中这种方式引用文件也可以
source ./test.sh
# 假如第二个脚本中包含了第一个是 shell 脚本,但是给第二个脚本附上 x 权限即可,无需再给第一个脚本附上 x 权限

# bash 只能进行整型运算浮点数会被当成字符串

# 建议用双引号代替单引号,单引号中的数据全会原样输出
echo "Hello World!"

# 使用变量建议用花括号
echo ${PATH}

# 使用运算符的时候注意要加空格!

# 打印日期,`` 是命令执行
echo `data`

# 数据输入,后面使用 FILM 变量即可
echo -n "输入的数据为:"

# 此文件是一个特殊的文件,写入其中的内容都会被丢弃,从此文件中读取也无法读取到数据
/dev/null

shell 中括号的使用

# 包含命令
``

# 用于变量替换
${}

# 用于数学运算
[]
$[]
$(())

a=1;b=2;c=3
echo $((a+b+c))
echo $[ a+b+c ]

# [[]] 增加了模式匹配特效,求解数学表达式和字串表达式的增强版

shell 注释

# 这里是单行注释

:<<EOF
这里是多行注释
这里是多行注释
EOF

:<<'
这里是多行注释
这里是多行注释
'

:<<!
这里是多行注释
这里是多行注释
!xxxxxxxxxx :<<EOF这里是多行注释这里是多行注释EOF:<<'这里是多行注释这里是多行注释':<<!这里是多行注释这里是多行注释!# shell

shell 变量

1.shell 三种变量作用域

  • 局部变量

    此类变量是脚本中或者命令中定义的,仅在当前 shell 实例中有效

  • 环境变量

    所有程序包括 shell 程序都能访问环境变量

  • shell 变量

    由 shell 程序设置的特殊变量

2.shell 变量基本使用

########## shell 变量声明 ##########
# 变量声明,双引号和单引号都可以,建议用双引号,因为单引号中任何字符串都会原样输出
a="param1"
b="param2"

########## shell 变量使用 ##########
# 变量使用
echo $a
# 变量使用,建议加上花括号,是一个好习惯
echo ${a}

########## shell 变量只读 ##########
# 设为只读变量,之后不能在改变它的值
readonly a

########## shell 变量删除 ##########
# 删除变量,但是它无法删除只读变量
unset b

3.字符串变量的使用

a="param"

########## 字符串的拼接 ##########
# 双引号的拼接,下面两个双引号结果一致
result1="a"${param}"b"
result2="a${param}b"
# 单引号的拼接方式
result1='a'${param}'b'

########## 字符串的长度 ##########
echo ${#a}

########## 提取子字符串 ##########
# 从第二个开始截取三个字串,最后输出 ara
echo ${a:1:3}

########## 查找子字符串 ##########
# 查找 a 或 r 首次出现为第几个字母,注意这里 ` 不是单引号,最后输出数字为 2
echo `expr index "${a}" ar`

4.数组的使用

bash 支持一维数组,但是不支持多维数组,没有限定数组大小,即下标范围竟然没有限制

########## 数组定义 ##########
array1=("1" "2" "3")
array2=(
"1"
"2"
"3"
)
array3[0]="1"
array3[1]="2"
array3[2]="3"

########## 数组使用 ##########
# 输出 array3[0] 的值
echo ${array3[0]}
# 输出 array1 所有元素
echo ${array1[@]}

########## 数组长度 ##########
# 下面两种方式都可以
echo ${#array1[@]}
echo ${#array1[*]}

5.参数的传递

test.sh 文件内容如下

# shell 脚本
#!/bin/bash
echo "第一个参数:"$1
echo "第二个参数:"$2
echo "第三个参数:"$3
echo "输出参数个数:"$#
echo "显示所有:"$*

然后通过外部传参执行 shell 脚本

# 外部传参执行 shell 脚本
./test.sh 1 2 3

shell 运算符

bash 命令解释器不支持数学运算,但是 linux 三剑客中的 awk 功能很强大,是支持的,expr 也可以进行表达式计算

1.算数运算符

基本和 java 算数运算符一致,常用 expr 来计算

# expr 的使用
#!/bin/bash

a=10
b=20

sun=`expr $a + $b`

echo "总和为:${sun}"

2.关系运算符

只能处理数字,不可处理字符串

# 检测两个数是否相等
-eq
# 检测两个数是否不等
-ne
# greater than 检测左边的数是否大于右边的数
-gt
# less than 检测左边的数是否小于右边的数
-lt
# greater than or equal 检测左边的数是否大于等于右边的数
-ge
# less than or equal 检测左边的数是否小于等于右边的数
-le
echo 1 -gt 2 

3.布尔运算符

# 取反运算
!
# 或运算
-o
# 与运算
-a
echo 20 -gt 10 -a 22 -lt 39

4.逻辑运算符

# 逻辑与
&&
# 逻辑或
||

5.字符串运算符

# 检测字符串是否相等,相等返回 true
=
# 检测字符串是否相等,不相等返回 false
!=
# 检测字符串长度是否为 0,为 0 返回 true
-z
# 检测字符串长度是否为 0,不为 0 返回 true
-n
# 检测字符串是否为空,不为空返回 true
$
#!/bin/bash
# 字符串定义
a="Hello World!"
a="Hello World!!!!!!"

########## 检测相等 ##########
echo $a = $b

########## 检测字符串长度为 0 ##########
echo -z $a

########## 检测字符串长度不为 0 ##########
echo -n $a

########## 检测字符串为空 ##########
echo $a

6.文件测试运算符

# -d 目录,-f 普通文件,-r 文件是否可读,-w 文件是否可写,-x 文件可执行,-s 文件大小是否为 0,-e 检测文件存在
#!/bin/bash
file="/etc/profile"

########## 检测是否为目录 ##########
echo -d $file

########## 检测是否为普通文件 ##########
echo -f $file

########## 检测文件大小是否为 0 ##########
echo -s $file

########## 检测文件是否存在 ##########
echo -e $file

########## 检测文件是否可读 ##########
echo -r $file

########## 检测文件是否可写 ##########
echo -w $file

########## 检测文件是否可执行 ##########
echo -x $file

shell 打印语句

echo

echo 语句使用简单,这里不做使用赘述

printf

printf 是模仿 c 语言库里的 printf() 函数,printf 的移植性比 echo 好,printf 不会像 echo 添加默认换行

printf [格式控制字符串] [参数列表...]

shell 条件表达式

########## if 条件 ##########
# 文件中条件这样写
#!/bin/bash
a="Hello World!"
if [ $a = "..." ]
then
	echo "不匹配"
elif [ -n $a ]
then
	echo "长度不为 0"
else
	echo "wuwu"
fi
# 命令行中这样写
a="Hello World!"; if [ $a = "..." ]; then echo "不匹配"; fi

########## case 语句 ##########
a="Hello World!"
case $a in
	"Hello World!") echo "haha"
	;;
	*) echo "wuwu"
	;;
esac

shell 循环控制

shell 支持 for 循环,while 循环和 until 循环,until 循环使用一般较少,case 语句

########## for 循环 ##########
for i in 1 2 3 4 5
do
	echo "$i"
done

########## while 循环 ##########
i=1
while(( $i<=5 ))
do
	echo "$i"
	let "i++"
done

########## until 循环 ##########
i=1
until(( $i<=5 ))
do
	echo "$i"
	let "i++"
done

########## for 循环另一种 ##########
for(( i = 0; i <= 5; i++ ))
do
	echo "haha"
done;

shell 函数

#!/bin/bash
########## 函数的普通形式 ##########
fun1(){
	echo "这是 shell 函数"
}
fun2{
	return "美元符号表示外部传参,数字表示第几个参数 $1"
}
fun1
fun2 "第一个参数"

shell 重定向

我们前面做的输入输出都是在控制台进行的

重定向的几种符号

# 输出重定向
>
# 输入重定向
<
# 以追加的方式重定向
>>
# 将输出文件二者合并
>&
# 将输入文件二者合并
<&

# 文件描述符 0 是标准输入,1 是标准输出,2 是标准错误输出

举例

# 将 whoami 命令的输出放在 test1 文件中
whoami > test1

# 特殊的输入重定向
command << xxx
    document
xxx
发布了124 篇原创文章 · 获赞 40 · 访问量 6万+

猜你喜欢

转载自blog.csdn.net/abcnull/article/details/103892108