12-Shell脚本_练习

变量 :
  • 使用变量时, 必须在变量名前加$
  • 用户自定义变量 :
    • 没有数据类型和存储类型
    • 直接定义使用, 在定义时必须赋值
    • 在 = 的左右两端不要出现空格符
    • 如果值出现空格, 需要使用" "
  • echo $var : 不关心不可见字符
  • echo "$var" : 原样输出
*exit : 退出 , 结束
* 一条命令的输出结果作为值赋给变量时, 需要使用 ` ` (命令置换符)
vi 分屏 :
  • 处于vi界面; 在底行模式 vsp 文件名
  • 注意文件必须在当前路径下, 文件名个数只能为一个.
  • 在命令行, vi -o 文件名....
  • vi -O 文件名
位置变量 :
  • $? : 获取上一条命令的执行状态,
  • 0 : 代表执行成功 , 1或者其他非零值:失败或者出错
输入 : read 变量定义
输出 : echo 变量引用
数据运算 :
  • expr : + - *(乘法运算符) / %
  • 在使用expr命令进行运算时, 在运算符左右两端至少有一个空格符存在
  • expr $num1 + $num2 ==== ((num1 + num2))
test 语句 :
  • 字符串 整数 文件属性
  • 字符串 : =
  • test 字符串1 =或者!= 字符串2 === [ 字符串1 =或者!= 字符串2 ]
  • 注意 : 在[ 的右端 和 ] 的左端 至少有一个空格符存在 .
  • test 数字1 选项 数字2
  • 两条test语句时, 用&& 表示与 ; 用 || 表示 或
  • 一条test语句时, 用-a 表示与 ; 用 -o 表示 或
获取测试结果, $? 0 : 成立 1 : 不成立
条件 :

-eq (等于)

-ne (不等于)

-gt (大于)

-ge (大于等于)

-lt (小于)

-le (小于等于)

文件属性 :
test 选项 文件名

-r

-w

-x

-d

-f

-e

结构性语句:
if 语句  
then
    命令列表
fi
if 命令
then
    命令列表1
else if
then
    命令列表2
else
    命令列表n
fi
fi
case 变量的引用 in
    模式1)      # 允许 模式1 | 模式2 | 模式3) 的使用.
        命令列表1
        ;;      #  注意: ;;不能够省略, 作用强制跳出case语句的执行.
    模式2)
        命令列表2
        ;;
    模式3)
        命令列表3
        ;;
        *)      # 注意 \* 出现的位置.
        命令列表n
        ;;      # 处于case语句结尾的;; 可以省略
esac

循环 :

执行: 变量从单词表中取出单词, 每取一次,循环执行一次;直到所有单词被依次取一遍结束, 循环结束.
while 命令
do
    命令列表
done

while :
do
    命令列表
done    # 死循环 , : 不能够省略

until


for 变量的定义 in  单词表
do
    命令列表
done

for 变量的定义
do
    命令列表
done     
单词表部分有命令行输入 , 此时for循环执行次数由命令行传入参数个数决定.
break : 支持跳出多层循环.
continue : 支持结束多层循环的当前次循环.

函数

  • 函数 : 没有返回值类型 以及 参数类型
  • 在函数体内部没有 return 语句
function fun()   # function 可以省略不要
{
    命令列表
}
  • 函数使用:

  • fun

  • 或者

  • info=`fun`

  • echo $info

  • 局部变量 : local 变量名

  • 在函数体内部有return语句,如果返回的为整数, 其取值范围在 0 ~ 255

  • 函数使用:

fun
echo $?


fun
var=$?
echo $var

练习 :

1.在家目录下创建文件夹 file_dir 和 dir_dir , 创建前, 判断文件夹file_dir 和 dir_dir 是否存在 ; 存在, 删除重新创建; 不存在, 直接创建 , 输入一个字符串, 当作目录文件进行处理;判断输入是否为目录文件, 不是-> 报错退出; 是->把该目录下的目录文件、普通文件分别拷贝到 dir_dir 、file_dir ; 并且统计目录文件以及普通文件的个数.
#!/bin/bash  

if [ -e $HOME/file_dir ]
then
    rm -rf $HOME/file_dir
fi

if [ -e $HOME/dir_dir ]
then
    rm -rf $HOME/dir_dir
fi

mkdir $HOME/file_dir
mkdir $HOME/dir_dir

echo -n "请输入一个目录名 : "
read dirname

num1=0
num2=0
if [ -d $dirname ]
then
#   cd $dirname
    str=`ls $dirname`
    for var in $str
    do
        if [ -f $dirname/$var ]
        then
            cp $dirname/$var $HOME/file_dir
            ((num1++))
        else if [ -d $dirname/$var ]
        then
            cp -a $dirname/$var $HOME/dir_dir
            ((num2++))
        else
            echo "该文件为其他类型, 不做处理"
        fi
    fi
done
else
    echo "该文件不存在或者不是目录文件"
fi

echo "该目录下普通文件个数为: $num1"
echo "该目录下目录文件个数为: $num2"
2.check_user : 检查获取到的用户(/etc/passwd)是否存在, 存在,返回用户信息所在的行号; 不存在, 返回 0 , show_user : 获取check_user返回的行号, 并显示出对应用户的信息(用户名, UID,GID) , 循环获取输入, 判断用户是否存在 (调用 check_user 函数) ; 如果存在, 显示其信息 (show_user) ; 不存在, 提示, 重新输入 , 直到输入的为 quit ; 程序结束.
#!/bin/bash  

function check_user()
{
    eist=`cat /etc/passwd | cut -d ':' -f 1 | grep "^$1$" -n | cut -d ":" -f 1 | wc -l`
    if [ $eist -eq 0 ]
    then
        return 0
    else
        line=`cat /etc/passwd | cut -d ":" -f 1 | grep "^$1$" -n | cut -d ":" -f 1`
        return $line
    fi
}

function show_user()
{
    info=`cat /etc/passwd | head -$1 | tail -1 | cut -d ":" -f 1,3,4`
    echo "$info"
}
while :
do
    echo -n "请输入一个用户名 : "
    read username

    if [ $username = "quit" ]
    then
        break
    fi
check_user $username
ret=$?

if [ $ret -eq 0 ]
then
    echo "该用户不存在, 请重新输入"
    continue
fi

show_user $ret
done
3.输入一个成绩(0 ~ 100), 90 ~ 100 A , 80 ~ 90 B , 60 ~ 80 C , 60 以下 NO PASS
#!/bin/bash  

echo -n "请输入一个成绩: "
read score

if [ $score -gt 100 -o $score -lt 0 ]
then
    echo "输入有误"
    exit
fi

if [ $score -ge 90 -a $score -le 100 ]
then
    echo A
else if [ $score -ge 80 ]
then
    echo B
else if [ $score -ge 60 ]
then
    echo C
else
    echo "NO PASS"
fi
fi
fi
4.输入一个字符串, 当作文件名进行处理 判断文件是否存在, 不存在, 报错退出 exit ;如果存在, 判断该文件是否为普通文件, 是 ; 打印提示信息 不是, 继续判断是否为目录文件, 是 , 打印 delete it ? [ y | n] 获取输入, y -> 删除文件夹, n -> 不删除文件夹 , 其他字符 , 报错退出.
#!/bin/bash  

echo -n "请输入一个文件名 : "

read fname

if [ ! -e $fname ]
then
    echo "该文件不存在"
    exit
else if [ -f $fname ]
then
    echo "该文件为普通文件"
else if [ -d $fname ]
then
    echo -n "delete it ? [y | n]"
    read ans
    if [ $ans = "y" ]
    then
        rm -rf $fname
    else if [ $ans = "n" ]
    then
        echo "该文件不需要删除"
    else
        echo "输入有误"
        exit
    fi
fi
else
    echo "该文件为其他类型文件"
fi
fi
fi
5.在家目录下创建文件夹: dir 把/etc/passwd 和 /etc/group 拷贝 到 dir中 ; 备份文件夹dir 为 dir_bak ; 打包压缩文件夹 dir_bak 为 dir_bak.tar.gz ; 把dir_bak.tar.gz 复制到 / , 删除文件夹 dir
cd

mkdir dir

cp /etc/passwd dir
cp /etc/group dir

cp -a dir dir_bak

tar -czvf dir_bak.tar.gz dir_bak

sudo cp dir_bak.tar.gz /

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

推荐阅读更多精彩内容

  • 个人学习批处理的初衷来源于实际工作;在某个迭代版本有个BS(安卓手游模拟器)大需求,从而在测试过程中就重复涉及到...
    Luckykailiu阅读 4,670评论 0 11
  • Ubuntu的发音 Ubuntu,源于非洲祖鲁人和科萨人的语言,发作 oo-boon-too 的音。了解发音是有意...
    萤火虫de梦阅读 99,093评论 9 467
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,566评论 18 139
  • linux资料总章2.1 1.0写的不好抱歉 但是2.0已经改了很多 但是错误还是无法避免 以后资料会慢慢更新 大...
    数据革命阅读 12,127评论 2 34
  • 曾一度念念故宫,庭院,房间,台阶,物件…我若拥有是何等霸气和自由。拥有是多么奢华之事,这里物之形成,人之归顺,谈何...
    晨晓静和阅读 227评论 0 0