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只能用循环中
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 219,701评论 6 508
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,649评论 3 396
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 166,037评论 0 356
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,994评论 1 295
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 68,018评论 6 395
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,796评论 1 308
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,481评论 3 420
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,370评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,868评论 1 319
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 38,014评论 3 338
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,153评论 1 352
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,832评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,494评论 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,039评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,156评论 1 272
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,437评论 3 373
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,131评论 2 356

推荐阅读更多精彩内容

  • 0.linux启动的步骤 设备加电----》BIOS自检-----》grub引导启动-----》加载内核----》...
    萌面大叔2阅读 779评论 0 1
  • 一、shell脚本介绍 1.1 开头(环境使用shebang机制) #!/bin/bash 必须写在文件首行 符号...
    优果馥斯阅读 3,299评论 0 1
  • 什么是linux linux可以为我们做什么 打游戏下软件听音乐 系统服务器 连接Internet 网络使用lin...
    帅碧阅读 1,005评论 1 6
  • 个人学习批处理的初衷来源于实际工作;在某个迭代版本有个BS(安卓手游模拟器)大需求,从而在测试过程中就重复涉及到...
    Luckykailiu阅读 4,727评论 0 11
  • 自我控制,不要捆绑,不要束缚,共性和吸引才是长久的相处之道20160111
    马女阅读 117评论 0 0