当前位置: 首页 > news >正文

[SHELL]shell scripts笔记(1)

自己没事总结了点基础的东西,以备不时之需。


一.判断式:

1.判断符号 &&及||

检测test是否存在:

# test -e /haha

注:test是一个判断文件属性的命令,-e参数判断目录是否存在,执行结果不会显示任何信息,但最后我们可以透过$?或&&及||来展现整个结果

例如:

# test -e /haha && echo "exist" ||echo "not exist"

注: -f参数判断是否为文件,-d判断是否为目录


实例:

1).让使用者输入一个文件名,判断这个文件名是否存在,若不存在给予一个filename does not exist的信息,并中断程序。

2).若这个文档存在,则判断他是文档还是目录,结果输出filename is regular file 或 filename is directory

3).判断执行者对这个文件或目录所拥有权限,并输出权限目录:

# vi sh05.sh

--------------------

#!/bin/bash

PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin

export PATH

# 判断是否输入字符串:

echo -e "Please input a filename,I will check the filename's type and permission. \n\n"

read -p "Input afilename:"filename

test -z $filename && echo "You must input a filename." && exit 0

# 判断文件是否存在,若不存在则提示并退出

test ! -e $filename && echo "The filename `$filename` do not exist" && exit 0

# 判断文件类型和属性:

test -f $filename && filetype="regulare file"

test -d $filename && filetype="directory"

test -r $filename && perm="readable"

test -w $filename && perm="$perm writable"

test -x $filename && perm="$perm executable"

# 输出信息:

echo "The filename:$filename is a $filetype"

echo "And the permissions are:$perm"


--------------------


2.判断符号[]

判断$HOME变量是否为空:

# [ -z "$HOME" ];echo $?

注: 中括号因为用在很多包括通配符,正则表达式中,所以用在shell判别式时,为了与其他用法区分,必须在括号两端用"空格"间隔。


判断两个变量是否相同

# [ "$HOME" == "$MAIL" ]


实例

1.当执行一个程序时,程序会让用户选择Y或N

2.如果用户输入Y或y时,就显示OK continue

3.如果用户输入n或N时,显示oh,interrupt!

4.如果输入其他字符,就显示 I don't know what fucking your choice is


利用[] && ||实现

# vi sh06.sh

---------------------

#!/bin/bash

PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin

export PATH


read -p "Please input (Y/N):" yn

["$yn" == "Y" -o "$yn" == "y" ] && echo "OK,continue" && exit 0

["$yn" == "N" -o "$yn" == "n" ] && echo "oh,interrupt!" && exit 0

echo "I don't know what fucking your choice is" && exit 0


----------------------


传参:


实例:

1.程序文件名为何?

2.共有几个参数?

3.若参数个数小雨2则告知使用者参数数量太少

4.全部的参数为何?

5.第一个参数为何?

6.第二个参数为何?


# vi sh07.sh

---------------------

#!/bin/bash

PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin

export PATH


echo "The script name is   ==> $0"

echo "Total parameter number is    ==> $#"

[ "$#" -lt 2 ] && echo "The number of parameter is less than 2. Stop here." && exit 0

echo "Your whole parameter is ==> $@"

echo "The 1st parameter  ==> $1"

echo "The 2st parameter  ==> $2"


----------------------


条件判断:


利用if...then


sh06修改版:

# vi sh08.sh

---------------------

#!/bin/bash

PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin

export PATH


read -p "Please input (Y/N):" yn

if [ "$yn" == "Y" ] || [ "$yn" == "y" ];then

        echo "OK,continue"

        exit 0


       elif [ "$yn" == "N" ] || [ "$yn" == "n" ]; then

         echo "oh,interrupt!"

         exit 0


       else

       echo "I don't know what fucking your choice is"

       exit 0

       fi

fi

----------------------


实例1:

1.判断$1是否为hello,如果是,显示 hello,how are you?

2.如果没加参数,提示用户必须使用参数

3.如果加入的参数不是hello,就提示用户只能用hello作为参数


# vi sh09.sh

---------------------

#!/bin/bash

PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin

export PATH


if [ "$1" == "hello" ];then

echo "Hello,how are you?"

elif [ "$1" == "" ];then

echo "You must input parameters,example:{$0 someword}"

else

echo "The only parameter is 'hello',example:{$0 hello}"

fi


---------------------


实例2:

判断主机常见21,22,25,80是否开启

# vi sh10.sh

---------------------

#!/bin/bash

PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin

export PATH


PORT=$(netstat -tunl |grep "$1"| sed -n '1p' | awk '{print $4}'| sed 's/^.*://g')

VAR=$(echo "$1" |bc 2>/dev/null)


if [ "$1" == "" ]; then

       echo "Please input a port.example:{sh $0 80}"

       elif [ "$VAR" != "$1" ];then

       echo "Please input the right port.example:{sh $0 80}"

       elif [ "$PORT" == "21" ];then

       echo "ftp is running in your system"

       elif [ "$PORT" == "22" ];then

       echo "ssh is running in your system"

       elif [ "$PORT" == "25" ];then

       echo "smtp is running in your system"

       elif [ "$PORT" == "80" ];then

       echo "www is running in your system"

       else

       echo "the port:$1 is not running"

fi


----------------------


利用if...esac判断


sh09修改版:


# vi sh11.sh

---------------------

#!/bin/bash

PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin

export PATH


case $1 in

"hello")

       echo "Hello,how are you?"

       ;;

"")

       echo "You must input parameters,example:{sh $0 someword}"

       ;;

*)

       echo "Usage:{sh $0 hello}"

       ;;

esac

---------------------


实例2:


# vi sh12.sh

---------------------

#!/bin/bash

PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin

export PATH


case $1 in

 "one")

echo "Your choice is ONE"

;;

 "two")

echo "Your choice is TWO"

;;

 "three")

echo "Your choice is "THREE"

;;

  *)

echo "Usage $0 {one|two|three}"

esac

---------------------


function功能


实例1:


# vi sh13.sh

---------------------

#!/bin/bash

PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin

export PATH


function printit(){

echo -n "Your choice is" # -n表示不断行在同行显示

}


echo "This program will print your selection!"


case $1 in

 "one")

printit;echo $1 | tr 'a-z' 'A-Z' # 将参数做大小写转换

;;

 "two")

printit;echo $1 | tr 'a-z' 'A-Z'

;;

 "three")

printit;echo $1 | tr 'a-z' 'A-Z'

;;

  *)

echo "Usage $0 {one|two|three}"

;;

esac


--------------------------


实例1变种:


# vi sh14.sh

---------------------

#!/bin/bash

PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin

export PATH


function printit(){

echo  "Your choice is $1"

}


echo "This program will print your selection!"


case $1 in

 "one")

printit 1 # printit 后可接参数

;;

 "two")

printit 2

;;

 "three")

printit 3

;;

  *)

echo "Usage $0 {one|two|three}"

;;

esac


--------------------------



while do done,until do done(不定循环)


# vi sh15.sh

---------------------

#!/bin/bash

PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin

export PATH


while [ "$yn" != "yes" -a "$yn" != "YES" ]

do

       read -p "Please input yes/YES to stop this program:" yn

done

echo "OK,you input the correct answer."

----------------------


# vi sh16.sh

---------------------

#!/bin/bash

PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin

export PATH


until [ "$yn" == "yes" -o "$yn" == "YES" ]

do

       read -p "Please input yes/YES to stop this program:" yn

done

echo "OK,you input the correct answer."

----------------------


计算1+2+...+100=?


# vi sh17.sh

---------------------

#!/bin/bash

PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin

export PATH


s=0

i=0


while [ "$i" != "100" ]

do

i=$($i+1)

s=$($s+$i)

done

echo "The result of '1+2+3+...+100'=" $s

-----------------------


for...do...done (固定循环)


# vi sh18.sh

---------------------

#!/bin/bash

PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin

export PATH


for animal in dog cat elephant

do

echo "There are ${animal}s..."

done

---------------------


# vi sh19.sh

---------------------

#!/bin/bash

PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin

export PATH


users=$(cat /etc/passwd | awk 'BEGIN {FS=":"} {print $1}')


for username in $users

do

id $username

# finger $username

done

---------------------


实例1:

利用for循环ping网内主机状态


# vi sh20.sh

---------------------

#!/bin/bash

PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin

export PATH


network="172.24.30"

for host in $(seq 1 254)

 do

       ping -c 1 -w 1 ${network}.${host}&> /dev/null && result=1 || result=0


 case "$result" in

   "1")

       echo "Server ${network}.${host} is UP."

       ;;

   "0")

       echo "Server ${network}.${host} is DOWN."

       ;;

 esac

done

-----------------------


实例2:

让用户输入某个文件名,找出该目录内的文件名的权限


# vi sh21.sh

---------------------

#!/bin/bash

PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin

export PATH


read -p "Please input a directory:" dir

if[ "$dir" == "" -o ! -d "$dir" ];then

echo "The $dir is NOT exist in your systemn."

exit 1

fi


filelist=$(ls $dir)

for filename in $filelist

do

perm=""

test -r "$dir/$filemane" && perm="$perm readable"

test -w "$dir/$filename" && perm="$perm writable"

test -x "$dir/$filename" && perm="$perm executable"

echo "The file $dir/$filename's permission is ${perm}."

done

-----------------------


# vi sh22.sh

---------------------

#!/bin/bash

PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin

export PATH


read -p "Please input a number,I will count for 1+2+..+{your_input}:" nu


s=0

for((i=1;i<=$nu;i=i+1))

do

       s=$(($s+$i))

done

echo "The result of '1+2+3+...+$nu' is ===> $s"

----------------------


debug


# sh -x sh22.sh


习题

建立一个script,当你执行script时,该script可以显示:

1.你目前的身份(whoami)

2.你锁在目录


# vi test01.sh

---------------------

#!/bin/bash

PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin

export PATH


echo -e "Your name is $(whoami)"

echo -e "The current directory is $(pwd)"

---------------------


让用户输入一个数字,程序可以由1+2+3+....一直累加到用户输入的数字为止


# vi test02.sh

---------------------

#!/bin/bash

PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin

export PATH


read -p "Please input a number,I will count for 1+2+...+{your_input}:" nu


s=0

for (( i=1;i<=$nu;i=i+1 ))

do

       s=$(($s+$i))

done


echo "The answser of "1+2+...+$nu =" $s"

---------------------


写一个程序

1.先查看/root/test/logical这个文件是否存在

2.若不存在,则建立一个文档,使用touch建立,建立完成后离开

3.如果存在,判断是否为文件,若为文件则删除后建立一个目录,名为logical,之后离开

4.如果存在,则移除此目录

# vi test02.sh

---------------------

#!/bin/bash

PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin

export PATH


cd /root/test

if [ ! -e logical ];then

       touch logical

       echo "Just make a file logical"

       exit 1

elif [ -e logical ]&&[ -f logical ];then

       rm -rf logical && mkdir logical

       echo "Just make a directory logical"

       exit 1

elif [ -e logical ]&&[ -d logical ];then

       rm -rf logical

       echo "Just delete a directory logical"

       exit 1

fi

-----------------------


写一个程序,将/etc/passwd的第一栏取出,而每一栏都以一行字符串[The 1 account is "root"]来显示,那个1表示行数。


# vi test04.sh

---------------------

#!/bin/bash

PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin

export PATH


var=$(cat /etc/passwd | awk 'BEGIN {FS=":"} {print $1}')


for account in $var

do

declare -i i=$i+1

echo "The $i account is $account"

done


---------------------

----------------------

#!/bin/bash

awk 'BEGIN {FS=":"} {printf "The %s account is %s\n",NR,$1}' /etc/passwd

----------------------

----------------------

#!/bin/bash

awk 'BEGIN {FS=":"} {print "The " NR " account is "$1}' /etc/passwd

----------------------



     本文转自 showerlee 51CTO博客,原文链接:http://blog.51cto.com/showerlee/1243751,如需转载请自行联系原作者


相关文章:

  • 我所认识的git
  • Jmeter入门--性能测试实战
  • 缓存导致上线后,访问404
  • 学习笔记TF060:图像语音结合,看图说话
  • Win server 2012 R2 文件服务器--(二)权限设置
  • Ubuntu14.04下编译安装或apt-get方式安装搭建Apache或Httpd服务(图文详解)
  • 链接静态库的顺序问题
  • 设计模式命令
  • 垃圾回收机制及析构器原理解析
  • 基于Maven管理的JavaWeb项目目录结构参考
  • Excel Interactive View - 让页面表格的功能更强大
  • Nginx 错误集合
  • perl模块Net::SCP::Expect批量下发文件
  • Exchange部署与管理体系结构
  • 傲游云浏览器测评
  • [数据结构]链表的实现在PHP中
  • 【附node操作实例】redis简明入门系列—字符串类型
  • input实现文字超出省略号功能
  • JS题目及答案整理
  • node入门
  • Webpack 4 学习01(基础配置)
  • 基于Android乐音识别(2)
  • 警报:线上事故之CountDownLatch的威力
  • 如何用vue打造一个移动端音乐播放器
  • 使用Tinker来调试Laravel应用程序的数据以及使用Tinker一些总结
  • 看到一个关于网页设计的文章分享过来!大家看看!
  • Salesforce和SAP Netweaver里数据库表的元数据设计
  • 如何在 Intellij IDEA 更高效地将应用部署到容器服务 Kubernetes ...
  • ​【C语言】长篇详解,字符系列篇3-----strstr,strtok,strerror字符串函数的使用【图文详解​】
  • ​【已解决】npm install​卡主不动的情况
  • #NOIP 2014#Day.2 T3 解方程
  • (1/2) 为了理解 UWP 的启动流程,我从零开始创建了一个 UWP 程序
  • (12)Linux 常见的三种进程状态
  • (2)(2.10) LTM telemetry
  • (八)五种元启发算法(DBO、LO、SWO、COA、LSO、KOA、GRO)求解无人机路径规划MATLAB
  • (附源码)springboot社区居家养老互助服务管理平台 毕业设计 062027
  • (九十四)函数和二维数组
  • (蓝桥杯每日一题)平方末尾及补充(常用的字符串函数功能)
  • (离散数学)逻辑连接词
  • (四)linux文件内容查看
  • (转)【Hibernate总结系列】使用举例
  • (转载)Linux 多线程条件变量同步
  • (轉貼) VS2005 快捷键 (初級) (.NET) (Visual Studio)
  • .equal()和==的区别 怎样判断字符串为空问题: Illegal invoke-super to void nio.file.AccessDeniedException
  • .Family_物联网
  • .Net 访问电子邮箱-LumiSoft.Net,好用
  • .net对接阿里云CSB服务
  • .net获取当前url各种属性(文件名、参数、域名 等)的方法
  • /etc/X11/xorg.conf 文件被误改后进不了图形化界面
  • @FeignClient注解,fallback和fallbackFactory
  • [20171106]配置客户端连接注意.txt
  • [BZOJ4554][TJOI2016HEOI2016]游戏(匈牙利)
  • [C++]C++入门--引用
  • [HNOI2008]水平可见直线
  • [IE编程] 打开/关闭IE8的光标浏览模式(Caret Browsing)