linux_shell的一些练习

以前就听说过shell脚本,如今终于有机会来学习一下,都是跟着菜鸟教程一步一步的写下来的,也没有什么难的地方,就稍微的记录一下,以免日后忘记重新学,麻烦。

shell脚本给我的感受就是能够一次执行多个linux指令,配合他本身的流程控制语句,以及变量,运算符,比较语句等,更加的灵活。

例如:

if [ $1 -gt 10 ]
then
 mv 1.txt hello.txt
else
 rm 1.txt
fi

helloworld

创建一个新文件 vi helloworld.sh,文件的后缀没有特殊要求随便什么都行

写入

echo hello world!

修改文件的控制权限,使文件可执行

chmod +x helloworld.sh

运行 ./helloworld.sh

变量

#!/bin/bash
echo "Hello World !"
name="ly"

# readonly name 只读变量

# unset name 删除变量

#变量的赋值等号左右不能出现空格
str='1234567'
str2="1234567"
echo ${str}
echo "str2:${str2}"

# 单引号里的任何字符都会原样输出

#单引号字符串中的变量是无效的;
#例如
echo 'str1:${str}'
#但是可以这样,这样也表示字符拼接
echo 'str1:'${str}'    1111111'

# 获取字符串长度

echo ${#str2}
#截取字符串,下标从0开始,从哪个下标开始截,截几位
echo ${str2:1:3}
echo ${str2:3:1}
#查找字符串,这么麻烦? 索引却是从1开始的
index=`expr index "$str2" 64`
echo `expr index "$str2" 23`
echo ${index}
#数组的使用
echo "================"
myarrays=(12 13 14 56 767 89)
echo ${myarrays[4]}
echo ${myarrays[5]}
#获取所有元素 @ 和 * 都能表示取所有的元素
echo ${myarrays[@]}
echo ${myarrays[*]}
echo "不会吧不会吧,今年不会要六点下班吧"
#获取数组中元素的个数
echo ${#myarrays[*]}

数组

#!/bin/bash
echo "hello World"
a="121212"
#数组中可以使用变量
array=(a b c d e f $a)
for i in ${array[@]};
do
 echo $i
done
echo "while 循环"
j=0
while [ $j -lt ${#array[@]} ]
do
 #数组下标可以使用变量
 echo ${array[$j]}
 let j++
done

函数与传参

function addNum()
{
 a=$1
 b=$2
 val=$@
 echo "函数输入的参数为:$val"
 echo "函数参数的个数为:$#"
 #如果不写return语句 则以函数中最后一条语句的执行结果进行返回
 return $(( a+ b ))
}
addNum 2 3
# $? 可以暂存函数运行的结果 只能在函数执行完的下一句进行暂存
# 如果函数下一句执行了其他语句,则 $? 的值将变为0
echo "两数相加的和为:$?"
addNum 3 4
echo "两数相加的和为:"
echo "$?"
echo "加油 olg 20 -》 50 -》 100"
# 还有一些关于输入参数的比如 $1 $2是取第几个参 $* $@ 是将所有参数按照一行读入
# $# 表示函数参数的个数
# 给shell脚本传参的时候与给函数传参一样,使用的时候也一样,都是 $1,$2这样读取

运算符

val=`expr 1 + 2`
echo "两数之和为:${val}"
#运算符与数字之间必须有空格,* 号要进行转义,果然还是别抱有期待比较好
val2=`expr 2 \* 2`
echo $val2
val3=`expr 3 - 2`
echo $val3
val4=`expr ${val2} / 2`
echo $val4
val5=`expr 5 % 3`
echo $val5
#推荐用 $() 代替 ``
val6=$((3 + 4))
echo $val6
# == 与 !=这样的测试运算符要放在【】里
if [ $val5 == $val4 ]
then 
 echo "val5 和 val4 相等"
fi
if [ $val5 != $val3 ]
then 
 echo "val5 与 val3 不相等"
fi
#这不也能比较字符串?
if [ "abc" == "abcd" ]
then 
 echo "OK"
else
 echo "not ok"
fi
# -gt -lt -eq -ge -le ! -a -o || && 等比较与逻辑运算符
#[[]] 是 [] 运算符的扩充。能够支持 >, < 符号运算不需要转义符,它还是以字符串比较大小。里面支持逻辑运算符:|| && ,不再使用 -a -o。
if [[ $val5 > $val3 ]]
then 
 echo "val5 大于 val3"
fi
# 文件测试运算符还有一大堆,就是测试这个文件是一个什么类型的文件,是否可读,可写等
#这里就没有测试 就直接从菜鸟教程上copy来了

这是测试文件一些运算符,直接从菜鸟教程copy

-b file 检测文件是否是块设备文件,如果是,则返回 true。 [ -b $file ] 返回 false。
-c file 检测文件是否是字符设备文件,如果是,则返回 true。 [ -c $file ] 返回 false。
-d file 检测文件是否是目录,如果是,则返回 true。 [ -d $file ] 返回 false。
-f file 检测文件是否是普通文件(既不是目录,也不是设备文件),如果是,则返回 true。 [ -f $file ] 返回 true。
-g file 检测文件是否设置了 SGID 位,如果是,则返回 true。 [ -g $file ] 返回 false。
-k file 检测文件是否设置了粘着位(Sticky Bit),如果是,则返回 true。 [ -k $file ] 返回 false。
-p file 检测文件是否是有名管道,如果是,则返回 true。 [ -p $file ] 返回 false。
-u file 检测文件是否设置了 SUID 位,如果是,则返回 true。 [ -u $file ] 返回 false。
-r file 检测文件是否可读,如果是,则返回 true。 [ -r $file ] 返回 true。
-w file 检测文件是否可写,如果是,则返回 true。 [ -w $file ] 返回 true。
-x file 检测文件是否可执行,如果是,则返回 true。 [ -x $file ] 返回 true。
-s file 检测文件是否为空(文件大小是否大于0),不为空返回 true。 [ -s $file ] 返回 true。
-e file 检测文件(包括目录)是否存在,如果是,则返回 true。 [ -e $file ] 返回 true。

流程控制

#if 或者 else 不允许有空语句
if [ 1 == 3 ]
then 
 printf "%s\n"相等
else
 echo "不相等"
fi
time=10
if [ $time -gt 10 ]
then 
 printf "好困啊"
elif [ $time -lt 10 ]
then 
 printf "一点也不困"
else
 printf "正在变得好困"
fi
# for循环
for ((i=0;i<10;i++))
do
 echo $i
done
echo "for 循环数组"
array=(1 2 3 4 56 7 89 10)
for i in ${array[*]}
do
 echo $i
done
echo "while循环"
j=0
while [ $j -lt 10 ]
do
 echo $j
 let j++
done
echo "while 循环数组 ${#array[@]}"
i=0
while(($i < ${#array[@]}))
do
 echo ${array[$i]}
 let i++
done
#until循环 直到符合某种条件才会停止循环
echo "until 循环"
i=0
until(( $i > 10))
do
 echo "$i"
 let i++
done
echo "想拉屎了"
# switch case 就先不测试了,估计是用不到
# break 和 continue 在所有的语言中都是一样的

文件包含

使用 . 或者 source 来引入文件类似于 编程语言中的import 能够使用引入文件中的变量,函数等

posted on 2021-02-18 15:12  lyfa  阅读(98)  评论(0)    收藏  举报

导航