shell基础

Shell 简介

Shell 是一个用 C 语言编写的程序,它是用户使用 Linux 的桥梁。Shell 既是一种命令语言,又是一种程序设计语言。Shell 是指一种应用程序,这个应用程序提供了一个界面,用户通过这个界面访问操作系统内核的服务。

Shell 脚本

Shell 脚本(shell script),是一种为 shell 编写的脚本程序。
业界所说的 shell 通常都是指 shell 脚本,shell 和 shell script 是两个不同的概念。

vi firstshell.sh   
                                     
chmod u+x firstshell.sh                    加入执行权限

#!/bin/bash      
#!是一个约定的标记,它告诉系统这个脚本需要什么解释器来执行
echo "Hello,shell!"

运行脚本,三种调用方式:

[root@zzj test]# ./firstshell.sh           在当前目录下

[root@zzj ~]# ./../usr/test/firstshell.sh  相对路径

[root@zzj ~]# /usr/test/firstshell.sh      绝对路径

变量

运行shell时,会同时存在三种变量:

1、局部变量 局部变量在脚本或命令中定义,仅在当前shell实例中有效,其他shell启动的程序不能访问局部变量。
2、环境变量 所有的程序,包括shell启动的程序,都能访问环境变量,有些程序需要环境变量来保证其正常运行。必要的时候shell脚本也可以定义环境变量。
3、shell变量 shell变量是由shell程序设置的特殊变量。shell变量中有一部分是环境变量,有一部分是局部变量,这些变量保证了shell的正常运行
注意,变量名和等号之间不能有空格,同时,变量名的命名须遵循如下规则:

命名只能使用英文字母,数字和下划线,首个字符不能以数字开头。
中间不能有空格,可以使用下划线(_)。
不能使用标点符号。
不能使用bash里的关键字(可用help命令查看保留关键字)。

Shell 字符串

单引号字符串:

#!/bin/bash
#单引号字符串
str='this is a string'
hello='Hello,'$str'!'
echo $hello

双引号字符串:

#!/bin/bash
name='Tokgo'
hello="Hello.I am "$name"!"
echo $hello

获取字符串长度

#!/bin/bash
#获取字符串长度
string="abcdefg"
echo ${#string}  #输出7

expr length "$string"; #第二种方式 输出同样是7

提取子字符串

echo ${string:1:5} # 输出 bcdef

Shell 传递参数

			$$	当前shell进程编号
			$0	当前脚本的文件名
			$n	脚本参数						如: ./one.sh henry 18,则脚本中的$1为henry,$2为18
			$#	脚本参数的数量			如上例: 2
			$*	脚本参数的完整集合		如上例: henry ,18
			$@  脚本参数的独立集合	如上例: henry ,18
				# $*    vs    $@
					#不加"两者相同
					#加上”则$*代表整体,而$@代表个体
					 假设在脚本运行时写了三个参数 1、2、3,,则 " * " 等价于 “1 2 3”(传递了一个参数),
					而 “@” 等价于 “1” “2” “3”(传递了三个参数)。
			$? 上一条命令的执行结果状态值或函数的返回值: 0表示正常,1表示失败
			$! 后台运行的最后一个进程的ID号

Shell 数组

bash支持一维数组(不支持多维数组),并且没有限定数组的大小。
数组元素的下标由 0 开始编号。获取数组中的元素要利用下标,下标可以是整数或算术表达式,其值应大于或等于 0。
定义数组
在 Shell 中,用括号来表示数组,数组元素用"空格"符号分割开。定义数组的一般形式为:

array_name=(value0 value1 value2 value3)
#!/bin/bash
array=(1 2 3 4 5);

# 获取数组长度
length=${#array[@]}
# 或者
length2=${#array[*]}

#输出数组长度
echo $length #输出:5
echo $length2 #输出:5

# 输出数组第三个元素
echo ${array[2]} #输出:3

unset array[1]# 删除下标为1的元素也就是删除第二个元素
for i in ${array[@]};do echo $i ;done # 遍历数组,输出: 1 3 4 5

Shell 基本运算符

Shell 和其他编程语言一样,支持多种运算符,包括:

  • 算数运算符
  • 关系运算符
  • 布尔运算符
  • 字符串运算符
  • 文件测试运算符

原生bash不支持简单的数学运算,但是可以通过其他命令来实现,例如 awk 和 expr,expr 最常用。

expr 是一款表达式计算工具,使用它能完成表达式的求值操作。

算数运算符
在这里插入图片描述
下面是我四则运算的简单事例:

a=5
b=10
export hello=Hello,Linux

e=`expr $a + $b`
echo "a+b=$e"
e=`expr $b - $a`
echo "b-a=$e"
e=`expr $a \* $b`
echo "a*b=$e"
e=`expr $b / $a`
echo "b/a=$e"

echo "a+b=${e} b-a=${f} a*b=${m}  b/a=${n}"

((g=$a + $b * $e))
echo $g

[root@zzj test]# source shell.sh
[root@zzj test]# echo $hello
Hello,Linux

关系运算符
在这里插入图片描述

if [ $a -le $b ]
then
   echo "$a -le $b: a 小于或等于 b"
else
   echo "$a -le $b: a 大于 b"
fi

输出结果:

10 -le 20: a 小于或等于 b

布尔运算符
在这里插入图片描述

#!/bin/bash
a=10
b=20

if [ $a -lt 100 -o $b -gt 100 ]
then
   echo "$a 小于 100 或 $b 大于 100 : 返回 true"
else
   echo "$a 小于 100 或 $b 大于 100 : 返回 false"
fi

输出结果:

10 小于 100 或 20 大于 100 : 返回 true

字符串运算符
#二元: == !=
=~
[[$var =~ PATTERN]]
不加"
#正则匹配
^ 开始
$ 结束
. —个任意字符
[] 指定范围 [abc] [a-z] [^a-b1-9]
< 单词开始
> 单词结束
\b 单词开始或结束
\B 非单词开始或结束
? {0,1}
+ {1,}
* {0,}
{n ,m} 最少n,最多m
{n,} 最少n次
{,m} 最多m次
{f} 固定f次
\ 转义符
() 组合
| 或
#一元: -z(是否为空) $str(是否不为空)

文件测试运算符
文件测试运算符用于检测 Unix 文件的各种属性。
属性检测描述如下:
在这里插入图片描述特殊表达式

`` <=> $()命令替换符,兼容性``更好 OUTOUT=start-all.sh
(())算术运算加强版
$(()) <=> $[]算术运算, ( ( ) ) 中 变 量 可 以 加 (())中变量可以加 (())也可以不加
-[]--test命令-
[[]]字符串计算加强版
${STR#*WORD}若STR符合WORD,将最短(WORD和左侧)的删除 <=> ${STR%WORD}(WORD和右侧)
-${STR##*WORD}--若STR符合WORD,将最长(WORD和左侧)的删除 <=> ${STR%%WORD}(WORD和右侧)-
${STR/WORD/REPLACE}若STR符合WORD,将第一个匹配项替换为REPLACE
${STR//WORD/REPLACE}若SIR符合WORD,将所有匹配项替换为REPLACE
-${STR:-DF_VALUE}--若STR未赋值或为空值,则设定STR值为DE_VALUE-
${ARRAY[IX]}获取数组ARRAY下标IX的元素
${#ARRAY[@]}获取数组ARRAY的长度(ITEMl ITEM2 … ITEMN)
-${ARRAY[*]}--整个数组-

Shell 流程控制

分支结果

if [ EXPRESSION1 ]
then

elif [ EXPRESSION2 ]
then

else

fi

TYPE="$1"
if [ $TYPE == "start" ]
then
   echo "start ..."
elif [ $TYPE == "stop" ]
then
   echo "stop ..."
elif [ $TYPE == "restart" ]
then
   echo "restart ..."
else
   echo "not support : $1"
fi

case word in
WORD1) …
;;
WORD2) …
;;
*) …
;;
esac

case $1 in
1|3|5)
   echo "红烧肉 ¥18.00"
;;
2|4)
   echo "驴肉火烧 ¥28.00"
;;
6|7)
	echo "豆芽 ¥2.00"
;;
*)
	echo"非法星期 $1"
;;
esac

循环结构
while [ EPRESSION ]
do

done

V="henry ariel pola"
				V=($V)
				IX=0
				while [ $IX -lt ${#V[*]} ]
				do
					echo ${V[$IX]}
					((IX++))
				done
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值