shell编程

shell编程

1.简介
1.1什么是shell

把在终端运行的命令保存到文件中,这个文件就是shell程序

简单的说,shell编程就是第Linux命令的逻辑化处理

1.2shell解析器的类型

bash,ash,ksh等,默认使用bash

演示命令:
echo $SHELL/$0
/bin/bash
1.3shell的作用

如果需要反复执行某些Linux命令,则可以将这些命令写到一个shell脚本中,然后每次只需要运行一下这个脚本即可

2.第一个shell程序
2.1实现

打开文本编辑器(可以使用 touch命令来创建文件),新建一个文件 test.sh,扩展名为 sh(sh代表shell),扩展名并不影响脚本执行,见名知意就好

代码演示:

#!/bin/bash
#打印hello world
echo "Hello World !"
2.2运行

方式一:作为可执行程序

touch test.sh
vim test.sh
chmod +x ./test.sh
./test.sh

方式二:作为解释器参数

bin/bash test.sh 
3.shell中的变量
3.1变量的定义
  • 命名只能使用英文字母,数字和下划线,首个字符不能以数字开头。
  • 中间不能有空格,可以使用下划线(_)。
  • 不能使用标点符号。
  • 不能使用bash里的关键字(可用help命令查看保留关键字)

定义:变量名=值

演示命令:
name="zhangsan"
echo $name
num=10
echo ${num}

# 注意:变量名外面的花括号是可选的,加不加都行,加花括号是为了帮助解释器识别变量的边界
echo "his name is ${name}"
3.2只读变量

readonly:只读,将变量声明为readonly,只读变量的值不能发生改变

myUrl="http://www.baidu.com"
readonly myUrl
myUrl="http://www.1000phone.com"

#运行脚本,报错:/bin/sh: NAME: This variable is read only
3.3删除变量

unset:删除变量

代码演示:
myUrl="http://www.baidu.com"
unset myUrl
echo $myUrl

#变量被删除后不能再次使用。unset 命令不能删除只读变量。
#以上实例执行将没有任何输出
4.字符串和数组
4.1字符串

双引号或者单引号

单引号的限制:

​ a.单引号中的任何字符都会原样输出,单引号字符串中的变量是无效的

​ b.单引号字符串中不能再出现单引号【对单引号进行转义后去不起作用】

总结:

​ 双引号:可以包含除了$、`、\、‘‘之外的任意字符

​ 单引号:其中的任意字符都不会被解析,都会原样输出

​ 反引号:会将其中的内容作为命令执行

​ 反斜线:转义特定的字符,如:&、*、^、等

代码演示:

代码演示:
#!/bin/bash

#定义字符串
your_name='qinjx'
str="Hello, I know you are \"$your_name\"! \n"

#拼接字符串
your_name="qinjx"
greeting="hello, "$your_name" !"
greeting_1="hello, ${your_name} !"
echo $greeting $greeting_1

#获取字符串长度
string="abcd"
echo ${#string} #输出 4

#提取子字符串
string="1000phone is a great site"
echo ${string:1:4}       #从下标1开始,长度为4

#查找子字符串
string="1000phone is a great company"
echo `expr index "$string" is`  
# 查找字符i或s的位置

#注意: 以上脚本中 "`" 是反引号,而不是单引号 "'",不要看错了哦
4.2数组

bash只支持一维数组,不支持多维数组

并没有限制数组的大小

数组元素的下标也是从0开始的,获取数组中的元素使用下标

定义数组:数组名=(值1 值2 值3…)

注意:shell中的数组元素之间使用空格分隔

代码演示

#数组的定义
arr1=(10 20 30 40)
echo $arr1
arr2=(10 20 30 40)
echo $arr2

#数组的使用
#读取数组中的元素
echo ${arr1[2]}
#如果要读取数组中的全部元素
echo ${arr2[@]}

# 取得数组元素的个数
length=${#arr1[@]}
echo $length
# 或者
length=${#arr1[*]}
echo $length
# 取得数组单个元素的长度
lengthn=${#arr1[3]}
echo $lengthn
5.shell中的运算符

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

代码演示:

val=`expr 1 + 2`
echo "两数之和为 : $val"

#1.算术运算符
val=`expr $a + $b`
echo "a + b : $val"

val=`expr $a \* $b`
echo "a * b : $val"

#2.关系运算符
## []中,前后都需要空格
if [ $a -eq $b ]
then
   echo "$a -eq $b : a 等于 b"
else
   echo "$a -eq $b: a 不等于 b"
fi

#3.逻辑运算符
if [ 1 -lt 3 ] && [ 2 -lt 3 ]; 
then
	echo "ok"
fi
6.echo、printf、test命令

1>echo

字符串的输出

echo -e "OK! \n" 		# -e 开启转义,\n 显示换行
echo -e "OK! \c"		 # -e 开启转义 \c 不换行

echo `date`    #显示命令执行结果
#注意: 这里使用的是反引号 `, 而不是单引号 '。
#结果为:Thu Jul 24 10:08:46 CST 2014

2> printf

printf 中使用格式化字符串,还可以制定字符串的宽度、左右对齐方式等

printf "%-10s %-8s %-4s\n" 姓名 性别 体重kg  
printf "%-10s %-8s %-4.2f\n" 张三 男 66.1234 
printf "%-10s %-8s %-4.2f\n" 李四 男 48.6543 

注意:

​ %s %d %f都是格式替换符

​ -10s:指的是一个宽度为10的字符(-表示左对齐,没有则表示右对齐),任何字符都会填充在这10个字符内,如果不足则使用空格自动填充

​ -4.2f:指的是格式化为小数,其中.2表示保留小数点后两位

3> test

test 命令用于检查某个条件是否成立,它可以进行数值、字符和文件三个方面的测试

#1.数值测试
num1=100
num2=100
if test $[num1] -eq $[num2]
then
    echo '两个数相等!'
else
    echo '两个数不相等!'
fi

#2.字符串测试
num1="hello"
num2="hello11"
if test $num1 = $num2
then
    echo '两个字符串相等!'
else
    echo '两个字符串不相等!'
fi

#3.文件测试
cd /bin
if test -e ./bash
then
    echo '文件已存在!'
else
    echo '文件不存在!'
fi

test命令用来监测某个条件是否成立,他可以进行数值,字符和文件的监测

7.shell中的流程控制语句
7.1分支语句

if

代码演示:

#if语句
#单分支
if [ 1 -lt 3 ] && [ 2 -lt 3 ]; 
then
	echo "ok"
fi

#双分支
num1=$[2*3]
num2=$[1+5]
#if else语句经常与test命令结合使用
if test $[num1] -eq $[num2]
then
    echo '两个数字相等!'
else
    echo '两个数字不相等!'
fi

#多分支
a=10
b=20
if [ $a == $b ]
then
   echo "a 等于 b"
elif [ $a -gt $b ]
then
   echo "a 大于 b"
elif [ $a -lt $b ]
then
   echo "a 小于 b"
else
   echo "没有符合的条件"
fi


#case语句
echo '输入 1 到 4 之间的数字:'
read aNum
case $aNum in
    1)  echo '你选择了 1'
    ;;
    2)  echo '你选择了 2'
    ;;
    3)  echo '你选择了 3'
    ;;
    4)  echo '你选择了 4'
    ;;
    *)  echo '你没有输入 1 到 4 之间的数字'
    ;;
esac
7.2循环语句

for

代码演示:

#for语句
#需求:顺序输出当前列表中的数字
for num in 1 2 3 4 5
do
    echo "The value is: $num"
done


#需求:顺序输出字符串中的字符
for str in 'This is a string'
do
    echo $str
done

#需求:遍历数组中的所有元素
a=(1 2 3)
  for x in ${a[*]}
  do 
  	echo $x
  done
8.函数

代码演示:

#无参无返回值
#定义函数
demo()
{
	echo 'hello world'
}
#调用函数
demo

#有返回值
funWithReturn(){
    echo "输入第一个数字: "
    read aNum
    echo "输入第二个数字: "
    read anotherNum
    return $(($aNum+$anotherNum))
}
funWithReturn
echo  $? 

#有参有返回值
arg()
{
	echo $1
	echo $2
	echo $#
	echo $*
	return 123
}

arg 1 2
# $? 表示函数的返回值
echo $?
参数处理说明
$#传递到脚本的参数个数
$*以一个单字符串显示所有向脚本传递的参数
$$脚本运行的当前进程ID号
$!后台运行的最后一个进程的ID号
$@与$*相同,但是使用时加引号,并在引号中返回每个参数。
$-显示Shell使用的当前选项,与set命令功能相同。
$?显示最后命令的退出状态。0表示没有错误,其他任何值表明有错误。
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值