shell

shell编程

  • 第一个程序
    • 重点
    • 具体过程
    • 解释
  • shell变量
    • 定义变量
      • 变量名规范
    • 使用变量
    • 只读变量
    • 删除变量
    • 变量的作用域
  • shell数据类型
    • shell字符串
      • 获取字符串的长度
      • 提取子字符串
      • 查找子字符串
  • shell数组
    • 定义数组
    • 读取数组
      • 如何显示数组的所有元素?
    • 获取数组长度
  • shell流程控制
    • 条件语句
      • if
      • if-else 语句
      • if-elif-else语句
      • case语句
    • 循环语句
      • for循环
      • while循环
      • until循环
      • 跳出循环
  • shell函数
    • 函数定义
    • 函数调用
    • 函数参数
  • 总结

第一个程序

重点

  • 体会编写脚本的过程
  • 学会编写和执行脚本

具体过程

  1. vim test.sh
  2. #!/bin/bash
    echo "Hello World !"
  3. 执行sh test.sh

解释

  1. #!是一种约定俗成的标记,他来告诉系统应该使用什么样的解释器来执行
  2. echo命令用于向窗口输出内容

shell变量

定义变量

myname="ken"

变量名规范

  • 命名只能使用英文、数字和下划线,数字不能开头
  • 中间不能有空格,但是可以使用下划线
  • 不能使用标点符号
  • 不能使用bash的保留关键字(可以使用help查看保留字)

使用变量

使用一个定义过的变量,只要在变量名之前添加美元符号即可

myname="ken"
echo $myname
echo ${myname}

在变量名外加花括号是为了帮助解释器识别变量名的边界,加不加都可以。
注意:当你给变量重新赋值的时候,不需要使用$

myname="ken"
echo $myname
myname="Tim"
echo $myname

只读变量

使用readonly命令可以将变量定义为只读变量,只读变量的值不能够被修改

myname="ken"
readonly myname

删除变量

unset myname

变量被删除后不能再次使用,unset命令不能删除只读变量

变量的作用域

  1. 局部变量:局部变量只在当前shell实例中有效,其他shell启动的程序不能访问局部变量
  2. 环境变量:所有的程序,包括启动的多个shell实例,都可以访问环境变量,有些程序需要环境变量来保证其正常运行
  3. shell变量:shell程序中设置的特殊变量,有可能是局部变量有可能是环境变量,这些变量保证了shell的正常运行

shell数据类型

shell字符串

字符串可以用单引号,也可以用双引号,也可以不用引号
一般推荐使用双引号,因为:

  • 双引号中可以出现变量
  • 双引号中可以出现转义字符
  • 允许有空格出现

获取字符串的长度

str="abcd"
each ${#str}

提取子字符串

str="Hello linux.My name is ken!"
echo ${str:0:2}

0表示从0号开始,2表示两个字符

查找子字符串

shell数组

bash 支持一维数组,不支持多维数组,并且没有限定数组的大小,下表从0开始

定义数组

array_name=(value0 value1 value2……)

注意: 这里是以 空格分隔,不是逗号!!!!
还可以单独定义数组的各个分量

array[0]="ken"
array[1]="Tom"

读取数组

使用$

echo ${array[0]}

如何显示数组的所有元素?

使用@

echo ${array[@]}

获取数组长度

len=${#array[@]}

#是干什么用的?
获得参数的个数

shell流程控制

条件语句

if

if [condition]
then
	command
fi

示例

a="hello"
b="hello"
if [ $a = $b ]
then
	echo "a==b"
fi

**注意:**如果不加[]也是可以的,但是如果加的化,中括号前后都要有空格,if后的分号可选,不影响;等号只能判断字符串是否相等且需要前后都有空格,否则是赋值语句永真,以后我们还会总结所有的符号。
示例:将上述写成一行在命令行中运行

a="hello"
b="hello"
if [ $a = $b ];then echo "a==b";fi 

if-else 语句

if condition
then
	command
else
	command
fi

示例

a="hello"
b="world"
if [ $a = $b ]
then
	echo "a==b"
else
	echo "a!=b"

示例:将上述示例写成一行在命令行中执行

a="hello"
b="world"
if [ $a = $b ];then echo "a==b";else echo "a!=b";fi

注意注意:变量的使用一定要有$,变量的赋值不需要有!!

if-elif-else语句

if condition1
then
	command1
elif condition2
then
	command2
else
	command3
fi

示例

a=1
b=2
if [ $a -gt $b ]
then
	echo "a>b"
elif [ $a -eq $b ]
then
	echo "a==b"
else
	echo "a

case语句

echo "输入1到4的数字:"
echo "你输入的数字为:"
read aNum
case $aNum in
	1) echo "你选择了1"
	;;
	2) echo "你选择了2"
	;;
	3) echo "你选择了3"
	;;
	4) echo "你选择了4"
	;;
esac

循环语句

for循环

for var in item1 item2...
do
	command
done

示例

for count in "a" "b" "c"
do
	echo $count
done

**疑问:**能否遍历数组?

for i in ${array[@]}
do
	echo $i
done

复习:${array[@]}能返回数组中的所有元素
**疑问:**能否将一个字符串中的每一个字符取出?

str="This is a test."
for((i=0;i<${#str};i++))
do
	echo -e "${str:i:1}\n"
done

注意:for循环中的i没有使用$
示例:以上的例子写成一行命令行代码

for i in ${array[@]};do echo $i ;done;

while循环

while condition
do
	command
done

示例

count=1
while(($count<5))
do
	echo $count
	let "$count++"
done

until循环

until condition
do
	command
done

conditionfalse继续执行循环体内的语句,直到condition不满足就停止

a=0
until ((a>=5))
do
	echo "$a"
	let "a++"
done

跳出循环

break跳出循环
continue回到循环头

shell函数

函数定义

[ function ] funname [ () ]
{
	action
	[return int;]
}

示例

function myecho(){
	echo "hello world"
}
echo "---函数开始---"
myecho
echo "---函数结束---"

我们终于写到世界著名的hello world程序了!!!

function calculate(){	
	read a
	read b
	c=$((a+b))
	return $c
}
calculate
d=$?
echo "两数相加的结果是$d"

有的人可能想要问,我想像c++或者java或者python程序一样有参数输入呢?别着急,往下看

函数调用

经过上面的例子我们已经知道了函数调用就是直接写出函数名就可以了,如果有参数就往后顺延着写

function parm(){	
	echo "第一个参数是:${1}"
	echo "第一个参数是:${2}"
	echo "第一个参数是:${3}"
}
parm 1 2 3

函数参数

函数参数上面已经用过了,我们再使用一个函数实验一下吧!

function add(){
	return $((${1}+${2}))
}
read a
read b
add a b
c=$?
echo "$a$b的相加结果是$c"

好了,我们应用输入两个数,然后把这两个数给了函数,函数计算出结果,我们取出返回值,打印。是不是和其他语言有点像了?

总结

一个语言基本的东西都已经说了,也即数据类型、数组、条件语句、循环语句、函数。接下来我想写点shell和其他语言不同的或者说应该注意的东西!

你可能感兴趣的:(shell)