shell的入门编程

mkdir /home/scripts  创建一个文件夹
touch  01.sh   创建一个文件
vi  01.sh   进行编辑
通过输入i  进行编辑
esc退出编辑,:wq!  进行保存

假如你在windows上编写了一个脚本,放入linux中运行,会报错:

原因是字符集问题:

变量

写法:

your_name="zhangsan" 这个中间不能有空格,变量名和等号之间不能有空格

所谓的脚本就是将我们经常使用的linux命令汇总在一个文件中而已

unset 不能删除 只读变量

字符串(重要)

在我们的shell编程中,字符串可以使用单引号,双引号,也可以不用任何引号

单引号和双引号的区别:

当引号里面有 $变量时,

单引号是把变量当成字符串打印出来,

双引号是把变量的值给打印出来

获取字符串的长度:
skill="java"
echo ${#skill}  打印该字符串的长度

查找子字符串,是分开查找的,不能看做是查找子字符串。

echo `expr index "$str" ia`
如果是这样的情况,返回的是 字母a 所在的下标,我们可以将后面这个词看做分开查找的。
ia  == i  a  
先查找ia 有没有

参数

$0 表示当前运行的文件名字
$n  表示第n个参数
一定要写在双引号里面
#!/bin/bash
echo "查看shell脚本中的参数"
echo "目前正在执行的脚本的名字是:$0"
echo "获取到的第一个参数是:$1"
echo "获取到的第二个参数是:$2"
#!/bin/bash
echo "第一个参数是$1"
echo "总共有几个参数:$#"
echo "这些参数分别是什么:$*"
echo '验证是否可以使用单引号:$2'
  • $* 以字符串的形式展示所有的参数

  • $@ 拿到所有的参数,可以当做一个数组

shell脚本中的运算符

shell和其他的编程一样,是支持运算的,但是我们的bash 不支持。

我们可以借助 expr 这个表达式工具完成,数据之间的加减乘除运算

bash中也可以不使用expr 进行运算

可以使用 (( )) $(( )) $[] 进行算数运算

((a++)) 可以执行类似于这样的运算

将两个值进行运算 $((3 + 5))

a=2

b=3

$((a + b)) // 可以

$$($$a + $b)) //也可以

流程控制 (if else switch)类似这样的用法

#!/bin/bash
a=20
if [ $a -gt 10 ];then
   echo "a的值大于10"
fi

编写条件的时候,使用[]  里面的代码跟[]  之间有空格,否则报错!

#!/bin/bash
a=$1
if [ $a -gt 10 ];then
  echo "a大于10"
else
  echo "a 小于等于10"
fi
#!/bin/bash
a=20
if [ $a -gt 10 ];then
   echo "a的值大于10"
fi

编写条件的时候,使用[]  里面的代码跟[]  之间有空格,否则报错!

#!/bin/bash
a=$1
if [ $a -gt 10 ];then
  echo "a大于10"
else
  echo "a 小于等于10"
fi
关系运算符的一些转换字符

 

运算符说明英文举例
-eq检测两个数是否相等,相等返回 true。equal[ b ] 返回 false。
-ne检测两个数是否不相等,不相等返回 true。not equal[ b ] 返回 true。
-gt检测左边的数是否大于右边的,如果是,则返回 true。greater than[ b ] 返回 false。
-lt检测左边的数是否小于右边的,如果是,则返回 true。less than[ b ] 返回 true。
-ge检测左边的数是否大于等于右边的,如果是,则返回 true。Greater than or equal to[ b ] 返回 false。
-le检测左边的数是否小于等于右边的,如果是,则返回 true。Less than or equal to[ b ] 返回 true。

读取我们控制台的数据

类似于我们之前Java里面的Scanner

read -p "请输入您的姓名:"  name
echo $name
#!/bin/bash
read -p "请输入用户名:" name
read -p "请输入密码:" password
if [[ $name = 'root' && $password = '123456' ]]; then
 echo "登录成功"
else
 echo "登录失败"
fi

比较数字,使用 -eq 
比较字符串  使用 = 或者 ==
假如有多个条件,使用 [[   ]]

Shell的基础语法

1、循环语句

1)for循环

for 变量  in (list); do
  // 编写执行的语句
done
#!/bin/bash
for i in 1 2 3 4 5;do
  echo $i
done

for i in {1..100};do
  if [ $[ i % 10 ] -eq 0 ]; then
    echo $i
  fi
done

for i in {1..100};do
  if (( (i % 10) == 0 )); then
    echo $i
  fi
done

for i in {1..100..2};do
  echo "奇数为:$i"
done

echo "--------给一个目录下的所有文件赋权限---------"
for file in `ls /home/scripts`;do
   echo $file
   chmod u+x $file
done
#!/bin/bash
num=0
for i in 1 2 3 4 5;do
 num=$[i+num]
done
echo $num
echo "---------------------"
for i in {1..100};do
  if [ $[i%2] -eq 0 ];then
    echo "$i是偶数"
  fi
done

2)while循环

while 条件; do
   执行语句
done

// 死循环
while true; do
   执行语句
done
1~100之间相加
#!/bin/bash
echo "--------for循环版本-----------"
num=0
for i in {1..100};do
  num=$[num+i]
done
echo "结果为$num"
echo "----------while循环--------------"
sum=0
i=1
while [ $i -le 100 ];do
  sum=$[sum+i]
  ((i++))
done 
echo "计算结果为:$sum"
// 每隔一秒钟打印一个当前时间
#!/bin/bash
while true; do
    date
    sleep 1
done

2、分支语句中的switch

switch 写法其实是if 写法的一个  语法糖(有他没他都无所谓)
在控制台输入数据 1~7,如果是1 打印星期一

#!/bin/bash
echo "请输入1~7之间的数字"
read num
case $num in
1) echo "星期一"
  ;;
2) echo "星期二"
  ;;
3) echo "星期三"
  ;;
4) echo "星期四"
  ;;
5) echo "星期五"
  ;;
6) echo "星期六"
  ;;
7) echo "星期日"
  ;;
esac
#!/bin/bash
read -p "请输入你喜欢的季节:" season
case $season in
 "春天")
   echo "春天可以放风筝" ;;
 "夏天")
   echo "夏天可以吃西瓜" ;;
 "秋天")
   echo "秋天可以吃很多水果" ;;
 "冬天")
   echo "冬天可以吃火锅" ;;
esac

3、跳出循环(break contiune)

break      跳出所有的循环
continue   跳出本次循环
每隔1s打印时间,当打印到第10次的时候,跳出该循环
#!/bin/bash
i=1
while true; do
    date
    sleep 1
    if [ $i -eq 10 ];then
       break
    fi
    ((i++))
done
continue 跳出本次循环,进入下一个循环
打印1~100之间不是10的倍数的数字
#!/bin/bash
for i in {1..100}; do
   if test $[ i % 10 ] -eq 0; then
       continue
   fi
   echo $i
done

#!/bin/bash
echo "打印1~100之间不是10的倍数的数字"
for i in {1..100};do
  if [ $[i%10] -ne 0 ];then
    echo $i
  else
    continue
  fi
done

test的用法:

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

数字比对:
num1=100
num2=100
if test $[num1] -eq $[num2]
then
    echo '两个数相等!'
else
    echo '两个数不相等!'
fi

字符串比较:
num1="ru1noob"
num2="runoob"
if test $num1 = $num2
then
    echo '两个字符串相等!'
else
    echo '两个字符串不相等!'
fi

文件的操作:
cd /bin
if test -e ./bash
then
    echo '文件已存在!'
else
    echo '文件不存在!'
fi

-e 如果文件存在则为真

-d 如果文件存在且目录为真

-f 如果文件存在且为普通文件则为真

4、函数(类似于java中的方法

#!/bin/bash
function showName()
{
  echo "该方法被执行了"
}

showName

定义带参的方法:

function func2()
{
  echo "第一个参数是$1"
  echo "第二个参数是$2"
  echo "总共有几个参数:$#"
  echo "所有参数是:$*"
}

1 ,100,1000分别是$1,$2,$3
func2 1 100 1000

方法可以有返回值:

参数的返回: return 返回值

写一个案例,了解一下

#!/bin/bash
function showName(){
  echo "你调用了这个方法"
  echo "第一个参数$1"
  echo "第二个参数$2"
  return $[ $1 + $2 ]
}
showName 110 119
val=$?
echo $val

风凉话:假如两个值的结果大于了255,也不准了。

想要返回值是字符串,可以通过打印来解决,一般没有返回值的话,返回最后的输出结果。
function validateStr(){
  echo "abc"
}
vvv=`validateStr`
echo $vvv

5、数组

bash中,只支持一维数组,不支持多维数据。

my_arr=(a b c d "E") 定义数组,并且赋值。
//直接通过下标赋值
my_arr2[0]=hello
my_arr2[1]=world
my_arr2[2]=java

数组的循环:

第一种方式类似于:foreach

#!/bin/bash
my_arr=(AA BB CC)
for str in ${my_arr[*]}
do
  echo $str
done

第二种使用下标的方式

#!/bin/bash
my_arr=(AA BB CC)
length=${#my_arr[*]}
for((i=0;i<length;i++));
do
  echo ${my_arr[$i]}
done


循环中,不是用$符号也可以的。

6、脚本文件相互加载

类似于之前java语言中的 import

a.sh 中定义了一个数组,b.sh中直接使用

a.sh中直接定义个数组

#!/bin/bash
echo "我是a脚本文件:"
my_arr=(AA BB CC)

b.sh中使用a.sh中的数组(使用之前要加载,类似于java中的导包)

#!/bin/bash
source ./a.sh  #加载文件中的内容

for str in ${my_arr[*]}
do
  echo $str
done

  • 11
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值