shell基础知识

shell脚本

shell脚本执行

  • chmod +x xx.sh ;./xx.sh
  • 注意点:最好使用第一种

注释

  • :代表单行注释

shell脚本是一个弱类型的语言

  1. 不需要指定数据类型
  2. 如果变量没有定义,那么这变量默认为空
  3. 如果shell脚本文件某一行出错,不会影响我整个程序的运行

标识符的命名规范

  • 硬件规范
  1. 不能数字开头
  2. 只能由字母,下划线,数字构成
  3. 不能与shell脚本的关键字相同if printf echo case等
  • 建议:
  1. 不准用拼音,多查字典
  2. 建议使用驼峰命名规范numOfStudent
  3. 见名知义

变量的定义

  1. 变量=值
  • 注意点:变量一定义出来,就必须给他一个值,否则语法错误
  • =号左右两边不能有空格
  • 如果右边是字符串,用""括起来
  1. 变量的使用
  • 以$符号开头

echo简单用法

  1. echo:表明输出命令,输出echo后面的内容,会自动换行
  2. echo后面是否加"",'',不加;
  • 加''里面写什么输出什么;例如value="hello"
    echo '$value';输出结果是$value
  • 不加;降低程的可读性
  • 加"";能避免上面两个缺点
  • value="hello"
    echo "{$value}1"
    加{},不是(),为了分清变量

shell转义字符

  1. \n:代表换行
  2. \t:相当于敲了一个tab键的宽度

echo -e开启转义

  1. 如果是./xx.sh运行shell脚本,必须开启转义; value="hello"
    echo "$value\n"是不会换行
  2. 开启转义对特殊字符进行处理
    echo -e "${value}\n"
  3. 如果是sh xx.sh运行shell脚本,不需要开启转义
    value="hello"
    echo "${value}\n"是会换行的

变量的删除

  • unset:unset 删除变量,不需要加$例如
value=9
echo "$value1"
unset value1
echo "value1"

输出为:9空
unset删除变量,删除的变量默认为空

只读变量

  1. readonly value=7,表明这个变量将来不能被重新赋值
  2. readonly修饰的变量不能被unset删除

字符串相关处理方法

  1. 计算字符串长度
 value="hello"
length=${#value}
echo "${length}"
  1. 字符串拼接
value1="hello"
value2="world"
value3="${value1} ${value2}"
echo "${value3}"

3.字符串截取

value1="hello world"
value2=${value1:6:5} 
#字符串从0开始,:6代表从0开始数到第6位开始裁,:5为截取的长度

printf

value="hello"
printf "value=%s\n" 
"${value}"

  • 用法:printf是输出""里面的内容;
    %s:是一个占位符,严格意义上来说是输出字符串类型的
  • %f:是一个占位符,后面必须是小数类型的数值占位
  • %d:是一个占位符,后面必须是整数类型的数值占位
  • %c:是一个占位符,后面必须是字符类型的数值占位
  • \n:转义字符
  1. 如果想用printf同时输出多个变量的值
value="hello"
value1=8
printf "value=%s\nvalue1=%d\n" "${value}" "${value1}"
  1. %.3f:表明小数点后面保留3位
  2. %6.3f:6表明整个数据所占宽度为6个字
  3. %m.nf:右对齐
  • 如果m<=n+1+整数实际所占个数,m无效
  • 如果m>n+1+整数实际所占个数,m才会出现一定的效果
  1. %-m.nf:左对齐
  2. %md:
  3. %ms:
  4. %mc:

read

printf  "请输入一个值"
read value
printf "这个值为%s\n" "${value}"
  1. 用法:键读入一个值,赋给read
  2. 注意:read尽量不要使用同时输入多个值,比如read value1 value2

运算符

  1. 算数运算+ - * / %
  • 注意点:expr是计算整数类型行的数据
  • 运算符左右两边都必须要有空格
  • ``和$()都是取结果集
  • 注意乘法*必须要通过转义*,不然出错
num1=1
num2=2
num3=`expr $num1 \* $num2`
echo "${num3}"
num1=1
num2=2
num3=`expr $num1 + $num2`
echo "${num3}"
  • `` 和$()不但可以取整数运算的结果集,还可以去shell命令结果集,比如:result=$(ls),但是两者后都要有expr
  • num1%num2求num1/num2=商……余
num1=1
num2=2
num3=$(expr $num1 % $num2)
echo "${num3}"
  • !:表示取反
echo "请输入一个数:"
read num
if [ ! $num -gt 8 ]
then 
    echo "<=8"
else
    echo ">8"
fi

  • &&:表示并且
  1. 第一种写法
echo "请输入一个数:\n"
read num
if [ `expr $num % 5` == 0 ]&&[ `expr $num % 3`==0 ]
then
    echo "这是3,5的倍数"
else
    echo "这不是3,5的倍数"
fi

  • 用法:事件1&&事件2:事件1成立并且事件2成立,整个事件才成立,否则整个事件不成立
  • 事件1||事件2:两个事件只要有一个事件成立,整个事件就成立
  1. 第二种写法
echo "请输入一个数:\n"
read num
if [[ `expr $num % 5` == 0 && `expr $num % 3`==0 ]]
then
    echo "这是3,5的倍数"
else
    echo "这不是3,5的倍数"
fi

  1. 第三种用法
printf "请输入一个年份:\n"
 read year
 if [ `expr $year % 4` == 0 -a `expr $year % 100` != 0 ] || [ `expr $year % 400` == 0 ] 
 then 
    echo "是闰年"
else
    echo "不是闰年"
fi

  • ||:表示或者

printf "请输入一个年份:\n"
 read year
 if [[ `expr $year % 4` == 0 && `expr $year % 100` != 0 ]] || [ `expr $year % 400` == 0 ] 
 then 
    echo "是闰年"
else
    echo "不是闰年"
fi

let关键字

  • 注意点:用了let之后 , let num3=$num1+$num2是错误的,let num3=num1+num2才是正确的
num1=1
num2=2
let num3=num1+num2
echo "${num3}"

用在哪些的运算符:

  • 算数运算符:+ - * / % ++ --
  • 赋值运算符:+= -= *= /= %=
  1. 后缀++
num1=1
let num3=num1++
echo "${num3}"
echo "${num1}"
  • 结果为:1 2
  1. 前缀++
num1=1
let num3=++num1
echo "${num3}"
echo "${num1}"
  • 结果为:2 2
  1. 后缀--
num1=1
let num3=num1--
echo "${num3}"
echo "${num1}"
  • 结果为:1 0
  1. 前缀--
num1=1
let num3=--num1
echo "${num3}"
echo "${num1}"
  • 结果为: 0 0

整数之间的关系运算符

  • < > >= <= != ==
  1. 在关系运算符中,运算的结果是一个逻辑值,如果关系表达式成立,逻辑值为1;否则为0
  2. <, > ,>= ,<=都必要用\进行转义
  3. !=可以用\进行转义,也可不用\转义
num1=1
num2=2
num3=`expr $num1 != $num2`
echo "${num3}"
  • 结果为1
  1. = ,\ =,\ ==, ==(根据编译器决定)maco0s支持=,\ =

条件语句

  • 如果一个数大于5,然后输出这个数,否则 如果这个数小于五,然后说明这个数小5
if[]
then
    语句体;
fi
  • 注意点:[]左右两边都要有空格
  • 关系运算符用-gt...表示
printf "请输入一个数"
read num
if [ $num -gt 5 ]
then
    echo "${num}"
fi
  • -gt:>
  • -ge:>=
  • -lt:<
  • -le:<=
  • -eq:==
  • -ne:!=
  • 字母含义
  • g:greater
  • t:then
  • e:equal
  • n:not
if []
then
    语句体1
elif []
then
    语句体
fi
if []
then 
    语句体1
elif []
then
    语句体2
else
    语句3
fi
  1. 注意点:else可以没有,如果有else,必须放在最后面,else下是没有then
  2. elif可以没有,必须放在if else中间任何位置
  3. if语句只能执行一个分支
  4. if的结束标志fi

字符串运算符

  • =判断字符串是否相等
  • !=判断字符串是否不相等
  • -z:zero,判断字符串是否为空(没有字符)或着是不存在或者字符都是空格
printf "请输入两个整数:"
read num1
read num2
if [ $num1 -gt $num2 ]
then 
    printf "最大值为%s\n" "${num1}"
else
    printf "最大值为%s\n" "${num2}"
fi
string1="hello"
if [ -z $string1 ]
then 
    echo "字符串为空"
else
    echo "字符串不为空"
fi
  • 结果为不为空

文件运算符

  • -d:表示判断是否是目录文件
  • -f:表示判断是否是普通文件
  • -r:判断文件是否可读
  • -w:判断文件是否可写
  • -x:判断文件是否可执行
  • -e:判断文件是否存在
file="1.sh"
if [ -d $file ]
then
    echo "目录文件"
else
    echo "不是目录文件"
fi

结果是:不是目录文件

file="1.sh"
if [ -f $file ]
then
    echo "是普通文件"
else
    echo "不是普通文件"
fi
  • 结果为普通文件
file="11"
if [ -f $file ]
then
    echo "是普通文件"
else
    echo "不是普通文件"
fi
  • 结果为不是普通文件
file="1.sh"
if [ -e $file ]
then
    echo "存在"
else
    echo "不存在"
fi
  • 结果为存在
file="share"
if [ -e $file ]
then
    echo "已存在这个目录文件"
else
    cd
    mkdir "share"
fi

case

case 变量 in
值1))
    语句体
;;
值2))
    语句体
;;
esac

echo "请输入一个值"
read num
case $num in
1)
    echo "1"
;;
2)
    echo "2"
;;
*)
    echo "其他"
esac

  1. 注意点:结束标志必须是esac
  2. 值1)和值2)可以相同
  3. 如果值1)和值2)条件都不满足,这是会来到*)
  4. *) 你可以不写,但是如果要写就写在最后
  5. 没一个分支结束之后都有一个 ;;

数组

  1. 数组初始化:一个变量一个变进行初始化
array1[0]=8
array1[1]=9
  • 注意点:一个一个变量进行初始化,可以间隔赋值还可以不从位置0开始.比如
array1[1]=7
array1[5]=8

  1. 整体数组赋值
  • array={1 2 3 4 hello}
  1. 数组元素访问
  • ${数组名[下标]}
  1. 遍历数组名里面所有的元素
  • ${数组命[*]
  • ${数组名[@]}

while循环

while []
do
    语句体
done


sum=0
i=1
while [ $i -le 100 ]
do
    let sum=sum+i
    let i++
done
echo "sum=${sum}"

  • sum为5050,i为101
  1. 求1~100的偶数和
sum=0
i=1
while [ $i -le 100 ]
do
    if [ `expr $i % 2` -eq 0 ]
    then
        let sum=sum+i
    fi
    let i++
done
echo "sum=${sum}"

  • 结果为sum=2550
  1. 练习2:9x9乘法表
i=1
j=1
while [ $i -lt 10 ]
do 
   j=1
   while [ $j -le $i ]
   do
       let k=i*j
       printf "%d*%d=%2d "   "${i}" "${j}" "${k}"
       let j++
   done
   printf "\n"
   let i++
   
done

  1. 练习3:输入两个整数和一个运算符,根据运算符计算结果
printf "请输入两个整数:"
printf "请输入运算符:"
read num1
read num2
read ch
case $ch in
"*")
    printf "%d*%d=%d" "${num1}" "${num2}" "$((num1*num2))"
;;
"/")
    printf "%d/%d=%d" "${num1}" "${num2}" "$((num1/num2))"
;;
"+")
    
    printf "%d+%d=%d" "${num1}" "${num2}" "$((num1+num2))"
;;
"-")    
    printf "%d-%d=%d" "${num1}" "${num2}" "$((num1-num2))"
;;
*)
    printf "其他字符\n"
    
esac

参数

  • ./xx.sh
  1. $0:代表执行的文件./xx.sh
  2. $1:代表执行的第一个参数
  3. $2:代表执行的第二参数
  4. $n:代表执行的第二个参数
  5. $#:代表执行参数个数,不包括命令本身
  1. 判断是否有参数,参数是否为1
  2. 判断文件是否存在
  3. 如果存在,判断文件是否是普通文件
  4. 改权限
    4.运行
  5. 让这个命令在全局有效

for循环

  1. 格式
for 变量 in 参数列表
do
    
done

  • 用法解释:参数列表为变量一次一次的赋值
value=`ls`
for file in $value
do 
    echo "${file}"
done


for value in 1 2 3 4 5
do 
    echo "${value}"
done

break

  • break:是跳出整个循环
i=1
sum=0
while [ $i -le 100 ]
do
    if [ $sum -gt 55 ]
    then
        break
    fi
    let sum+=i
    let i++
done
echo "sum=${sum}"
echo "i=${i}"

  • 结果为:sum=66,i=12
  • 分析:当i=11,sum>55,不成立sum=55
    sum=sum+i,sum=55+11 ,i=12
  1. 用法:当碰到break时,直接跳出循环,break下面的语句不会被执行
  2. break只跳出最近的一循环
  3. break只能用在循环中
count=0
while [ $count -le 1 ]
do
    i=1
    sum=0
    while [ $i -le 100 ]
    do
        if [ $sum -gt 55 ]
        then
            break
        fi
        let sum+=i
        let i++
    done
    let count++
    echo "sum=${sum}"
    echo "i=${i}"
done

  • 结果为 sum=66,i=12;sum=66,i=12

continue

i=1
sum=0
while [ $i -le 20 ]
do
    if [ `expr $i % 10 ` == 3 ]
    then
        let i++
        continue
    fi
    let sum+=i
    let i++
done
echo "sum=${sum}"
  • 分析:i=3时,i条件成立,执行continue,那么continue以下的语句就不被执行,继续返回到while判断的语句看条件是否成立,如果成立继续执行
  1. 用法:当碰到continue时,跳出本层循环的当前一次循环continue以下面的语句不会被执行
  2. continue只能用循环中

你可能感兴趣的:(shell基础知识)