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