shell编程基础

第一个shell脚本

创建shell文件:
vi test.sh
第一个脚本:
#! /bin/bash
echo “Hello World!”
保存:
esc+:wq
进入对应路径:
cd 到相应路径
执行程序:
chmod+x ./test.sh #使得脚本具有执行权限
./test.sh # 执行脚本

shell变量

eg:your_name=“runoob.com”
注意:变量名和等号之间不能有空格。
变量名命名规则:
1.命名只能使用英文,数字下划线,首字母不能以数字开头
2.中间不能有空格,可以使用下划线
3.不能使用标点符号
4.不能使用bash里面的关键字

eg:将/etc下目录的文件名循环出来
for file in ‘ls /etc’
for file in $(ls /etc)

使用变量

使用一个定义过的变量,只要在变量名前面加上美元符号
eg:
your_name=“qinjx”
echo $your_name
echo ${your_name}
{}花括号帮助解释器识别变量的边界(给变量加上{}好习惯)
eg
for skill in Ada Coffe Action Java:do
echo “I am good at ${skill}Script”
done
eg
your_name=“tom”
echo $your_name
$your_name=“alibaba”
echo $your_name

只读变量

readonly命令可以将变量定义为只读变量,只读变量的值不能改变
eg
#! /bin/bash
myurl=“https://www.google.com”
readonly myurl

删除变量

unset命令可以删除变量,
unset variable_name
变量删除后不能再次使用,unset命令不能删除只读变量,
#! /bin/bash
myurl=“https://www.runoob.com”
unset myurl
echo $myurl

变量类型

局部变量:局部变量在脚本或命令中定义,仅在当前shell实例中有效,其他shell启动的程序不能访问局部变量
环境变量:所有的程序,包括shell启动的程序都能访问环境变量,有些程序需要环境变量来保证其运行,必要时候shell脚本可以定义环境变量
shell变量:shell变量是由shell程序设置的特殊变量,shell变量中有一部分是环境变量,有一部分是局部变量,这些变量保证了shell的正常运行

shell字符串

字符串可以用单引号,可以用双引号,也可以不用引号


单引号:str='this is a string' 单引号字符串的限制:单引号的任何字符都会原样输出,单引号中字符串中的变量是无效的。
双引号 : eg: your_name="runoob" str="Hello ,I know you are \"$your_name\"! \n" echo -e $str 双引号里面可以有变量 双引号里可以出现转义字符

拼接字符串

eg
your_name=“runoob”
greeting=“hello,”$your_name" !"
greeting_1=“hello, ${your_name}!”
echo $greeting $greeting_1

获取字符串长度

string=“abcd”
echo ${#string}

提取字符串

以下实例从字符串第2个字符开始截取4个字符
eg
string=“runoob is a great site”
echo ${string:1:4}

查找子字符串

查找字符i或者o的位置,(哪个字母先出现就计算哪个)
string=“runoob is a great site”
echo 'expr index “$string” io`

shell数组

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

定义数组

eg:
array_name=(value0 value1 value2 value3)
or
array_name[0]=value0
array_name[1]=value1
array_name[2]=value2
array_name[3]=value3

读取数组

读取数组元素格式:${数组名[下标]}
@可以获取数组中所有元素:
echo ${array_name[@]}

获取数组长度

获取数组元素的个数:
length=$ {#array_name[@]}
length=$ {#array_name[*]}
获取数组单个元素的长度
length=${#array_name[n]}

注释

单行注释: #开头
多行注释:
:<<EOF
注释文字
EOF

shell参数传递

执行shell脚本时,向脚本传递参数,脚本内获取参数的格式是:$n
向脚本传递三个参数,并分别输出,其中 $0为执行的文件名
eg
#! /bin/bash
echo “Shell 传递参数实例!”;
echo “执行的文件名:$0”;
echo “第一个参数为: $1”;
echo “第二个参数为: $2”;
echo “第三个参数为: $3”;
为脚本设置可执行权限,并执行脚本,输出结果
$ chmod +x test.sh
$ ./test.sh 1 2 3
Shell 传递参数实例!
执行的文件名:./test.sh
第一个参数为:1
第二个参数为:2
第三个参数为:3

shell数组

eg创建一个简单的数组:my_array
my_array=(A B “C” D)
读取数组:
echo “第一个元素为:$ {my_array[0]}”
echo “第二个元素为:$ {my_array[1]}”
echo “第三个元素为:$ {my_array[2]}”
echo “第四个元素为:$ {my_array[3]}”
执行脚本:
chmod +x test.sh
./test.sh

array_name[0]=value0
array_name[1]=value1
array_name[2]=value2

Shell基本运算符

运算符包括:算数,关系,布尔,字符串,文件测试
eg
#! /bin/bash
val=反引号expr 2 + 2反引号
echo “两个数之和为:$val”
注意:表达式和运算符之间有空格,``反引号的使用

  • expr $a + $b
    在这里插入图片描述
    eg
    a=10
    b=20
    val=expr $a + $b
    echo “a + b :$val”

val=expr $a- $b
echo “a - b : $val”

val=expr $a \* $b
echo “b / a :$val”

if [ $a == $b]
then
echo “a 等于 b”
fi

if[ $a != $b]
then
echo “a 不等于 b”
fi

注意:
*乘号前面必须加\才能运行
if
then
fi

关系运算符

关系运算符只支持数字
在这里插入图片描述

if [ $a -eq $b]
then
echo " $a -eq $b:a 等于 b"
else
echo " $a -q $b:a 不等于 b"
fi

两个数是否相等-eq
两个数是否不等-ne
左边的数是否大于右边-gt
左边的数是否小于右边-lt
左边的数是否大于等于右边-ge
左边的数是否小于等于右边-le

布尔运算

在这里插入图片描述

or,and

#! /bin/bash
a=10
b=20
if [ $a != $b ]
then
echo " $a != $b :a 不等于 b"
else
echo " $a == $b:a 等于 b"
fi

逻辑运算符

&& 逻辑的AND
|| 逻辑的OR
eg
#! /bin/bash
a=10
b=20
if [[ $a -lt 100 && $b -gt 100 ]]
then
echo “返回true”
else
echo " 返回false"
fi

if [[ $a -lt 100 || $b -gt 100 ]]
then
echo “返回true”
else
echo “返回false”
fi

字符串运算符

在这里插入图片描述
a=“abc”
b=“efg”
if [ $a = $b ]
then
echo " $a = $b:a 等于 b"
else
echo " $a = $b:a 不等于 b"
fi

if [ $a != $b]
then
echo " $a 1= $b :a 不等于 b"
else
echo " $a != $b :a 等于 b"
fi

文件测试运算符

在这里插入图片描述

echo命令

1显示普通字符:
echo “It is a test”
2显示转义字符:
echo “” It is a test""
3显示变量
vi test.sh

#! /bin/bash
read name
echo “$name It is a test”

sh test.sh
OK
OK It is a test

4显示换行
echo -e “OK! \n”
echo “It is a test”

5显示不换行
#! /bin/bash
echo -e “OK! \c”
echo “It is a test”
输出结果:OK!It is a test

6显示结果定向至文件
echo “It is a test”> myfile

7原样输出字符串,不进行转义或取变量(用单引号)
echo '$name" ’
输出结果: $name/"

8显示命令执行结果
echo ‘date’

printf

printf format-string [arguments…]
format-string 格式控制字符串
arguments 参数列表

eg
$ echo “Hello.Shell”
Hello,Shell

$ printf “Hello,Shell\n”
Hello,Shell

printf "%-10s %-8s %-4s\n"姓名 性别 体重kg
printf "%-10s %-8s %-4.2s\n"郭靖 男 66
printf "%-10s %-8s %-4.2s\n"杨过 男 47
printf "%-10s %-8s %-4.2f\n"芙蓉 女 46

格式替代符:%s,%c,%d,%f
%s输出一个字符串
%d整型输出
%c输出一个字符
%f输出实数,以小数形式输出

%-10s :指的是宽度为10个字符,-表示左对齐
%-4.2f :指格式化为小数,其中.2保留2位小数

printf转义字符

在这里插入图片描述
$ printf “a string , no processing:<%s>\n” “A\nB>”

a string , no processing:< A

$ printf " a string,no processing:<%b>\n “A\n”
a string , processing:< A
B >

$ printf " www.runoob.com \a"
www.runoob.com $

test命令

test命令可以用于检查某个条件是否成立,它可以进行数值,字符,文件三方面测试
在这里插入图片描述
eg
num1=100
num2=100
if test $[num1] -eq $[num2]
then
echo ‘两个数相等’
else
echo’两个数不相等’
fi

eg
#! /bin/bash
a=5
b=6
result=$[a+b]
echo “result为: $result”

字符串测试

在这里插入图片描述
num1=“ru1noob”
num2=“runoob”
if test $ num1=$ num2
then
echo ‘两个字符串相等’
else
echo ‘两个字符串不等’
fi

文件测试

在这里插入图片描述
eg
cd /bin
if test -e ./bash
then
echo ‘文件已经存在’
else
echo ‘文件已经不存在’
fi

shell流程控制

if else
fi

if condition
then
command1
command2
command3
fi

if condition1
then
command1
elif condition2
then
command2
elif condition3
then
command3
else
commandN
fi

if else-if else
if condition1
then
command1
elif condition2
then
command2
elif condition3
then
command3
else
commandN
fi

条件判断:大于使用-gt
小于使用-lt

使用[[ ]]作为判断语句,大于小于可以直接使用><
if (( a > b ));then

fi

eg
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

a=10
b=20
if (( $a == $b))
then
echo “a 等于 b”
elif (( $a > $b))
then
echo “a 大于 b”
else
echo “没有符合的条件”
fi

eg
num1=$ [2*3]
num2=$ [1+5]
if test $[num1] -eq $[num2]
then
echo ‘两个数字相等’
else
echo ‘两个数字不相等’
fi

for循环

for var in item1 item2 item3 …itemN
do
command1
command2
command3
done
for循环执行一次所有命令,使用变量名获取列表中当前取值。命令可为任何有效的shell命令和语句,in列表可以包含替换,字符串和文件名
eg
for loop in 1 2 3 4 5
do
echo “The value is : $loop”
done

eg顺序输出字符串:
#! /bin/bash
for str in This is a string
do
echo $str
done

while语句

while condition
do
command
done

以下是一个基本的while循环,测试条件是,如果int小于等于5,那么条件返回真,int从1开始,每次循环处理时,int加上1,运行上述脚本,返回数字1-5,然后终止。

#! /bin/bash
int=1
while(( $int<=5 ))
do
	echo $int
	let "int++"
done

case…esac

多选择语句
;;表示break

case 值 in
模式1)
command1
command2
commandN
;;
模式2)
command1
command2
commandN
;;
esca

无一匹配用*捕获该值

echo '请输入1-4之间的数字'
echo '您输入的数字是:'
read aNum
case $aNum in
	1) echo '你选择了1'
	;;
	2) echo '你选择了2'
	;;
	3) echo '你选择了3'
	;;
	4) echo '你选择了4'
	;;
	*) echo '你没有输入1-4之间的数字'
	;;
esca

eg脚本匹配字符串

#! /bin/bash

site="runoob"

case "$site" in
	"runoob") echo "菜鸟教程"
	;;
	"google") echo "Google 搜索"
	;;
	"taobao") echo "淘宝网"
    ;;
esca

跳出循环

循环过程中,有时候需要在未达到循环结束条件时强制跳出循环,shell使用两个命令来实现:
break continue

break

#! /bin/bash
while:
do
	echo -n "输入1-5之间的数字:"
	read aNum
	case $aNum in
	1|2|3|4|5)echo "你驶入的数字为:$aNum"
	;;
	*) echo "你输入的数字不是1-5之间的数字,游戏结束"
	break
	;;
	eaca
done

continue

仅跳出当前循环

#! /bin/bash
while :
do 
	echo -n "输入1-5之间的数字:"
	read aNum
	case $aNum in
	1|2|3|4|5) echo "你输入的数字是 $aNum"
	;;
	*) echo "你输入的数字不是1-5之间的"
	continue
	echo "游戏结束"
	;;
	eaca
done

"游戏结束"永远不会执行

shell函数

函数格式:
[ function ] funname [()]
{
action:
[return int;]
}

#! /bin/bash
demoFun(){
	echo "这是我的第一个shell函数"
}
echo "-----函数开始执行-----"
demoFun
echo "-----函数执行完毕-----"

eg

#! /bin/bash

funWithReturn(){
	echo "这个函数会对输入的两个数字进行相加运算。。。。"
	echo "输入第一个数字:"
	read aNum
	echo "输入第二个数字"
	read anotherNum
	echo "两个数字分别是 $aNum$anotherNum !"
	return $(($aNum + $anotherNum))
}
funWithReturn
echo "输入的两个数字适合为 $? !"
#! /bin/bash
funwithParam(){
	echo "第一个参数为 $1"
	echo "第二个参数为 $2"
	echo "第十个参数为 $10"
	echo "第十个参数为${10}"
	echo "第十一个参数为 ${11}"
	echo "参数总数有 $# 个"
	echo "作为一个字符串输出所有参数 $*"
}
funwithParam 1 2 3 4 5 6 7 8 9 34 73

shell输入/输出重定向

在这里插入图片描述

输出重定向:>(输出重定向会覆盖文件内容)

command1 > file1
执行command1然后将输出的内容存入file1
file1内部已经存在的内容被新内容替代

eg
who > users
没有在终端输出信息,因为输出已经被从默认的标准输出设备重定向到指定的文件。
cat users

echo “菜鸟教程:www.runoob.com”>users
cat users

使用 > >追加到文件末尾,可以不覆盖文件内容

输入重定向<

command1 < file1
这样,原本需要从键盘获取输入的命令会转移到文件读取内容。

  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值