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 能够使用引入文件中的变量,函数等
浙公网安备 33010602011771号